0

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

例如。如果我为“OK_BUTTON”事件收听 Ti.App,它的含义会有所不同,具体取决于它在流程中被调用的位置。因此,我必须为每个上下文删除并添加新的侦听器。

有一种记录方法可以使用普通的 HTML 锚标记和未定义的协议“xxxx://”直接从 web 视图传递事件,并在 Titanium 中捕获随后的错误事件。有没有更清洁的方法来做到这一点?按预期保留错误的“错误”事件会很好。

4

2 回答 2

1

我认为您需要Ti.App.fireEvent()从 webview 使用,但将标识源 webview 的数据添加到事件中。

例如,为每个 webview 分配一个唯一的 id,并通过在 webview 的 'load' 事件处理程序中执行 'evalJS()' 将其传递到 webview。(或者,如果您有 Titanium 生成它,则通过在您的 html 中设置 id)

于 2012-12-07T12:06:52.973 回答
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');");
于 2012-12-08T19:09:24.713 回答