3

この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 で動作させるにはどうすればよいですか? それは私を夢中にさせています!

4

3 に答える 3

3

ここでの Firefox (および最近の IE) の動作は、一部のプロパティ (たとえばfirstChild) のプロパティ ゲッターがプロトタイプ オブジェクト上にあるためですが、プロパティはプロトタイプ自体では意味をなさないためです。プロトタイプでそれらを取得しようとするとスローされます。

実際、これは仕様で要求される動作です。http://dev.w3.org/2006/webapi/WebIDL/#dfn-attribute-getterステップ 2 サブステップ 2 サブサブステップ 2を参照してください。Firefox と IE はここの仕様に従っていますが、WebKit ベースのブラウザはそうではありません。

于 2013-06-01T02:03:50.043 に答える
1

次の点を考慮してください。

console.log('parentNode' in Element.prototype
   ? Element.prototype.parentNode
   : 'no parentNode here');

かなり無実ですよね?no parentNodeChrome (およびおそらく Safari でも) で文字列が得られますが、Firefox (21) と IE (10) の両方で失敗します。

  • ファイアフォックス:value does not implement interface Node
  • IE10: invalid calling object

何故ですか?ほら、ルールのないゾーンとも呼ばれるホストオブジェクトゾーンに入りました。ポイントは、一部のプロパティは にアタッチされているように見えElement.prototypeますが、そこからはアクセスできず、Elementインスタンスからのみアクセスできるということです。

それについて何ができるでしょうか?明らかな回避策は、違反者を「try-catch」ブロックでラップすることです。

var a, b = Element.prototype, arr = [];
for (a in b) {
  try {
    b[a];
    arr.push(a); 
  } catch (e) {}
}
于 2013-05-31T21:44:17.750 に答える
0

Object.getOwnPropertyDescriptor()プロトタイプのキーを使用して各プロパティに直接アクセスする代わりに、ループで使用してみてください: http://codepen.io/seraphzz/pen/aJgcr

于 2013-06-01T06:30:08.843 に答える