簡體   English   中英

Android WebView JavascriptInterface屬性

[英]Android WebView JavascriptInterface Property

嘿,我正在使用必須與一些javascript(咖啡)代碼交互的應用程序。 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() {
 ...

我在這里遇到兩個問題,首先,您似乎無法向全局窗口對象添加屬性。 其次,當我將接口名稱更改為其他名稱時,我似乎無法弄清楚如何添加屬性而不是方法。

我可以使它以這種方式工作:

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

有人做過這樣的事情嗎?

謝謝!

瀏覽器(和WebView)中的window對象已經具有window屬性,該屬性指向相同的對象。 嘗試在JavaScript調試器控制台中對此進行評估:

> window.window === window
< true

因此,嘗試注入名稱為"window"的Java對象將產生令人困惑的結果,並且可能會破壞代碼,因為您可能會破壞此不變式。

確實,Java Bridge僅通過屬性公開函數對象,不支持公開getter或setter。 不過,您可以通過自己定義getter和setter來使用JavaScript魔術來克服這一問題。 您將需要在注入的對象上公開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都具有相同的含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM