如何从Titanium webview传递事件的常见解释包括从webview中的HTML调用Ti.App.fireEvent()。但是,我想听取webview本身而不是全局Ti.App对象,因此来自不同webview的重复事件不会触发上下文的不适当代码。
EG。如果我听Ti.App的“OK_BUTTON”事件,它将意味着一些不同的东西,取决于它被调用的流程在哪里。因此,我必须为每个上下文删除并添加新的侦听器。
有一种文档记录方法可以直接从webview传递事件,使用普通的HTML锚标记和未定义的协议“xxxx://”并在Titanium中捕获随后的错误事件。有没有更清洁的方法呢?如预期的那样保持错误的“错误”事件会很好。
答案 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');");