uni-app中app用js创建的子webview加载html时执行evalJs报错 w.evalJs is not a function
uni-app中app用js创建的子webview加载html时执行evalJs报错 w.evalJs is not a function
示例代码:
let w = plus.webview.create('http://m.weibo.cn/u/3196963860', 'custom-webview')
w.show()
操作步骤:
在uni-app中新建页面,在onLoad中用js创建的子webview打开html,然后执行evalJs
let w = plus.webview.getWebviewById('custom-webview')
console.log(w)
w.evalJs('alert("a")')
预期结果:
能执行
实际结果:
报错
TypeError: w.evalJs is not a function. (In ‘w.evalJs(‘alert(“a”)’)’, ‘w.evalJs’ is undefined) __ERROR
console.log(w)有信息
{
"__view_array__": [],
"__IDENTITY__": "NWindow",
"__uuid__": "NWindow81704868710219",
"__callbacks__": {},
"__callback_id__": "plus91704868710219",
"id": "custom-webview"
}
bug描述:
app中用js创建的子webview来加载html,执行evalJs报错,w.evalJs is not a function
在 uni-app
中,使用 plus.webview.create
创建的子 Webview
并加载 HTML 后,调用 evalJs
方法时出现 w.evalJs is not a function
的错误,通常是因为 Webview
对象尚未完全加载或初始化完成。
以下是一些可能的原因和解决方法:
1. 确保 Webview 已加载完成
evalJs
方法只能在 Webview
完全加载完成后调用。你可以在 Webview
的 loaded
事件中执行 evalJs
。
var w = plus.webview.create('https://example.com', 'webviewId', {
// 其他配置
});
w.addEventListener('loaded', function() {
w.evalJs('console.log("Webview loaded and evalJs executed");');
}, false);
w.show(); // 显示 Webview
2. 检查 Webview 对象的有效性
确保 w
是一个有效的 Webview
对象。如果 w
未正确创建或初始化,调用 evalJs
会报错。
if (w && typeof w.evalJs === 'function') {
w.evalJs('console.log("Webview is valid and evalJs is available");');
} else {
console.error('Webview or evalJs is not available');
}
3. 使用 setTimeout 延迟执行
如果 Webview
尚未完全加载,可以使用 setTimeout
延迟执行 evalJs
。
setTimeout(function() {
if (w && typeof w.evalJs === 'function') {
w.evalJs('console.log("evalJs executed after delay");');
}
}, 1000); // 延迟 1 秒
4. 检查平台兼容性
evalJs
是 HTML5+ API 提供的方法,确保你的代码运行在支持 HTML5+ 的环境中(如 App 端)。如果在 H5 或小程序端调用,会报错。
if (plus && plus.webview) {
// 确保在 App 端运行
var w = plus.webview.create('https://example.com', 'webviewId');
w.show();
w.evalJs('console.log("Running in App environment");');
} else {
console.error('plus.webview is not available');
}
5. 检查 Webview 是否已销毁
如果 Webview
已被销毁(例如调用了 w.close()
),再调用 evalJs
也会报错。确保 Webview
仍然存在。
if (!w.isVisible()) {
console.error('Webview is closed or not visible');
} else {
w.evalJs('console.log("Webview is still open");');
}
6. 使用 uni-app 的官方方法
如果是在 uni-app
中,建议使用官方提供的 uni.webview
方法,而不是直接操作 plus.webview
。
uni.webView.navigateTo({
url: 'https://example.com',
success: function(res) {
console.log('Webview opened');
}
});