在安卓开发中,”加载完成JS”通常指以下两种场景:
通过WebViewClient
的onPageFinished
方法监听页面加载状态。
webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 页面加载完成后执行JS runJavascript(); } });
loadUrl("javascript: ...")
。evaluateJavascript
,支持回调。private void runJavascript() { String jsCode = "javascript:console.log('Page loaded')"; // 示例JS代码 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { webView.evaluateJavascript(jsCode, new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 处理JS返回值 Log.d("JSResult", value); } }); } else { webView.loadUrl(jsCode); } }
在React Native中,可通过PostMessage
或DeviceEventEmitter
实现通信。
JS端代码:
import { DeviceEventEmitter } from 'react-native'; DeviceEventEmitter.addListener('ON_PAGE_LOADED', () => { console.log('Page loaded in JS'); // 执行JS逻辑 });
webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 发送事件给JS reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("ON_PAGE_LOADED", null); } });
问题 | 解决方案 |
---|---|
JS未执行 | 检查onPageFinished 是否被触发;确认JS代码语法正确。 |
安卓与JS通信失败 | 确保addJavascriptInterface 已正确配置,且JS接口名称一致。 |
跨域问题 | 在JS中通过<meta http-equiv="Content-Security-Policy"> 允许访问本地URL。 |
解答:
webView.setWebContentsDebuggingEnabled(true);
chrome://inspect/#devices
,选择目标设备调试。 console.log
,通过Logcat查看输出(需开启WebView.setWebContentsDebuggingEnabled
)。解答:
window.onload
代替document.addEventListener('DOMContentLoaded')
,确保资源(如图片)加载完成。 Handler
延迟几百毫秒),等待渲染完成。 MutationObserver
监听DOM变化,确保结构稳定后再执行JS