android4.4 webview呼叫javascript出現Uncaught ReferenceError: is not define或者has no method
阿新 • • 發佈:2018-12-30
這幾天用Nexus5 4.4.4系統做一個簡單的手機裝置號獲取,然後呼叫javascript顯示在網頁裡的功能,以前做過n多類似的程式,結果程式一執行啥問題都出來了,呵呵
[INFO:CONSOLE(1)] "Uncaught ReferenceError: is not define
I/chromium(490): [INFO:CONSOLE(1)] "Uncaught SyntaxError: Unexpected token ILLEG
[Android] Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'
總結來看就是上述問題,先看程式碼吧
demo.html
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>無標題文件</title> </head> <script> function getDeviceID(info){ alert("裝置號:"+info); //document.write("裝置號:"+info); return "good."; } </script> <body> <a href="http://www.baidu.com" target="_blank"> href="http://www.baidu.com" 開啟baidu </a> <br/> <br/> <a href="http://www.baidu.com/closeappwin" target="_blank"> href="http://www.baidu.com/closeappwin" 關閉瀏覽器closeappwin </a> <br/> <br/> <a href="new://www.sohu.com/" target="_blank"> href="new://www.sohu.com/" 在當前瀏覽器開啟一個子瀏覽器new subwindow </a> <br/> <br/> </body> </html>
看看我的android 程式碼如下:
private void loadUrl(){ String key=""; String androidID=""; try{ androidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID); Log.d(TAG, "androidID:"+androidID); }catch(Exception e){ Log.e(TAG, ""); }finally{ String script=String.format("javascript:getDeviceID('"+androidID+"')"); mWebview.evaluateJavascript(script, new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.d(TAG, "onReceiveValue value=" + value); if(value!=null){ flag_get_deviceid=true; } }}); //mWebview.loadUrl("javascript:getDeviceID('maomao')"); } }
當loadUrl方法在activity的oncreate方法裡,mWebview.loadUrl("file:///android_asset/demo.html"); 執行之後呼叫loadUrl();
基本上就出現上面的錯誤了,我想是不是4.4的系統在寫法上跟低版本不一樣,還是用了2種呼叫方式:
mWebview.evaluateJavascript
mWebview.loadUrl("javascript:getDeviceID('maomao')");
那最後的判斷就是一種可能: 呼叫getDeviceID 方法的時候,js沒有載入完畢。
解決辦法:
private class WebViewClientDemo extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d(TAG, " url:"+url);
view.loadUrl(url);// 當開啟新連結時,使用當前的 WebView,不會使用系統其他瀏覽器
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//在這裡執行你想呼叫的js函式
if(!flag_get_deviceid){
loadUrl();
}
}
}
我們在 onPageFinished的時候,全部的js肯定都載入完畢了,這時候再執行loadUrl方法,就可以啦。
最後順便提一下 webview.evaluateJavascript的好處,這個方法,可以把js函式的return結果獲取到:
mWebview.evaluateJavascript(script, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.d(TAG, "onReceiveValue value=" + value);
if(value!=null){
flag_get_deviceid=true;
}
}});
- 加入CSDN技術群:221057495 與我交流