Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 运行我的JS脚本时,Android 5.0 WebView未定义不是函数错误_Javascript_Android_Webview - Fatal编程技术网

Javascript 运行我的JS脚本时,Android 5.0 WebView未定义不是函数错误

Javascript 运行我的JS脚本时,Android 5.0 WebView未定义不是函数错误,javascript,android,webview,Javascript,Android,Webview,我正在使用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;

我正在使用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)" +
            "}" +
            "})();";
网页包含了很多“脚本”标签,我只需要一个名为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不是函数。我不知道为什么?为什么它适用于其他Android操作系统版本

注意: 我已经启用了

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

我在旧版本的Android上也遇到了同样的问题。这些版本上的WebView似乎没有String.prototype.StartWith或String.prototype.endsWith,并且需要多填充。我在我的JS中添加了以下2个多边形填充来修复它

if(!String.prototype.endsWith)
String.prototype.endsWith=函数(searchStr,位置){
//这比>=好得多,因为它补偿了NaN:
如果(!(位置<此长度))
位置=此长度;
其他的
位置|=0;//圆形位置
返回此.substr(位置-searchStr.length,searchStr.length)==searchStr;
};
 webView.addJavascriptInterface(myScrapper, Mycraper.MY_SCRAPER);
    webView.getSettings().setDomStorageEnabled(true);
    webView.setWebChromeClient(new WebChromeClient());
    webView.setWebViewClient(new BookingWebViewClient());
}
if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position){
        return this.substr(position || 0, searchString.length) === searchString;
    };
}
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;
    };