检测使用window.open打开的窗口的onload事件

Chr*_*ini 37 javascript firefox internet-explorer google-chrome popup

 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");
        };
Run Code Online (Sandbox Code Playgroud)

这在我尝试过的任何浏览器中都不起作用(IE,Firefox,Chrome).如何检测窗口中何时加载页面(如iframe onload)?

Del*_*ani 50

var myPopup = window.open(...);
myPopup.addEventListener('load', myFunction, false);

如果您关心IE,请使用以下作为第二行:

myPopup[myPopup.addEventListener ? 'addEventListener' : 'attachEvent'](
  (myPopup.attachEvent ? 'on' : '') + 'load', myFunction, false
);

正如您所看到的,支持IE非常麻烦,应尽可能避免使用.我的意思是,如果您需要支持IE,因为您的受众,无论如何都要这样做.

  • 我的回答也是正确的.我真的没有看到问题. (4认同)
  • 不幸的是没有。出于安全原因,浏览器禁用跨域的 JavaScript 对象交互。 (2认同)
  • 然后只使用三级条件.我会加上它. (2认同)

Tim*_*own 20

如果弹出窗口的文档来自不同的域,则根本不可能.

2015年4月更新:我错了:如果您拥有这两个域,那么您可以window.postMessagemessage几乎所有与今天相关的浏览器使用事件.

如果没有,如果没有从加载到弹出窗口的文档中获得一些帮助,你仍然无法跨浏览器进行这项工作.您需要能够检测加载后弹出窗口中的更改,这可能是弹出页面中的JavaScript在处理自己的load事件时设置的变量,或者您对它有一些控制权的变量你可以在开场白中添加对函数的调用.


eki*_*kim 6

如前所述,这个答案的/sf/answers/212162541/又称检测使用window.open解决方案打开的窗口的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")))
Run Code Online (Sandbox Code Playgroud)

但是,其他评论和答案会产生一些错误的误解,如下所述.

下面的剧本演示了定义的气质时间变化onload.将脚本应用于快速加载,location.href例如file:///和一些慢速站点以查看问题.可以看到任何onload消息或者根本没有消息(通过重新加载已加载的页面,可以看到所有3个变体).还假设正在加载的页面本身并未定义onload会使问题复杂化的事件.

onload的事件处理程序的定义是绝对不会'弹出窗口的HTML标记内’,虽然他们最终将驻留在的DOM中body...的HTML.

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);
Run Code Online (Sandbox Code Playgroud)

你可以做什么:

  • 打开一个外国URL
  • 在那个外国URL pg.地址栏输入一个javascript: ...URI
    ,它将继承与外部URL
    NB 相同的站点策略.javascript可能需要被标记为书签,因为地址栏URI javascript:在最近(大约2012年)的浏览器中无效
  • 这有效地提供了跨域访问,但请注意:
    1. javascript 不是网页或网站的本土,意味着它的起源具有无国籍国籍,因此本质上满足css(x-site scripting)和sop(同源策略)移民规则
    2. 它通过地址栏或书签手动调用,
      并将脚本手动输入这些位置

因此,任何页面,几乎无论如何,可以修改如下:

javascript:
  if(confirm("wipe out links & anchors?\n"+document.body.innerHTML))
     void(document.body.innerHTML=document.body.innerHTML.replace(/<a /g,"< a "))
Run Code Online (Sandbox Code Playgroud)

(差不多......
jar:file:///usr/lib/firefox/omni.ja!/chrome/toolkit/content/global/aboutSupport.xhtml
Mozilla的FF故障排除页面和其他jar档案是例外)

另一个例子:
常规禁用谷歌篡夺目标pg.命中,改变它的rwt功能如下:

javascript:void(rwt=function(unusurpURL){return unusurpURL})
Run Code Online (Sandbox Code Playgroud)

并将其标记为spay google(neuteralize google?)即.它是"固定的".

然后在点击任何google命中之前点击该书签,因此任何这些命中的书签都是干净的,而不是google由它们构成的杂项变态的像差.

完成测试

window.navigator.userAgent=
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
Run Code Online (Sandbox Code Playgroud)

应该注意的是,addEventListener在Mozilla中只有一个非标准的第四个布尔参数,如果true允许不可信内容触发器被实例化为外部页面.

ref:
element.addEventListener | 文档对象模型(DOM)| MDN:
特权页面和非特权页面之间的交互| 代码片段| MDN:

书签:
检测使用window.open打开的窗口的onload事件

  • 在这个答案中有很多句子说一件事然后是另一句话来纠正前一句话.这导致难以遵循.这里有很好的信息,很难看到.通过更清楚地说话,你会获得更多的赞成. (6认同)
  • upvotes本身不是一个问题 - 混淆?希望没有什么是直接矛盾的 - "犯下误解"是指之前关于x-site脚本和发起政策的评论和答案,希望不是这个答案! - 通过运行功能代码示例 - "ow"的经验证据,散文有望得到更加简洁和精确的限定和验证!(**O**pen**W**indow或应该是`function(ouch)`,在第一个例子中引用未经处理的错误条件的双关语!)散文是相当尖锐的,如果写它伤害然后阅读它...! (2认同)
  • 你的写作风格很难阅读.我的大脑在试图辨别这个答案的含义时受伤了.简洁并不是坏事. (2认同)