WebView中evaluateJavascript无法执行,如何在已加载WebView中执行JS?
解决WebView中执行JavaScript并获取返回值的问题
你的代码存在几个关键问题,调整后就能正常执行JS并获取值:
重复设置WebViewClient
你连续调用了两次myWebView.setWebViewClient(),第一次的实例会被第二次覆盖,属于冗余代码,建议只保留一个。WebView默认不支持alert弹窗
WebView要弹出alert需要设置WebChromeClient,否则alert不会生效,也不会有任何提示。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
相关产品推荐
相关产品推荐

