gpt4 book ai didi

javascript - 如何在 android 7 中加载 html 之前在 webview 中注入(inject) javascript 脚本

转载 作者:太空狗 更新时间:2023-10-29 15:19:48 24 4
gpt4 key购买 nike

我将展示我的问题的修改示例以简化这个问题,但我的完整示例的本质是相同的:

我需要在 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() 的函数。所以我需要在代码执行之前注入(inject)这个函数。这是我要注入(inject)的功能:

<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 文档我发现了这个:

Compatibility note. Applications targeting N or later, JavaScript state from an empty WebView is no longer persisted across navigations like loadUrl(String). For example, global variables and functions defined before calling loadUrl(String) will not exist in the loaded page. Applications should use addJavascriptInterface(Object, String) instead to persist JavaScript objects across navigations.

我的问题是使用 addJavascriptInterface 你可以声明一个自定义对象,所以我可以声明:

webview.addJavascriptInterface(new MyInterface(),"javaInterface");

并调用其方法,例如,javaInterface.getRandomValue()。但是我不能用这个方法声明全局函数。

重要提示:我无法编辑或修改 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 将无法显示随机数

最佳答案

我知道您说过您不能修改 HTML...但是如果您使用预取内容加载数据,我看不出有任何理由反对将您想要的功能注入(inject)到脚本标记中的 html 头中。总而言之,您所做的一切已经有点老套了。

关于javascript - 如何在 android 7 中加载 html 之前在 webview 中注入(inject) javascript 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41741794/

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