我有一些javascript依赖于使用window.open和窗口间通信(其中新的'子'窗口communicates success / failure to the 'parent' window)。
这种(窗口间通信)在大多数情况下工作正常,但对于某些不支持窗口间通信的浏览器不起作用。示例包括Windows Phone和iPhone's UIWebView。
我目前做客户端(基于javascript)user-agent sniffing来检测这些情况 - 并回退到不同的代码路径来解决问题。
我可以使用用户代理嗅探的替代方法吗?
要清楚,window.open可以工作(其中的工作意味着'它打开请求的网址')。 不是可靠的是使用window.opener和postMessage进行从'child'到'parent'的窗口间通信。
答案 0 :(得分:2)
在您的开启窗口消息回调中,您可以将回复发送回子窗口,如下所示:
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);
我知道这可能是一个有点hackish的解决方案,但可能不如用户代理嗅探?