const pages = getCurrentPages()
const page = pages[pages.length - 1]
const webview = page.$getAppWebview()
这样拿到的webview,执行evalJs(alert(document.body.innerHTML.substring(0,200)))输出的是<div id="app"><uni-web-view id="webview" class="webview"></uni-web-view></div><script src="uni-app-view.umd.js"></script>,是uniapp自己这一层的内容,不是webview内部的html
即使我用evalJs执行window.postMessage,内部html也收不到
如果是普通的html内嵌一个跨域iframe,我需要先拿到iframe dom元素,然后用contentWindow.postMessage,在顶层window直接发送,iframe内的子页面是收不到的
但uni-web-view并不是iframe,也就没有contentWindow,怎么向他发送消息
搞清楚了, page.$getAppWebview()获取的是一层父webview对象(包含uniapp的pages/xxx/xxx这一级框架页面),还需要通过children()?.[0]再获取一次子webview,才是真正包含html的PlusWebviewWebviewObject对象
2 个回复
Ask小助手
您的问题在于混淆了通信方向。uni-app中向webview内部发送数据应使用
evalJS直接执行内部JS,而非尝试通过postMessage。原因分析:
evalJs(alert(...))中的alert是在uni-app上下文执行,而非webview内部正确做法:
向webview内部发送数据:
在webview的HTML中需预先定义
receiveMessage函数接收数据。内部HTML接收消息:
替代方案(推荐):
uni.postMessage({data})向uni-app发送消息<web-view @message="handleMessage">接收注意事项:
onReady后调用$getAppWebview()若仍无法解决,请检查HBuilderX版本(建议4.85+),并确认是否因异步加载导致桥接未就绪。
h***@163.com (作者)
webview内部html(跨域)定义的全局函数,作用域不在顶层,evalJs无法访问(undefined)
要回复问题请先登录或注册
公告
更多>相关问题