我将提出一个我的问题的修改示例来简化这个问题,但我的完整示例的本质是相同的:
我需要在webview中加载一个html代码,这段代码假定要声明一些javascript函数 . 示例HTML代码:
<html>
<body><h1>JavaScript Math.random()</h1>
<p>A random number:</p>
<p id="demo"></p>
<script>showRandomValue();</script>
</body>
</html>
在此示例中,代码假定一个名为 showRandomValue()
的声明函数 . 所以我需要在执行代码之前注入此函数 . 这是我要注入的功能:
<script>
function showRandomValue() {
document.getElementById("demo").innerHTML = Math.random();
}
</script>
直到现在我在加载webview中的代码之前这样做了:
public static final String JAVASCRIPT_FUNCTION =
"javascript:function showRandomValue() {\n" +
" document.getElementById(\"demo\").innerHTML = Math.random();\n" +
" }";
webView.loadUrl(JAVASCRIPT_FUNCTION);
webView.loadData(HTML_CODE, "text/html", "UTF-8");
这对我很有用,直到我想将targetSdkVersion更新为24.如果我设置 targetSdkVersion 24
,此代码停止工作,因为代码加载时找不到该函数 .
修改android WebView文档我发现了这个:
兼容性说明 . 针对N或更高版本的应用程序,来自空WebView的JavaScript状态不再在loadUrl(String)等导航中保留 . 例如,在加载的页面中不存在调用loadUrl(String)之前定义的全局变量和函数 . 应用程序应使用addJavascriptInterface(Object,String)来跨导航持久化JavaScript对象 .
我的问题是,使用 addJavascriptInterface
你可以声明一个自定义对象,所以我可以声明:
webview.addJavascriptInterface(new MyInterface(),"javaInterface");
并使用例如 javaInterface.getRandomValue()
调用其方法 . 但是我不能用这种方法声明全局函数 .
Important :我无法编辑或修改HTML代码,因为它来自第三方服务器 .
如何让这段代码在android 7中再次运行?
如果要测试它,这是完整的示例代码:
public class MainActivity extends Activity {
private WebView webView;
String HTML_CODE = "<html>\n" +
"<body><h1>Hello World</h1>\n" +
"<p>A random number:</p>\n" +
"<p id=\"demo\"></p>\n" +
"<script>showRandomValue();</script>\n" +
"</body>\n" +
"</html>";
public static final String JAVASCRIPT_FUNCTION = "(function showRandomValue() {document.getElementById(\"demo\").innerHTML = Math.random();})";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("javascript:" + JAVASCRIPT_FUNCTION);
webView.loadData(HTML_CODE, "text/html", "UTF-8");
}
}
使用targetSdkVersion 23编译此代码将起作用,而targetSdkVersion 24将无法显示随机数
1 回答
我知道你说你不能修改HTML ...但是如果你使用预取内容执行loadData,我没有看到任何反对在script标签中将你想要的函数注入html head的理由 . 总而言之,你做的事情已经有点过时了 .