mic*_*cah 5 javascript android postmessage inappbrowser
是否可以在 InAppBrowser 中打开一个站点,让该站点用于window.open打开另一个窗口,然后向该另一个窗口发送消息(反之亦然)?
小智 7
Postmessage 已经在未发布的版本上实现。你可以从他们的 git 页面在 inAppBrowser 上 fork 最新的开发版本:https : //github.com/apache/cordova-plugin-inappbrowser/ 在构建它之前记得删除当前组件并添加最新的开发版本以使用它. 正如他们在他们的文档中所描述的,你可以发送 postmessage,如:
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);"
});
Run Code Online (Sandbox Code Playgroud)
或者从 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)
}
Run Code Online (Sandbox Code Playgroud)
你可以在cordova里面听它,比如:
this.inAppBrowserRef.on('message').subscribe((event) => {
console.log(' postmessage received')
const postObject:any = event
if(postObject.data.message){
console.log(postObject.data.message)
}
})
Run Code Online (Sandbox Code Playgroud)
小智 1
InAppBrowser 在双向通信方面存在限制:InappBrowser 不允许连续通信
解决方案 1(一些限制)
使用IFRAME:
var myIframe = document.getElementbyId(IFRAME_ID).contentWindow;
Run Code Online (Sandbox Code Playgroud)
从父窗口发送msg到:iframe
myIframe.postmessage("Hello World", "*")
Run Code Online (Sandbox Code Playgroud)
msg从iframe父窗口接收:
window.addEventListener("message", function(e)
{
// add your code here
});
Run Code Online (Sandbox Code Playgroud)
发送msg到父窗口iframe:
window.parent.postmessage("msg from iframe", "*")
Run Code Online (Sandbox Code Playgroud)
msg在父窗口中接收来自iframe:
window.addEventListener("message", function(e)
{
// add your code here
});
Run Code Online (Sandbox Code Playgroud)
局限性:
如果您最终尝试从一个域导航到另一个域,您可能会收到与 x-frame-options 相关的错误。
方案2(推荐)
使用cordova-plugin-wizviewmanager:从一个视图到另一个视图发送消息:
wizViewMessenger.postMessage(message_data, targetView_name);
Run Code Online (Sandbox Code Playgroud)
要从一个视图接收另一个视图的消息:
window.addEventListener("message", function(event)
{
// add your code here
});
Run Code Online (Sandbox Code Playgroud)
优点:
GitHub 链接:
https://github.com/Wizcorp/cordova-plugin-wizviewmanager
| 归档时间: |
|
| 查看次数: |
7745 次 |
| 最近记录: |