簡體   English   中英

在沒有loadUrl或XHR的情況下在android.webkit.WebView中執行javascript代碼

[英]execute javascript code in an android.webkit.WebView without loadUrl or XHR

我正在編寫一個phoneGap插件,以允許在android設備上進行多點觸摸(希望最終將其包含在phonegap / callback中)

事件委托使用插件成功回調大約需要200毫秒,而使用WebView.loadUrl('javascript:somecodehere()')調用則需要大約50毫秒

不幸的是,loadUrl具有使軟鍵盤閃爍的副作用,這對於一般解決方案是不可接受的。

Phonegap的Plugin.success使用內部Web服務器和XmlHttpRequest對象發送數據,這種方法太慢了。

是否存在將javascript發送到網絡瀏覽器的第三種方法? (甚至向Javascript引擎發送戳以導致事件發生,以便該事件可以檢查自定義jsInterface對象)

看來我們已經開發出類似的東西

https://github.com/Philzen/webview-multitouch-polyfill

但是,我之前從未遇到過您描述的問題,但是也許您想在設備上進行測試或為該項目貢獻自己的專業知識。 它已在Cordova(Phonegap)路線圖上得到建議,因此我們將很高興為每個用戶和/或貢獻者提供幫助!

看一下WebView類中的addJavascriptInterface 聽起來更像您在尋找什么。

在您的插件中嘗試調用:

this.ctx.sendJavascript(statement);

速度不如loadUrl快,但可能比返回PluginResult快一點。

您可以使用一個本質上是數組列表和訪問器的Java對象來滾動自己的精簡消息隊列,然后使用addJavascriptInterface將其綁定到javascript上下文中,並注入一個使用setTimeout調用隊列訪問器方法的javascript輪詢循環。 每當您要執行JavaScript時,只需將其添加到您的arraylist中即可。 我不確定它的性能如何,但是也許值得一試?

class JSQueue {
    private ArrayList<String> messages;

    public String getMessage() {
        String message = "";
        if(messages.size() >0) {
            message = messages.remove(0);
        }
        return message;
    }
    public void addMessage(String message) {
        messages.add(message);
    }
}
JSQueue jsq = new JSQueue();
dc.appMobiCanvas.hiddenView.addJavascriptInterface(jsq, "jsq");
dc.appMobiCanvas.hiddenView.loadUrl("javascript:(function checkJSQ(){eval(jsq.getMessage());setTimeout(checkJSQ, 50);}})();");
//add messages via jsq.addMessage();

暫無
暫無

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

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