关于解决IE9 Treewalker Filter Bug的建议

Ada*_*son 4 javascript gecko webkit internet-explorer-9

背景资料

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

在这样的电话中:

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

filteracceptNode在Webkit和Gecko中被定义为"包含方法的对象"; 然而,在IE9中,根本没有提到acceptNode--它期望一个"回调方法",而没有该对象包装.

实际问题

那么,如果不进行明确的浏览器检测,解决此问题的最佳方法是什么?在某些情况下,我需要filter成为一种方法,而在其他情况下,我需要它作为包含该方法的对象.有没有一个干净的方法来实现这一目标?所有这些浏览器都声称支持DOM 2.0,所以我无法测试...

文件 - Bug的证明

以下是每个文档的比较:

  1. W3C规格
  2. 壁虎
  3. WebKit的
  4. 微软("NodeFilter是一个回调函数......" - 错误)

Ada*_*son 6

好吧,我想出了一件有用的东西.对更好的选择开放:

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);
Run Code Online (Sandbox Code Playgroud)

这很好用,因为很好的浏览器会调用.acceptNode过滤器对象,坏的将尝试立即执行它.

备择方案?


Tim*_*own 5

实际上IE 9 确实遵循了规范.阅读DOM规范ECMAScript绑定部分:

对象NodeFilter

这是一个ECMAScript函数参考.此方法返回一个数字.该参数是一个Node对象.

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