我使用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());
}