window.location.state无法按预期工作

时间:2017-03-21 07:09:21

标签: javascript json windows internet-explorer-11

我有一种情况,我需要将一些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调用的数据。

1 个答案:

答案 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'