Если мне нужно назначить функцию щелчка динамически, существует ли способ гарантировать, что функция click назначается только один раз и не дублируется?
this.click(function(){
alert('test');
})
Если мне нужно назначить функцию щелчка динамически, существует ли способ гарантировать, что функция click назначается только один раз и не дублируется?
this.click(function(){
alert('test');
})
Вы можете отменить событие клика, прежде чем связывать его снова, таким образом, у вас будет только одно связанное с ним событие:
//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 - это пространство имен.
С 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) {...});
Я хотел бы добавить к Marius ответ -
Во избежание дублирования привязок вы не хотите случайно отменить что-то, если предполагается, что существует несколько функций, связанных с событием. Это особенно важно, когда вы работаете над чем-то с несколькими разработчиками. Чтобы предотвратить это, вы можете использовать пространство имен событий:
//assuming this is a jquery object.
var alertEvent = 'click.alert'
this.unbind(alertEvent).bind(alertEvent,function(){
alert('clicked once');
});
Здесь "alert" - это имя пространства имен для вашего события click, и только ваши функции, связанные с этим пространством имен, будут несвязаны.
предполагая, что элементы добавляются в 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" и не будет снова получен...