uni-app中app用js创建的子webview加载html时执行evalJs报错 w.evalJs is not a function

发布于 1周前 作者 h691938207 来自 Uni-App

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


1 回复

uni-app 中,使用 plus.webview.create 创建的子 Webview 并加载 HTML 后,调用 evalJs 方法时出现 w.evalJs is not a function 的错误,通常是因为 Webview 对象尚未完全加载或初始化完成。

以下是一些可能的原因和解决方法:


1. 确保 Webview 已加载完成

evalJs 方法只能在 Webview 完全加载完成后调用。你可以在 Webviewloaded 事件中执行 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');
    }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!