Показать сообщение отдельно
  #4 (permalink)  
Старый 12.07.2008, 01:00
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Octane,

- если вы хотите detach'ить хэндлер, то при attach'e он не должен быть анонимным (т.е. функцию надо описать до этого);

- использование apply'я внутри обертки - это, конечно, хорошо (не надо каждый раз писать при добавлении события), но тогда, придется запоминать вновь созданную функцию (как свойство объекта), чтобы получить возможно удалить при detach'e. Поэтому, альтернативной может быть - apply "снаружи" перед bind'ом события к элементу (внутри, естественно, apply'ить (obj.attachEvent('on' + type, function() {listener.apply(obj);}); ) тогда уже не надо):

// вспомогательный wrapper для привязки this
Function.prototype.bind = function(object) {
  var __method = this;
  return function() {
    return __method.apply(object, arguments);
};

function a() {
  alert([this.tagName, this === window]);
}

var obj = $('test');
var handler = a.bind(obj);

obj.bind('click', handler);
obj.unbind('click', handler); // и тогда можно будет detach'ить


P.S. не очень удачно два раза название bind в разных местах получилось, но, думаю, путаницы не вызовет.

P.S.[2]: все методы для расширения объектов лучше вынести в отдельное место и при расширении ссылаться на них, а не создавать каждый раз новую анонимную функцию (это сэкономит ресурсы). А для FF и Opera можно вообще расширить прототип глобального объекта HTMLElement (и тогда все это будет храниться в одном месте; хотя для IE в этом случае так же можно использовать behavior и expression, но это уже отдельная песня и там свои косяки у expression с производительностью).
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 12.07.2008 в 01:05.
Ответить с цитированием