Отказ от участия в событиях с использованием unlistenByKey в закрытии Google - PullRequest
0 голосов
/ 06 февраля 2012

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

например,

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

РЕДАКТИРОВАТЬ

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

/**
 * 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 Ответ

1 голос
/ 04 февраля 2013

Вы можете найти 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;
};
...