重定向后从 window.open()'ed 窗口获取内容

Posted

技术标签:

【中文标题】重定向后从 window.open()\'ed 窗口获取内容【英文标题】:Getting the contents from a window.open()'ed window after redirect重定向后从 window.open()'ed 窗口获取内容 【发布时间】:2016-05-29 11:11:06 【问题描述】:

我有一个在 Chrome 中运行的 Web 应用程序,但同源策略已禁用(即 --disable-web-security)。我使用window.open() 创建一个新窗口,该窗口加载一个有时会重定向的URI。如果没有发生重定向,我可以在onload 事件触发时使用document 属性读取窗口内托管的文档的内容。不幸的是,在发生重定向的情况下,onload 似乎永远不会触发,并且从window.open() 返回的窗口对象不再有用。

这是代码,让您了解发生了什么:

var win = window.open('http://somewhere');
win.onload = function() 
  doStuffWith(win.document.body);
  win.close();
;

有什么方法可以让我保持有效的window 句柄,即使在新窗口打开后立即发生重定向?


根据@CBroe 的建议,我扩展了我的代码,看看如果我稍等片刻,是否可以获取窗口的内容。在上面的代码之后,我附加了:

setTimeout(function() 
  console.log(win.location);
  doStuffWith(win.document.body);
, 5000);

location 被报告为 swappedout://(嗯!?)并且文档的正文为空。

【问题讨论】:

您可以访问窗口重定向到的页面的代码吗? 不,就是这样。我完全无法控制加载到新窗口中的内容。 如果我错了,请纠正我,但同源策略不是由服务器而不是客户端确定的吗? 服务器决定策略;客户强制执行它。我告诉我的客户不要这样做。 @sg.cc:同源策略在客户端强制执行,仅基于协议、主机名和端口是否匹配。也许您在这里将它与 CORS 混淆了? (在这件事上,远程服务器有发言权。) 【参考方案1】:

问题是,如果重定位不是完全在假设大多数浏览器提供的点击事件弹出阻止程序阻止请求之后,在您想要的某些功能成功时,打开一个带有按钮的模式并进行重定位单击新按钮。这是唯一的方法。不是很好,但它会解决问题。

这也适用于负载。

【讨论】:

我禁用了弹出窗口阻止程序,所以它不会干扰。通常,除了涉及重定向的情况外,窗口加载正常。

以上是关于重定向后从 window.open()'ed 窗口获取内容的主要内容,如果未能解决你的问题,请参考以下文章

关于js的window.open()

使用JS重定向[重复]

FOSUserBundle 登录后从登录页面重定向

JavaScript中的window.location.href和window.open()方法

window.open 目标_self v window.location.href?

window.open 目标_self v window.location.href?