2012-02-06 2 views
0

goog.events предоставляет метод unlistenByKey, позволяющий осуществлять конкретную дерегистрацию слушателя по его уникальному идентификатору. Правильно ли, что единственный способ получить этот ключ - вызывать либо goog.events.listen с каждым типом событий, прослушиваемым или вызывающим goog.events.getListener с каждым прослушиваемым типом события?Упорядочение событий с помощью unlistenByKey в google-закрытии

например.

var eventKeys = new Array(2); 
goog.events.listen(document, ['mousedown', 'touchstart'], this.pressStartHandler_, false, this); 
eventKey[0] = goog.events.getListener(document, 'mousedown', this.pressStartHandler_, false, this); 
eventKey[1] = goog.events.getListener(document, 'touchstart', this.pressStartHandler_, false, this);  

EDIT

Запрещая лучший совет от отвечающего, я написал следующую обертку, чтобы получить ключи:

/** 
* Wrap goog.events.listen to capture all of the event keys of the requested listeners. 
* 
* @param {(EventTarget | 
*   goog.events.EventTarget | null)} src The node to listen to events on. 
* @param {(Array | 
*   null | string)} type Event type or array of event types. 
* @param {(Object | 
*   null)} listener Callback method, or an object with a handleEvent function. 
* @param {(boolean | 
*   undefined)} opt_capt Whether to fire in capture phase (defaults to false). 
* @param {(Object | 
*   null | undefined)} opt_handler Element in whose scope to call the listener. 
* @returns {Array.<number>} Array of keys for listeners 
*/ 
wias.util.listen = function(src, type, listener, opt_capt, opt_handler) 
{ 
    var i; 
    var keys = new Array(); 
    goog.events.listen(src, type, listener, opt_capt, opt_handler); 
    if (type instanceof Array) 
    { 
    for (i = 0; i < type.length; i++) 
    { 
     keys.push(goog.events.getListener(src, type[i], listener, opt_capt, opt_handler).key); 
    } 
    } 
    else 
    { 
    keys.push(goog.events.getListener(src, type, listener, opt_capt, opt_handler).key); 
    } 
    return keys; 
}; 

ответ

1

Вы могли бы найти goog.events.EventHandler полезным.

// Note that all handler callbacks receive 'this' as the opt_handler, by default. 
var handler = new goog.events.EventHandler(this); 
handler.listen(
    document, ['mousedown', 'touchstart'], this.pressStartHandler_, false); 

// Some time later... 
handler.removeAll(); 

Чтобы ответить на исходный вопрос, goog.events.listen также возвращает ключ при использовании одного типа события. Вы можете быть немного более правильными и краткими в своей реализации выше, итерации по каждому типу событий, называя goog.events.listen для каждого и сохраняя ключ для каждого из них.

wias.util.listen = function(src, type, listener, opt_capt, opt_handler) { 
    var keys = new Array(); 
    if (type instanceof Array) { 
    for (var i = 0; i < type.length; i++) { 
     keys.push(goog.events.listen(src, type, listener, opt_capt, opt_handler)); 
    } 
    } else { 
    keys.push(goog.events.listen(src, type, listener, opt_capt, opt_handler)); 
    } 
    return keys; 
};