2013-12-06 4 views
0

Я пытаюсь удалить обработчик события из элемента, связанного с jQuery's on() и удаляя его с помощью off(). Обычно это будет работать, но в этом случае ничего не происходит.jQuery off() и bind (this)

this.element.on('click', this.handler); 
this.element.off('click', this.handler); 

Это будет работать, но в моем случае оно не работает из-за привязки области к обработчику.

this.element.on('click', this.handler.bind(this)); 
this.element.off('click', this.handler.bind(this)); 

Из-за рамки становится привязан к обработчику, метод off не может отделить событие от элемента.

Я попытался с помощью ссылки, например, так:

var self = this; 
this.element.on('click', this.handler.bind(self)); 
this.element.off('click', this.handler.bind(self)); 

Но не повезло ... кто не имеет представления о том, чтобы решить эту проблему?

+1

Попробуйте сохранить результат 'this.handler.bind (self)' в переменной и передать его по ссылке. Для того чтобы unbind работать, если вы передаете ему функцию, функция должна быть той же функцией, которая была передана привязке. вызов .bind() снова создает новую функцию. –

+0

Умный ход! Да, это сработает, но делает мой код своего рода неаккуратным, в этом случае мне нужно переписать много кода и сделать его методом/свойством моего класса, потому что мой attaing и detaching не находятся в одной и той же функции. – barry

+0

Разве вы не можете сделать то, что сделал Дэн в своем ответе? или это сложнее, чем это. –

ответ

5

Альтернативным решением для хранения ссылок на одной функции будет использовать событие пространств имёно.

this.element.on('click.iamspecial', this.handler.bind(this)); 
this.element.off('click.iamspecial'); 
+0

Мне это нравится! Я попробую это, спасибо – barry

2

Я хотел бы попробовать что делает явно Bound вещи ссылки:

var h = this.handler.bind(this); 
this.element.on('click', h); 
this.element.off('click', h); 
+0

Спасибо Dan! Я рассмотрю этот подход. :) – barry

Смежные вопросы