1

(jQuery を使用して) フラッシュ オブジェクト (HTMLObjectElement) を作成し、それを DOM に追加しました。それはすべてのブラウザで問題なく動作しています。このオブジェクトは、「o.data.cam」という変数に保存/保存されます。この変数が有効かどうかをチェックする他の関数。

例えば:

if( typeof o.data.cam == "object")
 { do this }

これは、Firefox を除くすべてのブラウザで問題なく動作します。o.data.camオブジェクトではなく関数です。オブジェクトが作成されるため、これは奇妙な動作だと思いますが、なぜこれが関数として報告されるのですか?

Firefox 17.0.1 (最新) では、作成された HTMLObjectElement (object タグ) をダンプすると [object HTMLObjectElement] が返されます。ネイティブ関数 => [ネイティブ関数] のように、ネイティブ関数 (保護されている) と同じになる可能性があるため、これ (?) を理解できます。そうでなければ、ほとんどの DOM 要素を検査できるので、少し奇妙です。

ただし、他のブラウザと比較すると、いくつかの相違点に注意する必要があります。

                        Firefox                       Chrome     MSIE      Opera
___________________________________________________________________________________________
dump o.data.cam             [object HTMLObjectElement]    Object*    Object*   Object*
typeof o.data.cam           "function"                   "Object"   "Object"  "Object"
typeof HTMLObjectElement    "object"                     "function" "Object"  "function"
  • (アスタリスク) = オブジェクト ツリーを出力します

注: - 引用符の間は文字列で、"typeof" の結果です。

typeof 評価は、すべてのブラウザー (Firefox を除く) で "オブジェクト" を返します。これは私の意見では正しいと思います。

私の質問は次のとおりです。これはバグですか、それとも何か不足していますか?

編集:有効なDOM要素であるかどうかを確認するために、この関数を作成しました。この方法で安全ですか?Firefox が true を返すようになりました。

function isDOM(oo)
{ 
  if( oo )
  {
   if( typeof oo instanceof jQuery )
    { return !!oo[0]; }
   if( typeof oo == 'object' || typeof oo == 'function' )
    { return ( typeof oo.tagName == 'string' && oo.tagName.length > 0 ); }
  }
  return false; 
}
4

1 に答える 1

1

EcmaScript 仕様によると、[[Call]] 内部メソッドを持つすべてのオブジェクトは、typeof の「関数」を返さなければなりません。

HTMLObjectElement のインスタンスは [[Call]] 内部メソッドを持つことができます。これは、プラグインがインスタンス化されたオブジェクトを呼び出し可能にすることができるためです。

したがって、唯一の問題は、オブジェクトが常に呼び出し可能であり、プラグインが呼び出されたくない場合にスローする必要があるかどうか、またはプラグインの動作に応じて「オブジェクト」と「関数」の間で型を動的に変更する必要があるかどうかです。 . [[Call]] があるにもかかわらず、仕様を無視して「オブジェクト」を報告するという 3 番目のオプションもあります。

Firefox は前者を行います: 常に [[Call]] を持つので、typeof は "関数" を報告します。他のブラウザはおそらく [[Call]] を動的に表示および非表示にするか、完全に仕様に違反しています。

于 2012-12-14T09:15:27.777 に答える