You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebView中evaluateJavascript无法执行,如何在已加载WebView中执行JS?

解决WebView中执行JavaScript并获取返回值的问题

你的代码存在几个关键问题,调整后就能正常执行JS并获取值:

  1. 重复设置WebViewClient
    你连续调用了两次myWebView.setWebViewClient(),第一次的实例会被第二次覆盖,属于冗余代码,建议只保留一个。

  2. WebView默认不支持alert弹窗
    WebView要弹出alert需要设置WebChromeClient,否则alert不会生效,也不会有任何提示。

  3. evaluateJavascript需要返回具体值
    如果要获取JS执行后的结果,需要让你的匿名函数返回目标值,而不是用alert。

修正后的完整代码示例:

WebView myWebView = (WebView) findViewById(R.id.webload);
WebSettings webSettings = myWebView.getSettings();

// 启用JavaScript
webSettings.setJavaScriptEnabled(true);
// 允许JS弹窗需要设置WebChromeClient
myWebView.setWebChromeClient(new WebChromeClient());

myWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        // 执行JS并返回需要的值,比如获取页面标题
        view.evaluateJavascript("(function(){ return document.title; })();", givenValue -> {
            if (givenValue != null && !givenValue.isEmpty() && !givenValue.equals("null")) {
                // 这里处理获取到的值,比如写入文件
                // 注意:evaluateJavascript的回调在主线程,可以直接操作UI或执行文件写入
            }
        });
        super.onPageFinished(view, url);
    }
});

myWebView.loadUrl("https://www.example.co.uk");

额外注意事项:

  • 权限问题:如果后续要写入文件,确保已经申请了对应的文件读写权限(Android 6.0及以上需要动态申请)。
  • 跨域问题:如果加载的页面和你的APP存在跨域限制,可能需要在WebSettings中设置setAllowUniversalAccessFromFileURLs(true)或对应跨域配置,但谨慎使用,避免安全风险。
  • 线程安全:evaluateJavascript的回调是在主线程执行的,不需要额外切换线程就能处理UI或文件操作。

内容的提问来源于stack exchange,提问作者king cannibal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:50:17