Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测浏览器对窗口间通信的支持_Javascript_Browser Feature Detection - Fatal编程技术网

Javascript 检测浏览器对窗口间通信的支持

Javascript 检测浏览器对窗口间通信的支持,javascript,browser-feature-detection,Javascript,Browser Feature Detection,我有一些javascript依赖于window.open和窗口间通信的使用(其中新的“子”窗口) 这种(窗口间通信)在大多数情况下都可以正常工作,但对于一些不支持窗口间通信的浏览器不起作用。例子包括和 我目前使用客户端(基于javascript)来检测这些场景,并使用不同的代码路径来解决这个问题 我是否可以使用用户代理嗅探的替代方法 需要明确的是,window.open可以工作(其中works表示“它打开请求的url”)。不可靠的是使用window.opener和postMessage进行从“子

我有一些javascript依赖于window.open和窗口间通信的使用(其中新的“子”窗口)

这种(窗口间通信)在大多数情况下都可以正常工作,但对于一些不支持窗口间通信的浏览器不起作用。例子包括和

我目前使用客户端(基于javascript)来检测这些场景,并使用不同的代码路径来解决这个问题

我是否可以使用用户代理嗅探的替代方法


需要明确的是,window.open可以工作(其中works表示“它打开请求的url”)。不可靠的是使用window.opener和postMessage进行从“子”到“父”的窗口间通信。

在opener窗口消息回调中,您可以向子窗口发送回复,如下所示:

function yourMessageCallback(event) {
  // your other handler stuff here...
  event.source.postMessage('Yeah I got it', event.origin);
}
然后,您可以在发送端设置计时器,以便在回复到达时清除:

// do your postmessage here

function notReceived() {
  // do stuff if the message didn't go through
}

var messageTimer = setTimeout(notReceived, 500); // 500ms should be enough for everyone?

window.addEventListener('message', function(event) {
  // do necessary origin checks first etc... (not shown here)

  if (event.data == 'Yeah I got it') {
    clearTimeout(messageTimer);
    // do stuff if the message went through
  }
}, false);

我知道这可能是一个有点黑客的解决方案,但可能不如用户代理嗅探那么简单?

孩子还可以访问window.opener属性(应该为null),但不幸的是,这不是一种可靠的检测技术。例如,如果直接打开子窗口(不使用父窗口中的window.open),则window.opener将为null,即使子窗口实际上支持窗口间通信。我知道
window.open
可以工作,但是函数会返回子窗口ID吗?我不确定有这些信息会有什么帮助。我想要的是子窗口内的特征检测,以确定它是否可以与其父窗口对话。window.open函数调用的返回值显然只对父函数可用,因此“它相当于位于这个密闭舱口的另一边”。综上所述,检查返回值会在mobileie9中生成null,在UIWebView中生成一个window对象。请注意,在这两种情况下,新窗口都已正确加载(但将无法与其父窗口通信)。您尝试了哪些检测方法?省略测试时会出现哪些错误?还是一切正常执行,只是没有发送消息?使用BNC连接器,您可以获得更好的跨浏览器支持:。检测非常简单,我认为,您尝试与子窗口通信,如果失败,则无法工作…:-)我担心我可能误解了你的建议。第一个代码块是否放置在父窗口内,第二个代码块是否放置在子窗口内?记住这一点。或者你是在建议‘试试postMessage,如果我们没有收到‘ack’,那么我们就知道它不起作用’。?这可能行得通,但可能与我原来帖子的第二条评论有相同的问题。因此,如果最终用户在浏览器中直接打开子窗口,而不是父窗口的window.open,那么您建议的技术将无法检测是否支持帧间通信。是的,我只是建议检查我们是否返回确认。我认为你的目的是检查你是否真的能把信息传达给父母,而不是理论上是否可能(如果它没有以错误的方式打开)。不幸的是,我没有答案。