1. 程式人生 > >android4.4 webview呼叫javascript出現Uncaught ReferenceError: is not define或者has no method

android4.4 webview呼叫javascript出現Uncaught ReferenceError: is not define或者has no method

這幾天用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 與我交流