Ada*_*son 4 javascript gecko webkit internet-explorer-9
背景资料
目前在IE9中存在一个错误,它认为NodeFilter该createTreeWalker方法的属性是回调函数而不是包含回调函数的对象.
在这样的电话中:
document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, filter, false);
filteracceptNode在Webkit和Gecko中被定义为"包含方法的对象"; 然而,在IE9中,根本没有提到acceptNode--它期望一个"回调方法",而没有该对象包装.
实际问题
那么,如果不进行明确的浏览器检测,解决此问题的最佳方法是什么?在某些情况下,我需要filter成为一种方法,而在其他情况下,我需要它作为包含该方法的对象.有没有一个干净的方法来实现这一目标?所有这些浏览器都声称支持DOM 2.0,所以我无法测试...
文件 - Bug的证明
以下是每个文档的比较:
好吧,我想出了一件有用的东西.对更好的选择开放:
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过滤器对象,坏的将尝试立即执行它.
备择方案?
实际上IE 9 确实遵循了规范.阅读DOM规范的ECMAScript绑定部分:
对象NodeFilter
这是一个ECMAScript函数参考.此方法返回一个数字.该参数是一个Node对象.
因此,符合标准的浏览器(包括所有主要版本的当前版本)都将接受函数作为filter参数.
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |