作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 来修复它。
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;
};
关于javascript - 运行我的 JS 脚本时,Android 5.0 WebView undefined is not a function 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649402/
我是一名优秀的程序员,十分优秀!