2013-08-30 30 views
7

Tôi đang sử dụng mã này để cập nhật một div với một yêu cầu AJAXinnerHTML thêm thay vì thay thế

var xmlhttp; 
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp = new XMLHttpRequest(); 
} else { // code for IE6, IE5 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     document.getElementById("some_id").innerHTML += xmlhttp.responseText; 
    } 
} 
xmlhttp.open("GET", "http://example.com/"); 
xmlhttp.setRequestHeader('Content-Type', 'utf8'); 
xmlhttp.send(); 

Tất cả mọi thứ hoạt động tốt, vấn đề là khi div với id some_id có rất nhiều nội dung trong đó tôi có thể thấy nội dung biến mất và sau đó xuất hiện được cập nhật sau khi yêu cầu AJAX đã được thực hiện.

Tôi nghĩ rằng đó là vì

document.getElementById("some_id").innerHTML += xmlhttp.responseText; 

là xoá bỏ và thay thế innerHTML của div với innerHTML cộng với nội dung mới trước, dẫn đến một hành vi previous content → blank → updated content.

Có cách nào để nối nội dung mới vào div thay vì thay thế toàn bộ nội dung bằng nội dung mới?

+0

bạn đang sử dụng jquery hoặc javascript mẹ đẻ? – Raghu

+1

cố gắng thêm phần tử con thay vì thay thế toàn bộ html –

+0

@Raghu Tôi đang sử dụng cả hai, nhưng giải pháp javascript thuần túy sẽ tốt hơn cho tôi – BackSlash

Trả lời

11

Giả sử rằng htmlhttp.responseText là một nút:

document.getElementById("some_id").appendChild(xmlhttp.responseText); 

Nếu bạn chỉ có một chuỗi của HTML (mà dường như có khả năng), sau đó:

var newElement = document.createElement('div'); 
newElement.innerHTML = xmlhttp.responseText; 
document.getElementById("some_id").appendChild(newElement); 

Mặt khác, nếu bạn phải nối thêm các phần tử mới từ một chuỗi:

// getting a reference to the relevant element we're adding to: 
var container = document.getElementById("some_id"), 
    // creating a new element to contain the 'xmlhttp.responseText' 
    newElement = document.createElement('div'); 
// setting the innerHTML of the 'newElement' to whatever 'xmlhttp.responseText' is: 
newElement.innerHTML = xmlhttp.responseText; 

/* (repeatedly) removing the firstChild, and appending it to the 'container', 
    of the 'newElement' until it's empty: */ 
while (newElement.firstChild) { 
    container.appendChild(newElement.firstChild); 
} 
// removing the now empty 'newElement': 
newElement.parentNode.removeChild(newElement); 

Tham chiếu:

+0

Và điều gì xảy ra nếu đó là một loạt các nút? – BackSlash

+0

Sau đó, bạn có thể lặp qua từng nút đó và sử dụng 'appendChild()' liên tục hoặc bọc chúng trong một nút và nối thêm * nút * đó. Nếu không thấy (ví dụ về) cái gì trong biến 'xmlhttp.responseText' của bạn thì rất khó trả lời cụ thể để giải quyết trường hợp sử dụng của bạn. –

+0

Thấy bản cập nhật, nếu tôi _must_ nối thêm vào div hiện tại mà không tạo bản sao mới thì sao? – BackSlash

3
old_html = document.getElementById("some_id").innerHTML; 
document.getElementById("some_id").innerHTML = old_html+xmlhttp.responseText; 
+0

Điều này khác với tôi như thế nào? – BackSlash

5

Bạn có thể sử dụng Element.insertAdjacentHTML().

insertAdjacentHTML() phân tích các văn bản quy định dưới dạng HTML hay XML và chèn các nút kết quả vào cây DOM ở một vị trí xác định. Nó không reparse phần tử nó đang được sử dụng và do đó nó không làm hỏng các phần tử hiện có bên trong phần tử. Điều này, và tránh bước thêm serialization làm cho nó nhanh hơn nhiều so với thao tác bên trong HTML trực tiếp.

Tôi đoán bạn sẽ làm gì

const div = document.getElementById("some_id"); 
div.insertAdjacentHTML('beforeend', xmlhttp.responseText);;