2009-10-13 3 views

ответ

34

Вы можете отвязать событие щелчка, прежде чем связать его снова, таким образом, вы только еще одно событие, прикрепленную к нему:

//assuming this is a jquery object. 
this.unbind("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

На JQuery 1.7, нажмите теперь использует .На (http://api.jquery.com/click/), так что правильный код теперь

//assuming this is a jquery object. 
this.off("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

Это отвязать все события щелчка (в том числе, созданные с помощью каких-либо плагинов вы могли бы использовать). Чтобы убедиться, что вы только отменили пространство имен для использования событий. (http://api.jquery.com/off/)

//assuming this is a jquery object. 
this.off("click.myApp"); 
this.on("click.myApp", function(){ 
    alert("clicked once"); 
}); 

Здесь MYAPP является пространством имен.

+0

Отлично, делает именно то, что я хочу , Благодаря! – Roger

9

Я хотел бы добавить к answer--

избежать дублирующих привязок Marius в которые вы не хотите, чтобы случайно отвязать что-то, если там должно быть больше, чем одна функция связана с событием. Это особенно важно, когда вы работаете над чем-то с несколькими разработчиками. Чтобы предотвратить это, вы можете использовать событие: пространства имен

//assuming this is a jquery object. 
var alertEvent = 'click.alert' 
this.unbind(alertEvent).bind(alertEvent,function(){ 
    alert('clicked once'); 
}); 

Вот предупреждение 'этого имя пространства имен для вашего события щелчка и только ваших функций, которые были связаны с этим пространством именами будут несвязанными.

15

С JQuery .on() вы можете сделать что-то подобное:

//removes all binding to click for the namespace "myNamespace" 
$(document).off('click.myNamespace'); 

$(document).on('click.myNamespace', '.selector', function(event) {...}); 

//this will be also removed (same namespace) 
$(document).on('click.myNamespace', '.anotherSelector', function(event) {...}); 
+1

Спасибо за этот ответ, sieppl. Просто проверил документацию jQuery и в ней указано: 'Как и jQuery 1.7, метод .on() является предпочтительным методом привязки обработчиков событий к документу. Для более ранних версий метод .bind() используется для привязки обработчика события непосредственно к элементам. Обработчики привязаны к выбранным в данный момент элементам в объекте jQuery, поэтому эти элементы должны существовать в точке, где происходит вызов в .bind(). Для более гибкого связывания событий см. Обсуждение делегирования событий в .on() или .delegate(). ' Мой вывод: для большинства случаев это лучше, чем .bind() –

+0

@esco_: Да, я включил () полностью. Я никогда не использовал bind(), но остановил использование live() и delegate(). – sieppl

0

предполагая, что элементы добавляются в HTML и вы хотите добавить событие только добавляемые элементы:

function addEvents2Elements()//prevent Duplicate 
{ 
    //this will add the event to all elements of class="ele2addevent" 
    $('.ele2addevent').not('.clickbind').on('click',function(){alert('once');}) 

    //this will add a class an then the class="ele2addevent clickbind" 
    $('.ele2addevent').not('.clickbind').addClass('.clickbind'); 
    //all elements of class="... clickbind" will not be catched anymore in the first line because of .not() every time you call this function 
} 
addEvents2Elements(); 

быть shure, что вы добавляете только с классом = "ele2addevent", потому что после привязки он будет class = "ele2addevent clickbind" и не зацепился снова ...

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