2017-08-12 47 views
2

我使用JS腳本從Web頁面獲取一些數據。我加載這個包含JS代碼的String。Android 5.0 WebView undefined不是運行我的JS腳本時的函數錯誤

private static final String SCRAPE_SOME_DATA = "javascript:(function(){" + 
      "var myJson;" + 
      "var scrs = document.getElementsByTagName('script');" + 
      "for(var i=0;i<scrs.length;i++) {" +                  
      "try {" +                         
      "if(Boolean(scrs[i].innerHTML) && scrs[i].innerHTML.startsWith('userLayer')) {" +       
      "var al = scrs[i].innerHTML;" + 
      "var s = al.indexOf('[');" + 
      "if(s>-1) {" +                      
      "var e = al.indexOf('];', s+2);" + 
      "myJson = al.substring(s,e+1);" + 
      "}" +                        
      "break;" + 
      "}" +                                                 
      "} catch (e) {" +                     
      "}" +                          
      "}" +                          
      "if(Boolean(myJson)) {" + 
      "window." + SCRAPER + ".setUserLayer(myJson)" + 
      "}" + 
      "})();"; 

然後我加載此代碼在我的WebView

webView.loadUrl(BookingScraper.SCRAPE_SOME_DATA); 

網頁contuses很多標籤「腳本」的,我只需要其中只有一個名字是userLayer。我從這個層的數據轉換爲字符串並使用@JavascriptInterface轉移了串到我的Java方法

 @JavascriptInterface 
    public void setUserLayer(String userLayer) { 
     if (userLayer != null) { 
      try { 
       Log.d("logs", userLayer); 
      } catch (JSONException exception) { 
       Crashlytics.log(dataLayer); 
       Crashlytics.logException(exception); 
      } 
     } 
    } 

的問題是,在Android操作系統版本5.0和5.1這是行不通的,但對於其他版本,它的工作確定。 我調試我的JS,結果發現,問題出在這部分代碼

scrs[i].innerHTML.startsWith('dataLayer') 

JS拋出異常類型錯誤:undefined是不是一個函數。我不知道爲什麼?爲什麼它適用於其他Android操作系統版本?

注意: 我已經啓用

webView.addJavascriptInterface(myScrapper, Mycraper.MY_SCRAPER); 
    webView.getSettings().setDomStorageEnabled(true); 
    webView.setWebChromeClient(new WebChromeClient()); 
    webView.setWebViewClient(new BookingWebViewClient()); 
} 

回答

0

我遇到了同樣的問題,與舊版本的Android。它看起來像這些版本的WebView沒有String.prototype.startsWith或String.prototype.endsWith並且需要polyfills。我向我的JS添加了以下2個polyfills來修復它。

startsWith()

if (!String.prototype.startsWith) { 
    String.prototype.startsWith = function(searchString, position){ 
     return this.substr(position || 0, searchString.length) === searchString; 
    }; 
} 

endsWith()

if (!String.prototype.endsWith) 
    String.prototype.endsWith = function(searchStr, Position) { 
     // This works much better than >= because it compensates for NaN: 
     if (!(Position < this.length)) 
      Position = this.length; 
     else 
      Position |= 0; // round position 
      return this.substr(Position - searchStr.length, searchStr.length) === searchStr; 
    }; 
相關問題