Javascript IFRAMES:contentWindow.beforeunload()和;onload()

Javascript IFRAMES:contentWindow.beforeunload()和;onload(),javascript,html,css,iframe,Javascript,Html,Css,Iframe,我正试图在一个我访问受限的网站上修改一些CSS。我被允许在服务器上创建一个页面,但不能在站点上修改其他PHP生成的页面 我正在探索将CSS注入iframe。我首先隐藏iframe,然后在进行更改后显示它 不幸的是,我知道我唯一有权访问iframe.contentWindow.document的时间是在触发iframe.onload()事件之后。页面的大部分内容都是异步加载的,因此在加载所有外部内容(包括社交媒体内容)时,原本需要等待3秒才能看到屏幕上的内容,现在却需要等待7-10秒 在onloa

我正试图在一个我访问受限的网站上修改一些
CSS
。我被允许在服务器上创建一个页面,但不能在站点上修改其他
PHP
生成的页面

我正在探索将
CSS
注入
iframe
。我首先隐藏
iframe
,然后在进行更改后显示它

不幸的是,我知道我唯一有权访问
iframe.contentWindow.document
的时间是在触发
iframe.onload()
事件之后。页面的大部分内容都是异步加载的,因此在加载所有外部内容(包括社交媒体内容)时,原本需要等待3秒才能看到屏幕上的内容,现在却需要等待7-10秒


onload()
之前是否有触发的事件使我知道我有权访问新文档?我只想将
样式表
注入头部,我不在乎
DOM的90%是否“准备就绪”。

不确定这是否是您所追求的类型,但它可能会有所帮助

注意:我一般不喜欢这种类型的代码,我原本以为我会使用-但是,我发现,在等待iframe的contentDocument指示内容已经开始加载时,我必须执行上述操作,然后才能连接突变观察者,这样我就会错过一半时间连接的
head
元素

Firefox在iframes上有一个mozbrowserloadstart事件——但那只是Firefox,所以在其他任何地方都没有用处

function limitedRetryWithDelay(count, delay, tester, cb) {
    var res = tester();
    if(res) {
        cb(res);
    } else {
        if (count > 0) {
            setTimeout(function() {
                limitedRetryWithDelay(count - 1, delay, tester, cb);
            }, delay);
        }
    }

}
// next 3 lines is just how I tested it - you'll need a reference to the iframe node instead for "tgt"
var tgt = document.createElement('iframe');
document.body.appendChild(tgt);
tgt.src = '/index.html?_=' + Math.random() + '_' + Math.random();
// end testing code

// try every 10ms for 5 seconds because (500 * 10 = 5000ms)
limitedRetryWithDelay(500, 10, function (e) {
    return tgt.contentDocument && tgt.contentDocument.location != 'about:blank' && tgt.contentDocument.head;
}, function(head) {
    console.log('head is', head);
});
顺便说一下,在处理文档之前,您可能不需要等待
head
出现,您完全可以等待
contentDocument

limitedRetryWithDelay(500, 10, function (e) {
    return tgt.contentDocument && tgt.contentDocument.location != 'about:blank' && tgt.contentDocument;
}, function(doc) {
    console.log('document is', doc);
});

实际上,beforeunload与此无关,因为这与“当前页面”无关。我不知道是否可以在
iframe.contentDocument
上添加
MutationObserver
,但这可能会有所帮助(等待
head
添加到dom中,然后执行您的操作)我知道我已经尝试了我能找到的所有与Iframe相关的事件和onbeforeload,onload是我见过的唯一两个有效的方法。我怀疑这是不可能的,但我想在放弃之前确定一下。谢谢,我正在测试这个。我也不喜欢超时代码。您在生产中见过这种类型的解决方案吗?我是否担心部署它在某些情况下可能会崩溃?我不得不在Chrome的生产中这样做-因为出于某种原因,Chrome中的iframe onload事件与Firefox中的行为不同-即在某些情况下它永远不会触发-不确定现在是否仍然如此,但我不再参与那个特定的代码,所以我不在乎:p