Android WebView无法执行JavaScript 桌面/移动浏览器可正常加载
Android WebView 内JavaScript无法执行修复方案
现有代码存在3个直接导致JS运行失败的问题:
- 配置顺序错误:先调用
loadUrl()触发页面加载,之后才开启JavaScript权限,页面初始加载阶段JS处于禁用状态,首屏注入的JS逻辑会被直接拦截 - 自定义WebViewClient未生效:代码中给WebView绑定的是默认空实现的
WebViewClient,自行实现的mywebClient类未实例化绑定,URL跳转逻辑不生效 - 缺少动态网页必需的运行配置:仅开启
setJavaScriptEnabled(true)不足以支撑绝大多数现代站点运行,DOM存储、JS弹窗权限、混合内容加载等配置默认处于关闭状态,会导致JS运行时报错中断
修复步骤
- 调整代码执行顺序:所有WebSettings配置、WebViewClient绑定操作,必须放在
loadUrl()调用之前完成 - 补全必需的WebSettings配置项
- 绑定自定义的WebViewClient实现,替换默认空实例
修复后完整代码
package com.example.eduquiz; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Bitmap; import android.os.Bundle; import android.webkit.CookieManager; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { private WebView mywebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mywebView=(WebView) findViewById(R.id.webview); // 所有配置必须在loadUrl之前完成 WebSettings webSettings=mywebView.getSettings(); webSettings.setJavaScriptEnabled(true); // 补全缺失的必要配置 webSettings.setDomStorageEnabled(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setAllowFileAccess(true); webSettings.setAllowContentAccess(true); webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // 开启第三方Cookie支持,适配站点登录/状态留存逻辑 CookieManager.getInstance().setAcceptThirdPartyCookies(mywebView, true); // 绑定自定义的WebViewClient,不要用默认空实现 mywebView.setWebViewClient(new mywebClient()); // 所有配置完成后再加载目标地址 mywebView.loadUrl("https://eduquizitmda.000webhostapp.com/"); } public class mywebClient extends WebViewClient{ @Override public void onPageStarted(WebView view, String url, Bitmap favicon){ super.onPageStarted(view,url,favicon); } @Override public boolean shouldOverrideUrlLoading(WebView view,String url){ view.loadUrl(url); return true; } } @Override public void onBackPressed(){ if(mywebView.canGoBack()) { mywebView.goBack(); } else{ super.onBackPressed(); } } }
若补全配置后仍存在JS执行异常,可通过实现
WebChromeClient重写onConsoleMessage方法,打印页面JS的控制台报错日志,直接定位异常点做针对性兼容。
内容的提问来源于stack exchange,提问作者Dewald
相关产品推荐
相关产品推荐

