javascript - 运行我的 JS 脚本时,Android 5.0 WebView undefined is not a function 错误

标签 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;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);
            }
        }
    }

问题是在 Android 操作系统版本 5.0 和 5.1 上它不起作用,但对于其他版本它工作正常。 我调试了我的JS,发现问题出在这部分代码

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

JS 抛出 Exception 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());
}

最佳答案

我在使用旧版 Android 时遇到了同样的问题。看起来那些版本的 WebView 没有 String.prototype.startsWith 或 String.prototype.endsWith 并且需要 polyfill。我在我的 JS 中添加了以下 2 个 polyfill 来修复它。

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

关于javascript - 运行我的 JS 脚本时,Android 5.0 WebView undefined is not a function 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649402/

相关文章:

android - 在Webview末尾添加 View

javascript - 如何使 Meteor React 内联 svg 元素单击链接到页面而不刷新整个页面

javascript调用新的HTML页面

java - Android Drawable getTransparentRegion() 不工作

android - 在 Android 的音乐播放器中播放音频文件

JavaFX2 WebView 和内存中图像

java - 如何设置 JavaFX WebView 的编码?

javascript - 单击顶部按钮不适用于 AngularJS Router 链接

javascript - 如何向 javascript 文本区域添加一个计数器,该计数器像 Twitter 一样计数,但不是向下计数,而是最多增加到 150 个字符

android - 禁用客户端对搜索栏的更改