- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我将展示我的问题的修改示例以简化这个问题,但我的完整示例的本质是相同的:
我需要在 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/
我正在尝试测试依赖于其他服务 authService 的服务 documentViewer angular .module('someModule') .service('docu
如果我的网站上线(不要认为它会,目前它只是一个学习练习)。 我一直在使用 mysql_real_escape_string();来自 POST、SERVER 和 GET 的数据。另外,我一直在使用 i
我有以下代码,它容易受到 SQL 注入(inject)的攻击(我认为?): $IDquery = mysqli_query($connection, "SELECT `ID` FROM users W
我一直在自学如何创建扩展,以期将它们用于 CSS 注入(inject)(以及最终以 CSS 为载体的 SVG 注入(inject),但那是以后的问题)。 这是我当前的代码: list .json {
这个简单的代码应该通过 Java Spring 实现一个简单的工厂。然而结果是空指针,因为 Human 对象没有被注入(inject)对象(所以它保持空)。 我做错了什么? 谢谢 配置 @Config
我正在编写一个 ASP.NET MVC4 应用程序,它最终会动态构建一个 SQL SELECT 语句,以便稍后存储和执行。动态 SQL 的结构由用户配置以用户友好的方式确定,具有标准复选框、下拉列表和
首先让我说我是我为确保 SQL 注入(inject)攻击失败而采取的措施的知己。所有 SQL 查询值都是通过事件记录准备语句完成的,所有运算符(如果不是硬编码)都是通过数字白名单系统完成的。这意味着如
这是 SQL 映射声称可注入(inject)的负载: user=-5305' UNION ALL SELECT NULL,CONCAT(0x716b6b7071,0x4f5577454f76734
我正在使用 Kotlin 和 Android 架构组件(ViewModel、LiveData)构建一个新的 Android 应用程序的架构,并且我还使用 Koin 作为我的依赖注入(inject)提供
假设 RequestScope 处于 Activity 状态(使用 cdi-unit 的 @InRequestScope) 给定 package at.joma.stackoverflow.cdi;
我有一个搜索表单,可以在不同的提供商中搜索。 我从拥有一个基本 Controller 开始 public SearchController : Controller { protected r
SQLite 注入 如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚
我可以从什么 dll 中获得 Intercept 的扩展?我从 http://github.com/danielmarbach/ninject.extensions.interception 添加了
使用 NInject 解析具有多个构造函数的类似乎不起作用。 public class Class1 : IClass { public Class1(int param) {...} public
我有一个 MetaManager 类: @Injectable() export class MetaManager{ constructor(private handlers:Handler
我是 Angular 的新手,我不太清楚依赖注入(inject)是如何工作的。我的问题是我有依赖于服务 B 的服务 A,但是当我将服务 A 注入(inject)我的测试服务 B 时,服务 B 变得未定
我正在为我的项目使用 android 应用程序启动、刀柄和空间。我在尝试排队工作时遇到错误: com.test E/WM-WorkerFactory: Could not instantiate co
我不确定这是什么糖语法,但让我向您展示问题所在。 def factors num (1..num).select {|n| num % n == 0} end def mutual_factors
简单的问题,我已经看过这个了:Managing imports in Scalaz7 ,但我不知道如何最小化注入(inject) right和 left方法到我的对象中以构造 \/ 的实例. 我确实尝
在我的 Aurelia SPA 中,我有一些我想在不同模块中使用的功能。它依赖于调用时给出的参数和单例的参数。有没有办法创建一个导出函数,我可以将我的 Auth 单例注入(inject)其中,而不必在
我是一名优秀的程序员,十分优秀!