appendChild не работает

HTML-код:

<ul id="datalist">
</ul>

JavaScript:

function add(content){
   ul=document.getElementsByTagName("ul");
   var li=document.createElement("li");
   li.innerHTML=content;
   ul.appendChild(li);
}

когда я называю add, Uncaught TypeError: Object #<NodeList> has no method 'appendChild' бросается. Есть идеи почему?

3 ответов


getElementsByTagName() не возвращает один элемент, он возвращает узла массив-как объект. Это в основном означает, что вы можете использовать его как массив.

так что вы могли бы сделать, например:

var ul = document.getElementsByTagName("ul")[0];

но почему бы вам просто не использовать getElementById(), если этот список имеет идентификатор в любом случае? Идентификаторы должны быть уникальными во всем документе, поэтому этот метод возвращает только один элемент.

var ul = document.getElementById('datalist');

Примечание: Пожалуйста, не забудьте объявить ul в качестве локальной переменной для вашей функции (add var), если вы не хотите использовать его вне функции.


документ.getElementsByTagName не возвращает элемент, но возвращает массив элементов.

вам нужно в цикле этот массив или получить какой-то уникальный элемент.

посмотрите эту документацию:https://developer.mozilla.org/en/DOM/element.getElementsByTagName

// check the alignment on a number of cells in a table. 

var table = document.getElementById("forecast-table"); 
var cells = table.getElementsByTagName("td"); 
for (var i = 0; i < cells.length; i++) { 
    var status = cells[i].getAttribute("data-status"); 
    if ( status == "open" ) { 
        // grab the data 
    }
}

проблема в том, что getElementsByTagName() (обратите внимание на множественное число, подразумеваемое " s " в имени функции) возвращает массив узлов DOM, а не одного узла DOM, что и есть appendChild() ожидает работы; поэтому вам нужно определить, с каким из массивов узлов вы хотите работать:

function add(content){
   ul=document.getElementsByTagName("ul")[0]; // the [0] identifies the first element of the returned array
   var li=document.createElement("li");
   li.innerHTML=content;
   ul.appendChild(li);
}

помните, что если есть только один ul на странице вы можете использовать getElementsByTagName("ul")[0] или (и это может быть предпочтительнее) добавить