Javascript 如何确定DOMContentLoaded事件是否来自iframe?
我正在开发一个Firefox扩展,它使用如下内容: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
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文档解决了它。这样似乎也很好。