Jquery предотвращает дублирование функции

Если мне нужно назначить функцию щелчка динамически, существует ли способ гарантировать, что функция click назначается только один раз и не дублируется?

this.click(function(){
    alert('test');
})

Ответ 1

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

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

Как и в jQuery 1.7, нажмите сейчас .on(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 - это пространство имен.

Ответ 2

С 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) {...}); 

Ответ 3

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

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

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

Здесь "alert" - это имя пространства имен для вашего события click, и только ваши функции, связанные с этим пространством имен, будут несвязаны.

Ответ 4

предполагая, что элементы добавляются в 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();

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