Można zwiększyć wydajność, ponownie wykorzystując istniejący węzeł tekstowy.
Element DIV zawierający tylko tekst to element DOM zawierający jeden węzeł potomny, którego typem jest węzeł tekstowy. Treść tekstu jest przechowywana w tym węźle tekstowym, a nie w jego macierzystym elemencie DIV.
Głównym problemem z metod, takich jak .text() w jQuery lub .innerHTML() w HTML DOM, a nawet .innerText() i .textContent(), jest to, że wszystkie one utworzyć nowy węzeł tekstowy (nawet jeśli już istnieje). Dokładniej, wszystkie wyżej wymienione metody zaczynają się od usunięcia węzłów potomnych DOM, w tym ewentualnie istniejącego węzła tekstowego (jest to również realizowane przez implementacje innerHTML, innerText i textContent). Pozostawia to element kontekstu (DIV, w twoim przypadku) pusty, bez żadnych dzieci. Następnie tworzą nowy węzeł potomny typu tekstowego , przypisując do niego nowy tekst i dołączając go do elementu kontekstu. innerHTML ponadto próbuje przeanalizować wejściowy ciąg HTML i skonstruować z niego fragment DOM.
Najszybszy sposób, że wiem na zastąpienie istniejącego węzła tekstu jest następująca:
var divs = $(".divs").get(),
len = divs.length;
while(--len) {
divs[len].firstChild.data = "default";
}
Ta metoda nie tworzy nowy węzeł dziecko, ale po prostu zastępuje tekst istniejącego węzła tekstowego. Oczywiście ta metoda zakłada, że węzeł tekstowy już istnieje. Aby to działało, początkowy dokument może zostać zainicjowany za pomocą niepustego tekstu wewnątrz elementów DIV (i wykluczając wszelkie inne elementy podrzędne).
Ścigasz różnicę wydajności 9 ms? I nie ulega wątpliwości, że jeśli * naprawdę * chcesz, aby było szybkie, zrobiłbyś to z prostym starym JS. Biblioteki ułatwiają rozwój, ale rzadko oferują wzrost wydajności w porównaniu z używaniem kodu waniliowego. – ken
Tak. Ścigam różnicę wydajności 2x. –
Jako ćwiczenie akademickie uważam, że jest to dobre pytanie, ale w przypadku twojego przypadku użycia, myślę, że jesteś daleko poza punktem zmniejszających się zysków. Żaden użytkownik nie zauważy różnicy 9 ms; w tym przypadku żaden użytkownik nie zauważy różnicy 90 ms. – ken