2010-05-24 23 views
9

những gì là sự khác biệt giữaappendChild + createElement

var div = document.createElement('div');//output -> [object HTMLDivElement] 

document.getElementById('container').appendChild(div); 

var div = '<div></div>'; 

document.getElementById('container').appendChild(div);//output -> <div></div> 

nên không được cả hai là như nhau? và nếu không, làm thế nào để tôi có được phiên bản thứ 2 để làm việc?

Trả lời

17

Sau đó là html thuần túy cho một phần tử trong khi đầu tiên là đối tượng. Đầu tiên, bạn cần appendChild trong khi sau này, bạn cần innerHTML.

không được giống nhau? và nếu không, làm thế nào để tôi có được phiên bản thứ 2 để hoạt động?

var div = '<div></div>'; 
document.getElementById('container').innerHTML = div; 
+6

nếu bạn hài lòng với câu trả lời, bạn nên đánh dấu là đã chấp nhận. lưu ý rằng '+ =' là toán tử gần đúng nhất với hành vi 'append', chứ không phải' = '. –

+0

"Sau đó là html thuần túy ...". Nó chỉ là một chuỗi. – Yay295

2

appendChild được mong đợi một yếu tố nên khi bạn gửi nó văn bản, nó không biết phải làm gì. Bạn có thể muốn xem xét sử dụng thư viện javascript để giảm bớt một số công việc đó, chẳng hạn như jQuery. Mã của bạn sẽ là:

$('#container').append('<div></div>'); 
+2

Có _so_ cần phải là một 'giữ trên, 2 người khác đang gõ câu trả lời ngay bây giờ' tin nhắn khi gõ lên câu trả lời, lol –

+0

trong khi tôi nghĩ rằng nó sẽ là trên cao để bao gồm jquery * chỉ * cho điều này, nó vẫn có thể được lập luận rằng * nếu * OP đã sử dụng jQuery, điều này rất có thể là giải pháp gần nhất với những gì OP muốn, vì vậy tôi nghĩ đó là một lựa chọn xứng đáng, không nên bị mất chỉ vì ai đó đã cung cấp giải pháp rồi. –

3

appendChild thực sự mong đợi một HTMLDomNode của một số loại, chẳng hạn như một HTMLDivElement, và không phải là một chuỗi. Nó không biết làm thế nào để đối phó với một chuỗi. Bạn có thể làm

document.getElementById('container').innerHTML += div; 

nhưng tôi thực sự thích phiên bản đầu tiên; và tôi dựa nhiều hơn vào nó để hành xử giống nhau trên các trình duyệt.

+0

Có bất kỳ nhược điểm nào đối với phương pháp này không? Đó là cách tôi thường đạt được điều này. – SwankyLegg

+0

điều này không được ưa thích vì điều này đã xóa trình xử lý sự kiện và cũng là trạng thái của các phần tử trước đó. – Kurkula

5

Với công cụ JS/DOM của bạn, hãy gọi Element.appendChild với số string làm đối số gây ra nút Text mới sẽ được tạo sau đó được thêm.

Ví dụ đầu tiên của bạn tạo yếu tố <div>. Ví dụ thứ hai của bạn tạo ra một nút văn bản với <div></div> làm nội dung của nó.

ví dụ thứ hai của bạn là tương đương với:

var div = '<div></div>'; 

document.getElementById('container').appendChild(document.createTextNode(div));//output -> <div></div> 

Như Sarfraz Ahmed mentioned in his answer, bạn có thể làm công việc ví dụ thứ hai cách bạn muốn nó hoạt động bằng cách viết:

var div = '<div></div>'; 

document.getElementById('container').innerHTML = div; 
+0

là có thực sự bất kỳ trình duyệt mà đi qua một đối số chuỗi gây ra một nút văn bản mới được tạo ra và thêm vào? trong firefox và chrome, điều này chỉ gây ra một ngoại lệ đối số bất hợp pháp và không có gì được thêm vào: http://jsbin.com/omofo3/edit –

+0

@David Hedlund, tôi đã giải thích hành vi mà người đăng tải đang gặp phải. Tôi đã không kiểm tra bất kỳ trình duyệt (tôi có lẽ nên có). Bạn đúng; điều này có vẻ là một trường hợp ngoại lệ. – strager

1

Giải pháp đơn giản nhất và hỗ trợ tất cả trình duyệt là:

var div = '<div></div>'; 
var parser = new DOMParser(); 
var myDiv = parser.parseFromString(html, "text/xml"); 

Một giải pháp khác có thể là:

var div = '<div></div>'; 
var tmpDiv = document.createElement('div'); 
    tmpDiv.innerHTML = div; 

    elDiv = tmpDiv.childNodes[0]; //Now it can be used as an element 
0

Bạn cũng có thể sử dụng chúng để bổ sung/thêm vào trước một yếu tố để DOM tương ứng:

var elem = document.documentElement.appendChild(document.createElement(element)); 
var elem = document.documentElement.prepend(document.createElement(element)); 

và sử dụng biến elem để nhắm mục tiêu các phần tử (ví dụ):

elem.style.display = "block"; 
elem.style.remove(); 
elem.style.id = ...; 

v.v.

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