无法读取firefox中的Element.prototype

时间:2013-05-31 20:12:44

标签: javascript firefox element prototype

如果我运行此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中运行?这让我疯了!

3 个答案:

答案 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)中 都失败了:

  • Firefox:value does not implement interface Node
  • IE10: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