我的Android应用程序有一个活动,在从磁盘(而不是互联网)加载XHTML页面后,脚本被注入到WebView中。
这个应用程序最初的目标是API级别12,并编译到相同的SDK级别,但我不得不更新它,新的规则使我的目标API级别26。
我还编译到了不同的SDK级别,比如17、19,因为我必须在对象的公共方法上使用@JavascriptInterface注释,以允许脚本调用Java代码中的方法。
我的经验是,WebView被卡住是因为出现错误“未捕获SyntaxError:输入意外结束”( Chrome远程调试没有更多信息),如果我在安卓7设备上测试应用程序,而应用程序在安卓4设备上运行,即使应用程序的应用程序接口级别没有针对或编译到,也会发生这种情况。
我读了很多关于语法错误导致这种错误的答案,或者代码中的注释行,但这非常奇怪,因为旧设备没有问题,应用程序运行得很好。
我在gradle文件中尝试了许多组合。
有没有其他可能考虑让我的应用程序正常工作?
发布于 2018-12-06 03:55:35
许多原因可能导致类似或类似的错误(通常错误消息没有帮助或意义)。首先,如果您可以拥有最低SDK = API级别19 (KITKAT,Android 4.4)或更高级别,请使用
webView.evaluateJavascript(String script,new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
}
});
而不是
webView.loadUrl("javascript: doSomething();");
从KITKAT以上的安卓版本(4.4)有Chrome WebView而不是旧的安卓WebView,新的版本在JavaScript注入的loadUrl上有问题,它在评估JavaScript (或者它有一些bug)方面更严格。
在使用loadUrl (以及一般情况下)时,请注意:
-Using字符串文字分隔符的双引号而不是单引号(但在某些特殊情况下可能不是),
示例:
ch=""\"; //it is good
ch='"'; // it is bad
-When在源代码行中使用双引号作为分隔符将代码注入到事件侦听器中。
示例:
var string="parameter";
element.setAttribute("onclick","doSomething('"+stringVar+"');return false;"); // good
-Using curly brakets在"if“子句后面,而不是一个直接语句,例如:
if (i>0) {doSomething(i);} // good
if (i>0) doSomething(i); // bad
-Being注意正则表达式(某些字符可能对正则表达式本身、结果以及JavaScript解释器/编译器造成伤害)。
https://stackoverflow.com/questions/53594132
复制相似问题