检测用window.open打开的窗口的onload事件
window.popup = window.open($(this).attr('href'), 'Ad', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); $(window.popup).onload = function() { alert("Popup has loaded a page"); };
这在我尝试过的任何浏览器(IE,Firefox,Chrome)中都不起作用。 我怎样才能检测到一个页面加载到窗口(如iframe onload)?
如果popup窗口的文档来自不同的域,这是不可能的。
2015年4月更新:我错了:如果你拥有这两个域, 你可以使用window.postMessage
和message
事件在今天几乎所有的浏览器 。
如果没有,如果没有从加载到popup窗口的文档的帮助,你仍然无法使这个工作跨浏览器。 您需要能够检测一旦加载后popup窗口中的变化,这可能是popup页面中的JavaScript在处理自己的load
事件时设置的variables,或者您可以控制你可以添加一个调用opener中的函数。
var myPopup = window.open(...); myPopup.addEventListener('load',myFunction,false);
如果您关心IE,请改用以下代码作为第二行:
myPopup [myPopup.addEventListener? 'addEventListener':'attachEvent']( (myPopup.attachEvent?'on':'')+'load',myFunction,false );
正如你所看到的,支持IE非常麻烦, 如果可能的话应该避免。 我的意思是,如果你需要支持IE,因为你的观众,一定要这样做。
正如注意到这个答案的https://stackoverflow.com/a/3030893 aka 检测window.open解决scheme打开的窗口的onload事件是理想的:
javascript: /* IE will use 1 ignore 1 w/ error, FF t'other way 'round */ (function(ow){ ow . addEventListener( 'load', function(){alert("loaded")}, false); ow . attachEvent('onload', function(){alert("loaded")}, false); }(window.open(prompt("Where are you going today?",location.href),"snapDown")))
然而,其他的评论和答案会犯下几个错误的误解,如下所述。
下面的脚本演示了定义onload
的气质的时空浮躁。 将该脚本应用于快速加载的location.href
(如file:///
和一些较慢的站点以查看问题。 可以看到onload
消息或根本没有(通过重新加载一个加载的页面,可以看到所有3个变化)。 还假设正在加载的页面本身并没有定义一个会导致问题的onload
事件。
onload
的事件处理程序定义绝对不是“在popup的HTML标记中”,尽pipe它们最终将驻留在HTML
的body
的DOM中。
javascript: window.popup=window.open(location.href,'snapDown'); window.popup.onload=function(){alert("message one ")}; alert("message 1 maybe too soon\n"+window.popup.onload); window.popup.onload=function(){alert("message two")}; alert("message 2 maybe too late\n"+window.popup.onload);
你可以做什么:
- 打开一个外部URL
- 在那外国URL页 地址栏input一个
javascript: ...
URI
它将inheritance与外部URL相同的策略
NB。 JavaScript可能需要书签作为一个书签,因为地址栏的URIjavascript:
的是最近(大约在2012年)浏览器 - 这有效地给了跨域访问但是注意:
- JavaScript 不是网页或网站的土着,这意味着它的起源有一个无国籍的国籍,从而本质上满足css(x站点脚本)和sop(相同来源策略)移民规则
- 它是通过地址栏或书签AND 手动调用的
脚本被手动input到这些位置
因此,任何页面几乎都可以被修改,如:
javascript: if(confirm("wipe out links & anchors?\n"+document.body.innerHTML)) void(document.body.innerHTML=document.body.innerHTML.replace(/<a /g,"< a "))
(几乎…
jar:file:///usr/lib/firefox/omni.ja!/chrome/toolkit/content/global/aboutSupport.xhtml
Mozilla的FF故障排除页面和其他jar
是例外)
又如:
要经常禁用谷歌的目标页面篡夺。 命中,改变它的rwt
函数如下:
javascript:void(rwt=function(unusurpURL){return unusurpURL})
并将其标记为neuteralize google
( neuteralize google
?)ie。 它是“固定的”。
这个书签然后点击任何google
点击之前点击,所以这些点击的书签是干净的,而不是google
他们做的杂种变态exception。
testing完成
window.navigator.userAgent= Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
应该注意的是,Mozilla中的addEventListener
只有一个非标准的第四个布尔参数,如果为true
允许不可信任的内容触发器为外部页面实例化。
参考:
element.addEventListener | 文档对象模型(DOM)| MDN:
特权页面和非特权页面之间的交互作用| 代码片段| MDN:
书签:
检测用window.open打开的窗口的onload事件
这对我来说是个诡计。 完整的例子:
HTML:
<a href="/my-popup.php" class="import">Click for my popup on same domain</a>
使用Javascript:
(function(){ var doc = document; jQuery('.import').click(function(e){ e.preventDefault(); window.popup = window.open(jQuery(this).attr('href'), 'importwindow', 'width=500, height=200, top=100, left=200, toolbar=1'); window.popup.onload = function() { window.popup.onbeforeunload = function(){ doc.location.reload(true); //will refresh page after popup close } } }); })();
onload
事件处理程序必须位于popup的HTML <body>
标记内。