安卓5.0的WebView在运行我的JS脚本时出现undefined is not a function错误

3
我正在使用JS脚本从网页中获取一些数据。我加载了包含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);

网页包含许多标签 'script',我只需要其中一个标签,它的名称是 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);
            }
        }
    }

问题在于,对于安卓5.0和5.1版本不起作用,但对于其他版本来说是正常的。我调试了我的JS代码并发现问题出现在下面这段代码中:

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

JS抛出异常TypeError: Undefined is not a function。我不知道为什么?为什么它适用于其他Android操作系统版本?

注意: 我已经启用了

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

1
我在旧版本的Android中遇到了同样的问题。看起来那些版本的WebView没有String.prototype.startsWith或String.prototype.endsWith,需要使用polyfills。我添加了以下两个polyfills到我的JS中来解决它。

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;
    };

0

对我来说,问题出在includes上。

 if (MY_STRING.includes("X1X")) {  // Error
     return true;
 }

然后我使用了indexOf

 if (MY_STRING.indexOf("X1X") > 0 ) {
     return true;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接