2012-12-05 97 views
0

關於如何從Titanium WebView傳遞事件的常見解釋包括從Web視圖中的HTML中調用Ti.App.fireEvent()。但是,我想傾聽webview本身而不是全局Ti.App對象,以便來自不同webview的重複事件不會觸發不適當的上下文代碼。清潔的方式將事件從webview傳遞給Titanium?

例如,如果我聽取Ti.App的「OK_BUTTON」事件,它將意味着不同的東西,這取決於它在被調用的流程中的位置。所以,我必須爲每個上下文刪除並添加新的偵聽器。

有一種文檔化的方式,使用未定義協議「xxxx://」的常規HTML定位標記直接從webview傳遞事件,並捕獲Titanium中隨後出現的錯誤事件。有沒有更好的方法來做到這一點呢?按預期保持「錯誤」事件的錯誤將是很好的。

回答

1

我認爲您需要使用webview中的Ti.App.fireEvent(),但將標識源webview的數據添加到事件中。

例如爲每個webview分配一個唯一的id,並通過在webview的'load'事件處理程序中執行'evalJS()'將其傳遞到webview。 (或者通過在你的html中設置id,如果你有Titanium生成的話)

+0

這是一個很好的辦法做到這一點。 –

+0

從webviews中注意fireEvent。這部分功能仍然充滿了bug和不可靠性,特別是在Android上,特別是在遠程URL上。 – Wytze

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');");