2013-08-30 11 views
7

używam tego kodu, aby zaktualizować div z żądania AJAXInnerHTML dołączyć zamiast zastąpienia

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

wszystko działa poprawnie, problem jest, że gdy div id some_id ma dużo treści w nim Widzę, że zawartość znika, a następnie pojawia się zaktualizowana po wykonaniu żądania AJAX.

Myślę, że to dlatego,

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

Czy usunięcie i zastąpienie innerHTML z div z poprzednim innerHTML powiększonej o nowe treści, co skutkuje previous content → blank → updated content zachowanie.

Czy istnieje sposób, aby dołączyć nowych treści do div zamiast zastępowania całej zawartości nową?

+0

używasz jQuery lub natywną JavaScript? – Raghu

+1

spróbuj dodać element potomny zamiast zastępować całego html –

+0

@Raghu Używam obu, ale czyste rozwiązanie javascript byłoby dla mnie lepsze – BackSlash

Odpowiedz

11

Zakładając, że htmlhttp.responseText jest węzłem:

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

Jeśli masz tylko ciąg HTML (co wydaje się prawdopodobne), a następnie:

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

Z drugiej strony, jeśli trzeba dołączyć nowe elementy z ciągiem:

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

Referencje:

+0

A jeśli jest to grupa węzłów? – BackSlash

+0

Następnie możesz albo powtórzyć każdy z tych węzłów i wielokrotnie używać 'appendChild()' lub owijać je w jeden węzeł i dołączać * ten * węzeł. Nie widząc (przykładu) tego, co znajduje się w zmiennej 'xmlhttp.responseText', bardzo trudno jest odpowiedzieć na konkretny przypadek użycia. –

+0

Widziałeś aktualizację, a co, jeśli i_must_ dołączyć do bieżącego div bez tworzenia nowego? – BackSlash

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

Czym to się różni od mojego? – BackSlash

5

Można użyć Element.insertAdjacentHTML().

insertAdjacentHTML() analizuje podany tekst jako HTML lub XML i wkładki wynikające z węzłów do drzewa DOM w określonym położeniu. Nie odtwarza elementu, z którego jest używany, a zatem nie uszkadza istniejących elementów wewnątrz elementu. To i unikanie dodatkowego kroku serializacji powoduje, że jest on znacznie szybszy niż bezpośrednia manipulacja wewnętrzna HTML.

Chyba byś zrobił

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