Рекомендации по работе с ошибкой фильтра IE9 Treewalker - PullRequest
4 голосов
/ 12 мая 2011

Справочная информация

В настоящее время существует ошибка в IE9, когда он считает, что свойство NodeFilter метода createTreeWalker является функцией обратного вызова вместо объекта, содержащего функцию обратного вызова.

При таком вызове:

document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, filter, false);

filter определяется как «объект, содержащий метод acceptNode», в Webkit и Gecko;однако в IE9 вообще нет упоминания о acceptNode - он ожидает «метод обратного вызова» без переноса этого объекта.

Актуальный вопрос

Итак, чтолучший способ обойти эту проблему без явного определения браузера ?В некоторых случаях мне нужно filter, чтобы быть методом, а в других мне нужно, чтобы это был объект, содержащий метод.Есть ли чистый способ сделать это?Все эти браузеры утверждают, что поддерживают DOM 2.0, поэтому я не могу проверить это ...

Документы - подтверждение ошибки

Вот сравнение документациидля каждого:

  1. W3C Spec
  2. Gecko
  3. Webkit
  4. Microsoft («NodeFilter - функция обратного вызова ...» - НЕПРАВИЛЬНО)

Ответы [ 2 ]

6 голосов
/ 12 мая 2011

Ну, я придумал одну вещь, которая работает.Открыты для лучших альтернатив:

var filter = { acceptNode: function() {
     //do filtering...
} };

// Hackzilla.  A true W3C-compliant nodeFilter object isn't passed, and instead a "safe" one _based_ off of the real one.
var safeFilter = filter.acceptNode;
safeFilter.acceptNode = filter.acceptNode;

document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, safeFilter, false);

Это работает так, как хорошие браузеры будут вызывать .acceptNode для объекта фильтра, где плохие попытаются выполнить его немедленно.

Альтернативы?

5 голосов
/ 13 мая 2011

На самом деле IE 9 соответствует в соответствии со спецификацией. Прочитайте раздел ECMAScript в спецификации DOM :

Объект NodeFilter

Это ссылка на функцию ECMAScript. Этот метод возвращает число. Параметр является объектом Node.

Поэтому соответствующие браузеры (включая текущие версии всех основных) будут принимать функцию в качестве параметра filter.

...