关于解决IE9 Treewalker Filter Bug的建议

时间:2011-05-12 18:29:48

标签: javascript webkit internet-explorer-9 gecko

背景资讯

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

在这样的电话中:

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

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

实际问题

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

文件 - 错误证明

以下是每个文档的比较:

  1. W3C Spec
  2. Gecko
  3. Webkit
  4. Microsoft(“NodeFilter是一个回调函数......” - 错误)

2 个答案:

答案 0 :(得分: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);

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

替代?

答案 1 :(得分:5)

实际上IE 9 确实遵循规范。阅读ECMAScript bindings section of the DOM spec

  

对象NodeFilter

     

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

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