0

Titanium webview からイベントを渡す方法の一般的な説明には、webview の HTML から Ti.App.fireEvent() を呼び出すことが含まれます。ただし、グローバル Ti.App オブジェクトの代わりに webview 自体をリッスンしたいので、異なる webview からの重複したイベントがコンテキストに対して不適切なコードをトリガーしないようにします。

例えば。「OK_BUTTON」イベントで Ti.App をリッスンすると、フローのどこで呼び出されているかによって意味が異なります。そのため、コンテキストごとに新しいリスナーを削除して追加する必要があります。

未定義のプロトコル「xxxx://」で通常の HTML アンカー タグを使用し、Titanium で発生するエラー イベントをキャッチして、Web ビューから直接イベントを渡す方法が文書化されています。これを行うためのよりクリーンな方法はまだありますか?意図したとおりにエラーの「エラー」イベントを保持するとよいでしょう。

4

2 に答える 2

1

webviewから使用する必要があると思いますがTi.App.fireEvent()、ソース webview を識別するデータをイベントに追加します。

たとえば、各 Web ビューに一意の ID を割り当て、Web ビューの「load」イベント ハンドラで「evalJS()」を実行して、それを Web ビューに渡します。(または、Titanium がそれを生成している場合は、html に id を設定することによって)

于 2012-12-07T12:06:52.973 に答える
0

これは、id を webview に割り当て、Titanium の webView オブジェクトでイベントをトリガーする関数 fireEvent() を webview コンテキストに提供する基本的なユーティリティ モジュールです。

var listenerWebViews = {};

exports.createListenerWebView = function(config) {
    var id = createRandomString();
    var webView = Ti.UI.createWebView(config);

    webView.listenerId = id;

    webView.evalJS('function fireEvent(type, e) { var f = { originalType:type, listenerId:"'+id+'"}; Ti.App.fireEvent("WEBVIEW_LISTENER_EVENT", f); }');
    listenerWebViews[id] = webView;

    var oldRemoveFunction = webView.remove;
    webView.remove = function(){
        listenerWebViews[id] = null;
        oldRemoveFunction();
    }

    return webView;
}


Ti.App.addEventListener("WEBVIEW_LISTENER_EVENT", function(e){
    var webView = listenerWebViews[e.listenerId];
    if (webView) {
        webView.fireEvent(e.originalType, e);
    }
});

そのモジュールが含まれていると、これは機能します:

var view = module.createListenerWebView({
    url: 'myPage.html'
});

view.addEventListener('my_type', function(){
    alert('webview event!');
});

view.evalJS("fireEvent('my_type');");
于 2012-12-08T19:09:24.713 に答える