Предимства на documentFragment
Търсене във форума |
подробно търсене |
Към страницата. |
По едно време прочетох много статии за documentFragment, но дълго време не можех да разбера какво наистина е готино в него.
След известно време разбрах, че нищо, но нещо е. Нека поговорим за това
Какво е documentFragment?
documentFragment - "фрагмент от документ" е най-близък по смисъл до обикновен DOM елемент.
Тоест можете да го създадете:
към него могат да се добавят други възли.
Номерът е, че когато документен фрагмент се вмъкне в DOM, той изчезва и вместо това се вмъкват неговите деца. Това е единственото и основно свойство на documentFragment в сравнение с всички други DOM обекти.
Тоест можете да добавите много TD към него и след това да добавите към TR. В този случай фрагментът ще се разтвори и TD ще бъдат вмъкнати като директни наследници.
Кога и защо е необходим documentFragment?
Връщане на набор от възли от функция
Първият случай на използване на documentFragment е при връщане на множество възли от функция. Можете да направите това, като върнете масив или можете да върнете documentFragment:
След това външната функция може да го вмъкне в DOM или да го използва допълнително без намеса на масиви.
Бързо вмъкване в DOM
Това е може би най-важният случай.
Да кажем, че трябва да създадем куп TR елементи и да ги вмъкнем в DOM.
Първият начин е да ги създадете и поставите. И така n пъти.
Но вмъкването в "живия" DOM е скъпо. Тук на помощ идва documentFragment. Можете да го вмъкнете в него и едва след това да го добавите към DOM.
Скоростта обаче ще бъде различна.
Всъщност няма значение дали го използвате като отделен DOMконтейнер documentFragment или нещо друго.
Важно е междинните вмъквания да влизат в DOM, откъснат от живия документ.
Например, ето два бенчмарка.
И двамата създават таблица 10x10 чрез попълване на TBODY с TR/TD елементи.
В този случай първият вмъква всичко в документа точно там, вторият забавя вмъкването на TBODY в документа до края на процеса.
Кликнете, за да стартирате.
Какво общо има documentFragment с това? И нищо общо с това! Вместо това може да бъде всеки възел, но documentFragment понякога е удобен поради свойството си да се разтваря при вмъкване.
Тоест, когато е неудобно да се направи междинен контейнерен възел, например, когато се добавя много TR, зареден от сървъра. Вместо n извиквания за appendChild в DOM на живо, имаме само 1 извикване, което може да доведе до същите спестявания като в сравнителните тестове по-горе.
Клониране на възли
documentFragment има метод cloneNode, т.е. може да се клонира заедно с всички възли.
Това също може да бъде удобно (1 извикване вместо n), но отново - няма значение какво да клонирате - обикновен възел извън DOM или documentFragment.
Удобството на documentFragment е, че той ще изчезне, когато бъде вмъкнат в документа. Обикновено това е полезно в таблици, мрежи и други подобни.
Един фрагмент от документ не оптимизира нищо сам по себе си, не е по-бърз от обикновения документ.
Оптимизацията се състои именно в това, че всички действия се извършват извън DOM.
Но благодарение на свойството dissolve on insertion, documentFragment е уникален и си струва да се има предвид. Не винаги е възможно и удобно да се създаде истински контейнер, но такъв временен може да бъде много полезен.
Благодаря за статията, не знаех за фрагменти преди. Направих бързо търсене в източниците на jQuery - фрагментите се използват доста активно. Могапредполагат, че когато използвате jQuery, не е нужно да се притеснявате за скоростта на вмъкване на елементи.
Нещо в моя хром понякога първият бенчмарк (без фрагменти) е по-бърз от втория
Здравей Изпробвах два теста. И двамата дадоха 11. Какво трябваше да видя? Браузър - Chrome на Mac OS X.
Firefox 27, Pentium 4 3,06 GHz. Неотложено средно 19ms. Закъснение със средно 11ms.
И двата теста изпълняват еднакво
можете веднага да получите documentFragment от полученото (например ajax) парче html