4

背景信息

IE9 中当前存在一个错误,它认为方法的NodeFilter属性createTreeWalker是回调函数,而不是包含回调函数的对象。

在这样的电话中:

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

filter在 Webkit 和 Gecko中被定义为“包含方法的对象acceptNode”;然而,在 IE9 中,根本没有提到 acceptNode ——它需要一个“回调方法”,而没有该对象包装。

实际问题

那么,在不进行显式浏览器检测的情况下解决此问题的最佳方法是什么?在某些情况下,我需要filter成为一种方法,而在其他情况下,我需要它成为包含该方法的对象。有没有一种干净的方法可以做到这一点?所有这些浏览器都声称支持 DOM 2.0,所以我无法对此进行测试......

文档 - 错误证明

以下是每个文档的比较:

  1. W3C 规范
  2. 壁虎
  3. 网络套件
  4. Microsoft(“NodeFilter 是一个回调函数......” - 错误)
4

2 回答 2

6

Well, I came up with one thing that works. Open to better alternatives:

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);

This works as nice browsers will call .acceptNode on the filter object, where bad ones will try and execute it immediately.

Alternatives?

于 2011-05-12T19:11:51.757 回答
5

实际上 IE 9确实遵循规范。阅读DOM 规范的 ECMAScript 绑定部分

对象节点过滤器

这是一个 ECMAScript 函数参考。此方法返回一个数字。参数是一个节点对象。

因此,符合标准的浏览器(包括所有主要浏览器的当前版本)都将接受一个函数作为filter参数。

于 2011-05-12T21:23:18.663 回答