2

私はFirefoxの拡張機能に取り組んでいますし、それがこのようなものを使用しています。DOMContentLoadedイベントがiframeかどうかを確認する方法はありますか?

function myExt() 
{ 
    this.handleEvent = function (event) 
    { 
     switch (event.type) 
     { 
      case "DOMContentLoaded": 
      { 
       alert('fired'); 
      } 
     } 
    } 

    window.addEventListener ("DOMContentLoaded", this, false); 
} 

私の問題は、「ページの内容のiframeが、そう私は何を探していますが使用して、ある場合にアラートが複数回実行されることをですevent "on this.handleEvent event.targetがトップウィンドウまたはiframeウィンドウを参照しているかどうかを調べる必要があります。

どうすればいいですか?

+2

Whaaa? DOMContentloadedは親ウィンドウのiframe *のために発生します*?奇妙な、これは聞いたことがありません –

+0

私はそれがより多くのように思う、それはiframe自体のために発生し、それを含む文書にバブル。 – MatrixFrog

+0

それは "イベントバブリング"と関係があります – Peter

答えて

0

私はまだいくつかのテストをしていますが、この機能は、仕事をしていませんように見えます:

this.isTopLevel = function(event){ 
    var doc = event.target; 
    for(var i = 0; i < gBrowser.browsers.length; i++) { 
     if(gBrowser.browsers[i].contentDocument == doc) return true; 
    } 
    return false; 
}; 
+0

うまくいきました=) – Peter

0

ええと、DOMContentLoadedを発射するのは奇妙で、iframeです。それは、それがそれ自身の「窓」内にあるかのようにコンテンツを扱う。 event.targetさんの親を取得しようとしましたか?ownerDocumentですか?

私は<object>タグにロードされたSVGにFirebugを使用しました。私はownerDocumentがあなたが探しているものを得ると信じています。

0

あなたはevent.target.frameElementをチェックしてみてください。定義されていない場合はメイン文書ですが、定義されている場合はフレームです。私はこれがフレームのためだけであるかどうか、またはそれがiframeのためであるかどうかを覚えていません。

+0

すてきな解決策に見えますが、私はevent.targetとgBrowser.browsersドキュメントを比較して解決しました。あまりにもうまくいくようです。 – Peter

0

私は、アイフレームをフィルタリングするために、このスニペットを使用しています:

var browser = gBrowser.getBrowserForDocument(event.target); 
var pageIsFrame = (event.target instanceof Ci.nsIDOMHTMLDocument && 
    event.target != browser.contentDocument); 
if (pageIsFrame) { 
    // Not interested in frames. 
    return; 
} 

あなたはそのためのクローム特権が必要です。新しいアドオンSDKコンテンツのスクリプト(あなたがクローム特権を持っていない場合)、私はこれを使用していて

if (window.frameElement) { 
    // This is an iframe. 
    //... 
} 

(MDCドキュメントhereまたはhereを参照してください)。

関連する問題