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 将意味着相同的事情。