15

HTML:

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

JavaScript:

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

電話するとaddUncaught TypeError: Object #<NodeList> has no method 'appendChild'がスローされます。なぜですか?

4

3 に答える 3

24

getElementsByTagName()1つの要素を返すのではなく、配列のようなオブジェクトであるNodeListを返します。基本的には、配列として使用できることを意味します。

したがって、たとえば次のようにすることができます。

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

getElementById()しかし、そのリストにIDが含まれている場合は、単純にを使用してみませんか?IDはドキュメント全体で一意である必要があるため、このメソッドは1つの要素のみを返します。

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

注:関数の外部で使用する場合を除いて、必ずul関数のローカル変数として宣言してください(add)。var

于 2011-12-06T22:06:13.627 に答える
5

document.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 
    }
}
于 2011-12-06T22:06:35.200 に答える
5

あなたが抱えている問題は、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);
}

ページに1つ しかない場合は、属性を使用する(これが望ましい場合があります)、属性をで選択すると、予想どおり、その1つだけが返されることに注意してください。ulgetElementsByTagName("ul")[0] idulgetElementById()id

参照:

于 2011-12-06T22:06:37.690 に答える