DCSIMG
JS: טריק לא מוכר לשיפור זמן התגובה של DOM: createDocumentFragment - מאחורי המסך

מאחורי המסך

משה למפרט, על תכנות מתקדם וביצועים ב-Web.

על הבלוג

עוד חדשות

אתרים שיש לי בהם יד ורגל

JS: טריק לא מוכר לשיפור זמן התגובה של DOM: createDocumentFragment

נדמיין לעצמנו את הלולאה הבאה:

var arr=[……];
  
for(var i=0;i<arr.length;i++) {

var d=document.createElement("div");
d.innerHTML=arr[i].html;
document.getElementById("divonpage").appendChild(d);

}

מי מאיתנו לא כתב לולאה כזו או דומה לה בחייו. עכשיו נדמיין מה קורה בפנים:

בכל איטרציה של הלולאה, מחושב מחדש arr.length, אחר כך נוצר div חדש, מתווסף לו תוכן והוא נוסף לדף, מה שמרענן מחדש את התצוגה ואת הטבלאות הפנימיות של הדפדפן.

אני מציע את השינוי הבא, והסברים בהערות:

var arr=[……],len=arr.length; // שמירה של כמות המשתנים במערך
var frag = document.createDocumentFragment(); // עיין בקישור

for(var i=0;i<len;i++) {

var d=document.createElement("div")
d.innerHTML=arr[i].html
frag.appendChild(d) // שמירה "בצד" של מערך מוכן לשימוש

}

// ועכשיו נעדכן את התצוגה של הדפדפן רק פעם אחת
document.getElementById("divonpage").appendChild(frag);

זה נכון שבדפדפנים החדשים יותר יש אופטימיזציות לפתרון בעיות מהסוג הזה, מצד שני, לרוב המוחלט של הגולשים (לפחות בישראל) יש IE6/7 שלא מסתכלים אפילו לכיוון הזה, אז עדיין שווה לעבוד. עובד על כל הדפדפנים מ-IE6 ומעלה (לא בדקתי IE5 וכנופייתו).

פורסם: Nov 29 2009, 10:32 PM by Moshe L | with 3 comment(s)
תגים:, ,

תוכן התגובה

Pini Dayan כתב/ה:

נחמד מאוד

מעניין לשמוע על הזמנים. אשמח אם תבדוק.

# November 30, 2009 7:22 AM

Avi Pinto כתב/ה:

מעניין מאוד,

לא הכרתי את createDocumentFragment, בדרך כלל אני פשוט מוסיף את כל האלמנטים לcontainer יחיד ובסוף מוסיף אותו אל הDOM (ברוב המקרים ל DIV הזה יש גם משמעות נוספת, אך לפעמים הוא סתם נמצא שם וחבל)

# November 30, 2009 12:55 PM

Rotem Bloom כתב/ה:

אחלה של פוסט לא הכרתי את הטריק.

תמשיך להפתיע.

פיני אולי אתה תבדוק לנו את הזמנים? מה אתה אומר!!!!!!

# December 13, 2009 4:43 PM