是否可以在InAppBrowser中打开一个站点,让该站点使用window.open
打开另一个窗口,然后向另一个窗口发送消息(反之亦然)?
答案 0 :(得分:1)
InAppBrowser对于双向通讯有一个限制:InappBrowser不允许持续通讯
解决方案1(很少有限制)
使用 IFRAME :
var myIframe = document.getElementbyId(IFRAME_ID).contentWindow;
从父窗口发送msg
到iframe
:
myIframe.postmessage("Hello World", "*")
从父窗口接收msg
中的iframe
:
window.addEventListener("message", function(e)
{
// add your code here
});
将msg
从iframe
发送到父窗口:
window.parent.postmessage("msg from iframe", "*")
在msg
的父窗口中接收iframe
:
window.addEventListener("message", function(e)
{
// add your code here
});
限制条件:
如果最终尝试从一个域导航到另一个域,则可能会遇到与x-frame-options相关的错误。
解决方案2(推荐)
使用 cordova-plugin-wizviewmanager:从另一个视图发送消息:
wizViewMessenger.postMessage(message_data, targetView_name);
要从另一个视图接收消息:
window.addEventListener("message", function(event)
{
// add your code here
});
优势:
Github链接:
答案 1 :(得分:1)
Postmessage已经在未发布的版本上实现。您可以从inAppBrowser的git页面上派生最新的开发版本:https://github.com/apache/cordova-plugin-inappbrowser/ 在构建它之前,请记住删除当前组件并添加使用它的最新开发版本。 如其文档中所述,您可以像这样发送后消息:
inAppBrowserRef.executeScript({ code: "\
var message = 'this is the message';\
var messageObj = {my_message: message};\
var stringifiedMessageObj = JSON.stringify(messageObj);\
webkit.messageHandlers.cordova_iab.postMessage(stringifiedMessageObj);"
});
或者从inAppBrowser的应用程序内部,类似于:
const message = 'message'
const messageObj = {message: message}
const stringifiedMessageObj = JSON.stringify(messageObj)
if (window.webkit && Window.webkit.messageHandlers) {
console.log('postmessage call on webkit')
window.webkit.messageHandlers.cordova_iab.postMessage(stringifiedMessageObj)
}
您可以在cordova中收听它,就像:
this.inAppBrowserRef.on('message').subscribe((event) => {
console.log(' postmessage received')
const postObject:any = event
if(postObject.data.message){
console.log(postObject.data.message)
}
})