Опрос
Вы участвуете в программе Windows Insider?
Популярные новости
Обсуждаемые новости

03.08.2010 19:34 | houseboy

Последняя на сегодняшний день сборка IE 9 включает в себя две масштабные совместимые функций для работы с DOM - DOM Traversal и Element Traversal. Эти функции обеспечивают веб-разработчикам простой, гибкий и быстрый путь просмотра документа, используя одинаковую разметку во всех браузерах. Эти функции входят в виде плоских перечислений, упрощая DOM-дерево для итерационных списков и фильтров, который позволит вам адаптировать набор узлов при просмторе. Эти функции работают с одинаковой разметкой в различных браузеров - можете протестировать любую часть кода в окне IE9 platform preview и любого другого браузера.

Без этих функций, чтобы найти интересующий вас элемент на странице, от вас требуется сделать один или несколько глубоких просмтра документа с использованием firstChild и nextSibling. Обычно это осуществляется сложным кодом, который работает медленно. С DOM и функциями Element Traversal, появились новые и более эффективные пути решения этой проблемы. Эта статья содержит несколько примеров, чтобы подтолкнуть вас на нужный путь.

Я начну с Element Traversal, так как у него самый простой интерфейс, а также знакомые модели для перечисления элементов в DOM. Element Traversal это версия DOM Core, оптимизированного для элементов. Вместо того, чтобы вызывать функции firstChild и nextSibling, вы вызываете firstElementChild и nextElementSibling. Например:

if (elm.firstElementChild)
{
    elm = elm.firstElementChild;
   
    while (elm.nextElementSibling)
    {
        // Do work...
    }
}



Это быстрее и удобнее, к тому же избавляет вас от проблемы проверки текста и комментариев узлов, когда вы действительно заинтересованы только в элементах.

DOM Traversal предназначен для более широких случаев. Во-первых, вы создаете NodeIterator или TreeWalker. После этого вы можете воспользоваться одним из итерационных методов для просмотра дерева:

var iter = document.createNodeIterator(elm, NodeFilter.SHOW_ELEMENT, null, false); // This would work fine with createTreeWalker, as well

var node = iter.nextNode();
while (node = iter.nextNode())
{
    node.style.display = "none";
}



Представленный выше код перебирает в виде простого списка всех узлы дерева. Это может быть чрезвычайно полезно, поскольку в большинстве случаев вам все равно где находятся child или sibling , а просто происходит ли это до или после текущей позиции в документе.

Большим преимуществом DOM Traversal является то, что он вводит идею фильтрации, так что вы затрагиваете только интересующие узлы. Хотя NodeIterator выполняет только плоские итерации, TreeWalker имеет также некоторые дополнительные методы, такие как firstChild (), который позволяет вам видеть именно столько структуры дерева, сколько вы хотите.

Семейство констант SHOW_ * дает возможность включать широкий класс узлов, таких как текст или элементы (например, SHOW_ELEMENT в предыдущем примере). Во многих случаях, этого будет достаточно. Но когда вы больше всего нуждаетесь в точном контроле, вы можете написать свой собственный фильтр через интерфейс NodeFilter. Интерфейс NodeFilter использует функцию обратного вызова для фильтрации каждого узла, как показано в следующем примере:

var iter = document.createNodeIterator(elm, NodeFilter.SHOW_ALL, keywordFilter, false);

function keywordFilter(node)
{
   var altStr = node.getAttribute('alt').toLowerCase();
   
   if (altStr.indexOf("flight") != -1 || altStr.indexOf("space") != -1)
      return NodeFilter.FILTER_ACCEPT;
   else
      return NodeFilter.FILTER_REJECT;               
}



Для более наглядного примера, посмотрите мою демо-версию DOM Traversal - я широко использовал NodeFilter. Комплекс операций сортировки в списке медиа-элементов столь же прост, как использование обратного NodeFilter в примере выше.

В этой статье я показал, что у вас есть варианты того, как пробежать документ. Здесь предлагаются лучшие примеры, когда необходимо использовать различные интерфейсы:

- Если структура документа очень важна - и вы заинтересованы только в элементах - используйте Element Traversal. Это быстро и не оставит большого следа в вашем коде.
- Если вы не заботитесь о структуре документа, используйте NodeIterator TreeWalker. Таким образом, ваш код предстанет как ровный лист. NodeIterator также, как правило, быстрее, что становится важным моментом при прохождении больших наборов узлов.
- Если SHOW_*константы делают то, что вам нужно для фильтрации, используйте их. Использование констант делает ваш код проще, а также он будет иметь несколько более высокую производительность. Тем не менее, если вам нужна мелкозернистая фильтрация, вам не обойтись без вызова обратного NodeFilter.

Я уже открыл для себя эти функции и они обещают быть большим подспорьем в моем процессе написания кода, поэтому я очень буду рад, если вы также активно их задействуете. Загрузите последнюю версию Platform Preview, попробуйте API, и дайте нам знать, что вы об этом думаете.

Источник: http://blogs.msdn.com/b/ie/archive/2010/07/30/dom-traversal.aspx
Перевод: houseboy

Комментарии

Комментариев нет...
Для возможности комментировать войдите в 1 клик через

По теме

Акции MSFT
420.55 0.00
Акции торгуются с 17:30 до 00:00 по Москве
Все права принадлежат © ms insider @thevista.ru, 2022
Сайт является источником уникальной информации о семействе операционных систем Windows и других продуктах Microsoft. Перепечатка материалов возможна только с разрешения редакции.
Работает на WMS 2.34 (Страница создана за 0.116 секунд (Общее время SQL: 0.101 секунд - SQL запросов: 53 - Среднее время SQL: 0.00191 секунд))
Top.Mail.Ru