我有一种情况,我需要将一些json从一个窗口传递到同一个域中的新窗口。我有第一个窗口让它说出window1和第二个窗口,让它说成window2。
我在window1中有以下代码:
var params = [
'height=750',
'width=720',
'scrollbars=yes',
'left=0',
'top=0',
'fullscreen=no', // only works in IE, but here for completeness
'location=no'
].join(',');
var port = location.port;
var url = "http://" + hostName + ':' + port + "/isecalreport" + location.search;
var newWindow = window.open(url,'photocal_report',params);
while(true){
if(newWindow! == undefined) {
newWindow.location.state={payloadFromIseCalWeekly : payloadFromIseCalWeekly,instrumentIdObj : instrumentIdObj};
break;
}
}
window2中的代码:
var payloadFromIseCalWeekly = location.state.payloadFromIseCalWeekly ? location.state.payloadFromIseCalWeekly : {};
我想利用window.location.state中的json设置。
所以问题是,它在chrome,mozilla中运行良好,但在IE 11中失败(当调试器未打开时)。 当我在IE11中打开调试器时,它工作正常。
我调试它并发现在打开新窗口的指令之后,下一条指令运行并且它找不到新的窗口对象。 它很奇怪,因为它在开发者控制台打开时有效。
如果我能够获得有关如何解决问题的见解,那将是件好事。
我的目标是打开一个新窗口,我需要传递一些数据并使用我希望进行API调用的数据。
答案 0 :(得分:0)
除了少数例外,您无法告诉一个窗口,标签或框架直接与另一个窗口,标签或框架交谈。这是为了防止其中一个上下文中的恶意脚本跨页面劫持另一个。
要解决这个问题,您有两个选择,您可以使用postMessage()
或只是通过您在新窗口中打开的网址传递数据。如果你在同一个领域,技术上有更多的选择,但我建议你不要去那个兔子洞。
通过URL发送数据是一种单向事件。您可以在新窗口可以读取的URL中发送查询字符串变量,但不能将任何内容发送回创建它的窗口。
另一方面, postMessage()
可用于在多个上下文和跨域之间进行通信。它被认为是安全的,因为它要求所有参与者都在监听消息,而不是允许直接访问代码。
您的各种页面可以通过简单的事件监听器来监听消息。
// the * is the targetOrigin, read the docs!
newWindow.postMessage("some message data", "*");
然后,您可以将其他页面的消息发送到您的窗口。
select * from [dbo].[Quotes] Q ,[dbo].[Invoices] I ,[dbo].[Receipts] R ,
[dbo].[QuoteLines] QL where QL.QuoteID = Q.ID AND I.QuoteID = Q.ID
AND R.QuoteID = Q.ID AND QL.Amount = 336.47 and QL.TravelType = 'International' and QL.Type = 'Accommodation'