检测用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.postMessagemessage事件在今天几乎所有的浏览器

如果没有,如果没有从加载到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它们最终将驻留在HTMLbody的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可能需要书签作为一个书签,因为地址栏的URI javascript:的是最近(大约在2012年)浏览器
  • 这有效地给了跨域访问但是注意:
    1. JavaScript 不是网页或网站的土着,这意味着它的起源有一个无国籍的国籍,从而本质上满足css(x站点脚本)和sop(相同来源策略)移民规则
    2. 它是通过地址栏或书签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 googleneuteralize 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>标记内。