У меня есть функция, в которой я создаю новый элемент в div ("отец-div") и добавляю его к textNode (который содержит содержимое элемента). Это делает свою цель.

function createElement(){
    var son = document.createElement("p");
    var node = document.createTextNode("some random text");
    son.appendChild(node);
    var father = document.getElementById("father-div");
    father.appendChild(son);
    son.id = "son-id";
}

Позже я хочу изменить этот текст (я хочу, чтобы это был ""), поэтому я сделал эту функцию, которая получает идентификатор элемента, который я хочу изменить (пример: предыдущий "son-id", который я создал). Однако я получаю эту ошибку: «Не удается прочитать свойство replaceChild, равное нулю».

function changeContent(elementId){ //examplo elementId="son-id"
    var newText = document.createTextNode('');
    var newChild = document.getElementById(elementId);
    newChild.replaceChild(newText, newChild);
}

Как я могу заставить его делать то, что я хочу, и почему он не распознает elementId?

Inb4 «Использовать innerHTML», я не могу использовать его для этой задачи.

-1
hanuruh 25 Окт 2019 в 01:27
Да, параметры для replaceChild неверны, потому что newChild не может быть дочерним элементом самого себя (см. Документацию), но сгенерированное для этого сообщение об ошибке говорит о том, что" заменяемый узел не является дочерним по отношению к этому узлу. ". Сообщение об ошибке в сообщении создается чем-то еще, что пошло не так, но не показано в сообщении - можете ли вы сделать фрагмент кода, чтобы продемонстрировать, как его воспроизвести?
 – 
traktor
25 Окт 2019 в 02:40

2 ответа

Вы используете неправильный синтаксис

Для замены текстового узла (в данном случае первого) используйте item.childNodes [0]

Где item - это элемент "сын"

function changeContent(elementId){
      var newText = document.createTextNode(' '),
          item = document.getElementById(elementId);
      item.replaceChild(newText, item.childNodes[0]);
}

Я также предлагаю обновить эту функцию и добавить второй аргумент.

function changeContent(elementId, content){
      var newText = document.createTextNode(content),
          item = document.getElementById(elementId);
      item.replaceChild(newText, item.childNodes[0]);
}
0
Mykhailo Nehelia 25 Окт 2019 в 01:42
Использование индексации на дочерних узлах не всегда может давать предсказуемые результаты, вы должны быть уверены, что действительно хотите заменить 0-й элемент.
 – 
Espen
25 Окт 2019 в 01:45
Думаю, вопрос касался только первого var son = document.createElement("p"); var node = document.createTextNode("some random text"); son.appendChild(node);. Да, лучше использовать .innerHTML
 – 
Mykhailo Nehelia
25 Окт 2019 в 01:48
Исходный плакат также должен рассмотреть возможность обертывания текстовых узлов в элементы span и присвоения каждому элементу идентификатора, чтобы они могли быть индивидуально адресованы и обрабатываться предсказуемым образом. Если постеру нужно только стереть весь текст в элементе, следует использовать innerText.
 – 
Espen
25 Окт 2019 в 01:52

Вы пытаетесь запустить замену самого элемента текстовым узлом, это не сработает. Вам действительно стоит использовать innerText;

function changeContent(elementId){ //examplo elementId="son-id"
    let element = document.getElementById(elementId);
    if(element){
        element.innerText = "";
    }
}
0
Espen 25 Окт 2019 в 01:41