android4.4 webview調用javascript出現Uncaught ReferenceError: is not define或者has no method,webviewuncaught

來源:互聯網
上載者:User

android4.4 webview調用javascript出現Uncaught ReferenceError: is not define或者has no method,webviewuncaught

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


android代碼中webview怎調用JavaScript?

mWebView.setWebChromeClient(new MyWebChromeClient()); mWebView.addJavascriptInterface(new Object(){ /** * This is not called on the UI thread. Post a runnable to invoke * loadUrl on the UI thread. */ public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); 同理,在html中必須有一個名為demo的對象調用clickOnAndroid()方法。 /** * Provides a hook for calling "alert" from javascript. Useful for * debugging your javascript. */ final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { result.confirm(); return super.onJsAlert(view, url, message, result); } }
 
android開發中WebView載入了帶有flash的html網頁,為何在電腦上有效flash調用javascript這時失效

webview 需要設定enablejavascript(true)即允許webview執行javascript
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.