Android WebView JavascriptInterface 属性
Android WebView JavascriptInterface Property
嘿,我正在使用一个必须与某些 javascript (coffeescript) 代码交互的应用程序。代码 JS 代码看起来像这样:
$(".content").on "click", ".feedback", ->
window.webkit.foo.bar.message("hello")
false
所以我需要向我的 WebView 添加一个 javascript 界面,例如:
webView.addJavascriptInterface(new Window(), "window");
...
class Window {
@JavascriptInterface
public Webkit webkit() {
return new Webkit();
}
class Webkit {
@JavascriptInterface
public Foo foo() {
...
我 运行 遇到两个问题,首先,您似乎无法向全局 window 对象添加属性。其次,当我将接口名称更改为其他名称时,我似乎无法弄清楚如何添加属性而不是方法。
我可以像这样让它工作:
webkit().foo().bar().message("hello")
有人做过这样的事吗?
谢谢!
浏览器(和 WebView)中的 window
对象已经有一个 window
属性,它指向同一个对象。尝试在您的 Java 脚本调试器控制台中对此进行评估:
> window.window === window
< true
因此,尝试注入名称为 "window"
的 Java 对象会产生令人困惑的结果,并且可能会破坏代码,因为您可能会破坏此不变量。
而且 Java Bridge 也只是通过属性暴露函数对象,不支持暴露 getters 或 setters。不过,您可以通过自己定义 getter 和 setter 来使用一些 JavaScript 魔法来克服这个问题。您需要在注入的对象上公开 getter 和 setter 方法,然后使用 JavaScript 将它们分配给 属性 getter setters .
因此,在 Java 中,您以不同的方式命名方法,例如:
webView.addJavascriptInterface(new Window(), "myWindow");
class Window {
@JavascriptInterface
public Webkit getWebkit() {
return new Webkit();
}
...
然后在加载页面后,您可以执行 Java这样的脚本代码:
Object.defineProperty(myWindow, 'webkit', { get: myWindow.getWebkit });
然后在 myWindow
上调用 getWebkit()
和访问 webkit
将意味着相同的事情。
嘿,我正在使用一个必须与某些 javascript (coffeescript) 代码交互的应用程序。代码 JS 代码看起来像这样:
$(".content").on "click", ".feedback", ->
window.webkit.foo.bar.message("hello")
false
所以我需要向我的 WebView 添加一个 javascript 界面,例如:
webView.addJavascriptInterface(new Window(), "window");
...
class Window {
@JavascriptInterface
public Webkit webkit() {
return new Webkit();
}
class Webkit {
@JavascriptInterface
public Foo foo() {
...
我 运行 遇到两个问题,首先,您似乎无法向全局 window 对象添加属性。其次,当我将接口名称更改为其他名称时,我似乎无法弄清楚如何添加属性而不是方法。
我可以像这样让它工作:
webkit().foo().bar().message("hello")
有人做过这样的事吗?
谢谢!
浏览器(和 WebView)中的 window
对象已经有一个 window
属性,它指向同一个对象。尝试在您的 Java 脚本调试器控制台中对此进行评估:
> window.window === window
< true
因此,尝试注入名称为 "window"
的 Java 对象会产生令人困惑的结果,并且可能会破坏代码,因为您可能会破坏此不变量。
而且 Java Bridge 也只是通过属性暴露函数对象,不支持暴露 getters 或 setters。不过,您可以通过自己定义 getter 和 setter 来使用一些 JavaScript 魔法来克服这个问题。您需要在注入的对象上公开 getter 和 setter 方法,然后使用 JavaScript 将它们分配给 属性 getter setters .
因此,在 Java 中,您以不同的方式命名方法,例如:
webView.addJavascriptInterface(new Window(), "myWindow");
class Window {
@JavascriptInterface
public Webkit getWebkit() {
return new Webkit();
}
...
然后在加载页面后,您可以执行 Java这样的脚本代码:
Object.defineProperty(myWindow, 'webkit', { get: myWindow.getWebkit });
然后在 myWindow
上调用 getWebkit()
和访问 webkit
将意味着相同的事情。