从webview将事件传递给Titanium的干净方法?

时间:2012-12-05 05:05:20

标签: uiwebview titanium

如何从Titanium webview传递事件的常见解释包括从webview中的HTML调用Ti.App.fireEvent()。但是,我想听取webview本身而不是全局Ti.App对象,因此来自不同webview的重复事件不会触发上下文的不适当代码。

EG。如果我听Ti.App的“OK_BUTTON”事件,它将意味着一些不同的东西,取决于它被调用的流程在哪里。因此,我必须为每个上下文删除并添加新的侦听器。

有一种文档记录方法可以直接从webview传递事件,使用普通的HTML锚标记和未定义的协议“xxxx://”并在Titanium中捕获随后的错误事件。有没有更清洁的方法呢?如预期的那样保持错误的“错误”事件会很好。

2 个答案:

答案 0 :(得分:1)

我认为您需要使用网络浏览中的Ti.App.fireEvent(),但需要将标识源网络视图的数据添加到活动中。

e.g。为每个网络视图分配一个唯一的ID,并通过在webview的'load'事件处理程序中执行'evalJS()'将其传递到webview中。 (或者如果你有Titanium生成那个,你可以在你的html中设置id)

答案 1 :(得分:0)

这是一个基本的实用程序模块,它为webview分配一个id,并为webview上下文提供一个函数fireEvent(),该函数将触发Titanium中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');");