2012-02-17 35 views
5

Có cách nào để chuyển đổi chuỗi đánh dấu thành đối tượng nút trong JavaScript không? Thật sự tôi đang tìm kiếm các subsitute cho:Tạo nút từ chuỗi đánh dấu

document.getElementById("divOne").innerHTML += "<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>" 

cái gì đó như

document.getElementById("divOne").appendChild(document.createNodeFromString("<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>")) 

sử dụng createNodeFromString thay vì tạo ra các yếu tố bảng sau đó nối phần tử con của nó sau đó đính kèm các thuộc tính tương ứng và giá trị của họ!

+1

Tôi tò mò tại sao cài đặt innerHTML không hoạt động cho bạn. Sau khi bạn đặt innerHTML, bạn có thể nhận được phần tử kết quả bằng cách truy vấn divOne của bạn. – akonsu

+0

@akonsu, được cho là bạn có trong divOne và bên ngoài div này bạn có một nút với onclick = innerHTML-method. Bây giờ, trong FF10 và IE9 (với chế độ tài liệu IE9) nhập một cái gì đó trong hộp văn bản và nhấn nút, giá trị của đầu vào sẽ được đặt lại! Tôi đang cố gắng để xem điều tương tự sẽ xảy ra với appendChild. Btw, trong chế độ tương thích IE8, giá trị của phần tử đầu vào là dai dẳng .. –

+0

bạn có nói rằng nếu bạn có trường nhập văn bản và nút, giá trị của trường nhập liệu sẽ bị xóa khi bạn nhấn nút? bạn có thể chứng minh điều này trên, nói, jsbin.com? – akonsu

Trả lời

15

Không có chức năng trình duyệt chéo hiện có cho việc này. Các phương pháp sau đây có thể được sử dụng để đạt được hiệu quả mong muốn (sử dụng một DocumentFragment cho một hiệu suất tối ưu hóa, dựa trên this answer):

function appendStringAsNodes(element, html) { 
    var frag = document.createDocumentFragment(), 
     tmp = document.createElement('body'), child; 
    tmp.innerHTML = html; 
    // Append elements in a loop to a DocumentFragment, so that the browser does 
    // not re-render the document for each node 
    while (child = tmp.firstChild) { 
     frag.appendChild(child); 
    } 
    element.appendChild(frag); // Now, append all elements at once 
    frag = tmp = null; 
} 

sử dụng (indention cho dễ đọc):

appendStringAsNodes(
    document.getElementById("divOne"), 
    "<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>" 
); 
+0

Dandy! Cảm ơn vì giải pháp tuyệt vời này. –

2

Vâng, bạn có thể làm việc đó đi.

var myNewTable = document.createElement("table"); 
myNewTable.innerHTML = "<tbody><tr><td><input type='text' value='0' /></td></tr></tbody>" 
document.getElementById("divOne").appendChild(myNewTable); 
+0

Phiên bản IE cũ hơn sẽ phàn nàn về điều này, vì chúng không thể xử lý việc thiết lập thuộc tính 'innerHTML' trên một số phần tử, bao gồm'

'. Xem thêm [bài viết này] (http://support.microsoft.com/kb/239832). –

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