【发布时间】:2018-06-28 13:09:38
【问题描述】:
在我的项目中,我有一个 WebView,它加载了一个页面 (HTML)。
我想更改所有图像并在用户单击任何图像时显示祝酒词。
所以我添加了调用 Java 函数的 javascript 代码:
// code is inside onPageFinished(..) function
JavaScriptInterface jsInterface = new JavaScriptInterface(activity);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");
webView.evaluateJavascript(
"var imgs = document.getElementsByTagName('img');" +
"for (var i = 0; i < imgs.length; i++) {" +
"imgs[i].src = 'file:///android_asset/rules_images_placeholder.png';" +
"imgs[i].addEventListener('click', function() {" +
"window.JSInterface.showToast(); " + // <-- isn't called: see logs
"});" +
"} " +
"window.JSInterface.showToast();" // <-- is called
, null);
JavaScriptInterface 类:
public class JavaScriptInterface {
private Activity activity;
public JavaScriptInterface(Activity activity) {
this.activity = activity;
}
@JavascriptInterface
public void showToast() {
Toast.makeText(activity, "Toast message", Toast.LENGTH_SHORT).show();
}
}
showToast() 应该在什么时候调用
页面已完成加载
用户点击了图片
问题:showToast() 仅被调用一次 - 当页面完成加载时。
当用户点击图片时,showToast() 不会被调用,而是出现以下日志:
未捕获的类型错误:无法读取未定义的属性“showToast””, 来源:
问题
点击图片时如何调用showToast()?
【问题讨论】:
-
这绝对是你会做的事情(假设第一个电话有效,如你所说)。与您的真实代码相比,您是否过于简化了示例(如果这不是您的真实代码)?具体来说,在您的真实代码中,您是否在事件处理程序中使用
i?因为那将是this problem。 -
T.J. Crowder:其实我并没有简化代码——我已经剪切和粘贴了。
-
在这种情况下,您需要查看自页面加载和点击后发生的变化。错误消息告诉您
window.JSInterface是(现在)undefined,而之前它具有不同的值(对您的对象的引用)。出于某种原因,情况发生了变化。我认为我们无法从上面的问题中看出 什么 发生了变化,但这就是您想要寻找的。span>
标签: javascript android