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

时间:2010-11-19 18:52:31

标签: events firefox javascript-events event-handling firefox-addon

我正在使用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窗口。

我该怎么做?

4 个答案:

答案 0 :(得分:0)

是的,iframe很奇怪,会引发DOMContentLoaded。它将内容视为自己的“窗口”。您是否尝试过event.target的父母或ownerDocument

我在加载到<object>标记中的SVG上使用了Firebug,我相信ownerDocument可以获得您想要的内容。

答案 1 :(得分: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;
};

答案 2 :(得分:0)

您可以尝试检查event.target.frameElement。如果它是未定义的那么它是主文档,但如果它被定义则它是一个框架。我不记得这是否仅适用于帧,或者是否也适用于iframe。

答案 3 :(得分:0)

我正在使用此代码段过滤掉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文档herehere)。