如果我运行此javascript:
var a,b=Element.prototype;
for(a in b)b[a];
Firefox给了我这个错误:
TypeError: Value does not implement interface Element.
这是一个测试用例: http://codepen.io/WilliamMalo/pen/AJkuE
适用于所有其他浏览器。如何让它在Firefox中运行?这让我疯了!
答案 0 :(得分:3)
这里的Firefox(以及最近的IE)行为是因为某些属性(比如firstChild
)的属性getter在原型对象上,属性对原型本身没有意义。试图将它们放在原型上会抛出。
事实上,这是规范要求的行为。请参阅http://dev.w3.org/2006/webapi/WebIDL/#dfn-attribute-getter第2步子步骤2子步骤2. Firefox和IE遵循此处的规范,而基于WebKit的浏览器则不然。
答案 1 :(得分:1)
请考虑以下事项:
console.log('parentNode' in Element.prototype
? Element.prototype.parentNode
: 'no parentNode here');
非常无辜,对吧?它会在Chrome中为您提供no parentNode
字符串(也可能在Safari中)......但它在Firefox(21)和IE(10)中 都失败了:
value does not implement interface Node
invalid calling object
为什么?看,我们已进入主机对象区域,也称为The Zone Of No Rules。关键是虽然某些属性似乎附加到Element.prototype
,但它们无法从那里访问 - 仅来自Element
个实例。
可以做些什么呢?一个显而易见的出路是将犯罪者包裹在'try-catch'区块中:
var a, b = Element.prototype, arr = [];
for (a in b) {
try {
b[a];
arr.push(a);
} catch (e) {}
}
答案 2 :(得分:0)
您可能想尝试在循环中使用Object.getOwnPropertyDescriptor()
,而不是直接使用原型上的键访问每个属性:http://codepen.io/seraphzz/pen/aJgcr