gpt4 book ai didi

javascript - Android WebView JavascriptInterface 属性

转载 作者:行者123 更新时间:2023-11-28 19:01:22 25 4
gpt4 key购买 nike

嘿,我正在使用一个必须与一些 javascript (coffeescript) 代码交互的应用程序。代码 JS 代码如下所示:

$(".content").on "click", ".feedback", ->
window.webkit.foo.bar.message("hello")
false

所以我需要向我的 WebView 添加一个 javascript 接口(interface),例如:

 webView.addJavascriptInterface(new Window(), "window");
...
class Window {
@JavascriptInterface
public Webkit webkit() {
return new Webkit();
}
class Webkit {
@JavascriptInterface
public Foo foo() {
...

我在这里遇到两个问题,首先,您似乎无法向全局窗口对象添加属性。其次,当我将接口(interface)名称更改为其他名称时,我似乎无法弄清楚如何添加属性而不是方法。

我可以让它以这样的方式工作:

  webkit().foo().bar().message("hello")

有人做过这样的事吗?

谢谢!

最佳答案

浏览器(和 WebView)中的 window 对象已经有一个 window 属性,它指向同一个对象。尝试在 JavaScript 调试器控制台中对此进行评估:

> window.window === window
< true

因此,尝试注入(inject)名为 “window” 的 Java 对象会产生令人困惑的结果,并且可能会破坏代码,因为您可能会破坏这个不变量。

而且 Java Bridge 仅通过属性公开函数对象,它不支持公开 getter 或 setter。不过,您可以通过自己定义 getter 和 setter,使用一些 JavaScript 魔法来克服这个问题。您需要在注入(inject)的对象上公开 getter 和 setter 方法,然后使用 JavaScript 将它们分配为属性 getter setter。

因此,在 Java 中,您可以以不同的方式命名方法,例如:

webView.addJavascriptInterface(new Window(), "myWindow");

class Window {
@JavascriptInterface
public Webkit getWebkit() {
return new Webkit();
}
...

加载页面后,您可以执行如下 JavaScript 代码:

Object.defineProperty(myWindow, 'webkit', { get: myWindow.getWebkit });

那么调用 getWebkit() 和访问 myWindow 上的 webkit 将意味着相同的事情。

关于javascript - Android WebView JavascriptInterface 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32471105/

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