-4

我有一些 javascript 依赖于 window.open 和窗口间通信的使用(新的“子”窗口将成功/失败传达给“父”窗口)。

这种(窗口间通信)在大多数情况下都可以正常工作,但不适用于某些不支持窗口间通信的浏览器。示例包括Windows PhoneiPhone 的 UIWebView

我目前进行客户端(基于 JavaScript)用户代理嗅探以检测这些场景 - 并回退到不同的代码路径以解决该问题。

我可以使用用户代理嗅探的替代方法吗?

需要明确的是,window.open 有效(其中有效的意思是“它打开请求的 url”)。可靠的是使用 window.opener 和 postMessage 进行从“孩子”到“父母”的窗口间通信。

4

1 回答 1

3

在您的开启窗口消息回调中,您可以像这样向子窗口发送回复:

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);

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

于 2013-02-25T14:14:29.690 回答