Javascript 如何确定DOMContentLoaded事件是否来自iframe?

Javascript 如何确定DOMContentLoaded事件是否来自iframe?,javascript,firefox,event-handling,firefox-addon,dom-events,Javascript,Firefox,Event Handling,Firefox Addon,Dom Events,我正在开发一个Firefox扩展,它使用如下内容: function myExt() { this.handleEvent = function (event) { switch (event.type) { case "DOMContentLoaded": { alert('fired'); } } } win

我正在开发一个Firefox扩展,它使用如下内容:

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

    window.addEventListener ("DOMContentLoaded", this, false);
}
我的问题是,如果页面内容为iframe,则会多次执行警报,因此我希望在this.handleEvent上使用“event”(事件)。我需要确定event.target是引用顶部窗口还是iframe窗口。


我该怎么做呢?

是的,
iframe
很奇怪,它会触发
DOMContentLoaded
。它将内容视为在自己的“窗口”中。您是否尝试获取
事件。目标的父级或
所有者文档


我在加载到
标记中的SVG上使用过,我相信
所有者文档
可以满足您的需求。

我仍在进行一些测试,但看起来此函数可以完成以下任务:

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;
};
this.isTopLevel=函数(事件){
var doc=event.target;
对于(var i=0;i
您可以尝试检查event.target.frameElement。如果未定义,则它是主文档,但如果已定义,则它是一个框架。不过,我不记得这是只针对帧还是也针对iFrame。我用这个片段过滤iFrame:

var browser = gBrowser.getBrowserForDocument(event.target);
var pageIsFrame = (event.target instanceof Ci.nsIDOMHTMLDocument &&
  event.target != browser.contentDocument);
if (pageIsFrame) {
  // Not interested in frames.
  return;
}
你需要Chrome的特权

在新的附加SDK内容脚本(您没有Chrome权限)中,我使用以下内容:

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

(见MDC文件或)。

Whaaa?DOMContentloaded在父窗口中为iframe激发?奇怪,从未听说过这个我认为它更像是,它为iframe本身激发,然后冒泡到包含它的文档。是的,它与“事件冒泡”有关。感谢这看起来是一个不错的解决方案,我通过比较event.target和gBrowser.browsers文档解决了它。这样似乎也很好。