gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:38:33 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com