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