[英]JavaScriptInterface methods not recognizable (Android webview)
[英]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.