2011-12-06 30 views
10

HTML:appendChild Không Working

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

JavaScript:

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

Khi tôi gọi add, Uncaught TypeError: Object #<NodeList> has no method 'appendChild' được ném. Bất kỳ ý tưởng tại sao?

+3

Nếu không có jquery, thì tại sao lại thêm nó làm thẻ cho câu hỏi? –

+0

xin lỗi ,,, Tôi không thực sự biết nơi nó được gắn thẻ với Jquery. các thẻ là javascript và dom. đúng? – bingjie2680

+0

Khi câu hỏi được tạo ra, nó được gắn thẻ với 'jQuery' - Jasper đã chỉnh sửa nó để thay thế bằng' javascript'. –

Trả lời

20

getElementsByTagName() không trả về một phần tử, nó trả về một NodeList, một đối tượng giống như mảng. Về cơ bản nó có nghĩa là bạn có thể sử dụng nó như một mảng.

Vì vậy, bạn có thể làm ví dụ:

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

Nhưng tại sao bạn không chỉ cần sử dụng getElementById(), nếu danh sách đó có một ID anyways? ID phải là duy nhất trong toàn bộ tài liệu, do đó, phương thức này sẽ chỉ trả lại một phần tử.

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

Lưu ý: Hãy chắc chắn để khai báo ul như là một biến địa phương để chức năng của bạn (thêm var), trừ khi bạn có ý nghĩa để sử dụng nó bên ngoài hàm.

+0

khi tôi sử dụng getElementById, giao diện điều khiển đặt 'Uncaught TypeError: Không thể gọi phương thức' appendChild 'của null' – bingjie2680

+0

@ bingije2680 My [jsFiddle] (http://jsfiddle.net/CB9tD/) cho thấy rằng nó hoạt động tốt :). Vui lòng kiểm tra liên kết và nếu bạn vẫn gặp sự cố, hãy tạo một câu chuyện về kịch bản của bạn. – kapa

+0

vi ... có dây ... cảm ơn. – bingjie2680

5

document.getElementsByTagName không trả lại Phần tử, nhưng trả về một mảng các phần tử.

Bạn cần lặp mảng này hoặc nhận một số Phần tử duy nhất.

Look tài liệu này: 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 
    } 
} 
4

Vấn đề bạn có được mà getElementsByTagName() (lưu ý số nhiều ngụ ý bởi 's' trong tên của hàm) trả về một mảng các nút DOM, không một nút DOM duy nhất, đó là những gì appendChild() hy vọng sẽ hoạt động; do đó bạn cần phải xác định các mảng của các nút bạn muốn làm việc với:

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); 
} 

Hãy nhớ rằng nếu chỉ có mộtul trên trang web, bạn có thể sử dụng getElementsByTagName("ul")[0]hoặc (và điều này có thể là một lợi thế) thêm thuộc tính id vào số ul và sau đó chọn thuộc tính đó với getElementById(), theo dự kiến, chỉ trả về một số id.

Tài liệu tham khảo:

Các vấn đề liên quan