如何检查点击事件是否已经绑定 – JQuery
我用一个button绑定一个单击事件:
$('#myButton').bind('click', onButtonClicked);
在一种情况下,这是多次调用,所以当我做trigger
我看到多个Ajax调用,我想要阻止。
如何bind
只有当它没有绑定之前。
更新12年8月24日 :在jQuery 1.8中,不再可能使用.data('events')
来访问元素的事件。 (有关详细信息, jQuery._data(elem, 'events')
错误 。)可以使用jQuery._data(elem, 'events')
访问相同的数据,这是一个内部数据结构,它没有logging,因此不能100%保证稳定。 但是,这不应该是一个问题,上面的插件代码的相关行可以更改为以下内容:
var data = jQuery._data(this[0], 'events')[type];
jQuery事件存储在一个名为events
的数据对象中,所以你可以在这里search:
var button = $('#myButton'); if (-1 !== $.inArray(onButtonClicked, button.data('events').click)) { button.click(onButtonClicked); }
当然,如果你可以构造你的应用程序,那么这个代码只会被调用一次。
这可以被封装成一个插件:
$.fn.isBound = function(type, fn) { var data = this.data('events')[type]; if (data === undefined || data.length === 0) { return false; } return (-1 !== $.inArray(fn, data)); };
你可以打电话给:
var button = $('#myButton'); if (!button.isBound('click', onButtonClicked)) { button.click(onButtonClicked); }
还有一种方法 – 用CSS类和filter标记这些button:
$('#myButton:not(.bound)').addClass('bound').bind('click', onButtonClicked);
在最近的jQuery版本中用bind
代替bind
:
$('#myButton:not(.bound)').addClass('bound').on('click', onButtonClicked);
如果使用jQuery 1.7+:
您可以off
之前off
:
$('#myButton').off('click', onButtonClicked) // remove handler .on('click', onButtonClicked); // add handler
如果不:
你可以解开它的第一个事件:
$('#myButton').unbind('click', onButtonClicked) //remove handler .bind('click', onButtonClicked); //add handler
我看到的最好的方法是使用live()或delegate()来捕获父项中的事件,而不是在每个子元素中。
如果您的button位于#parent元素内,则可以replace:
$('#myButton').bind('click', onButtonClicked);
通过
$('#parent').delegate('#myButton', 'click', onButtonClicked);
即使执行此代码时#myButton尚不存在。
我写了一个非常小的名为“一次”的插件。 在元素中执行off和on。
$.fn.once = function(a, b) { return this.each(function() { $(this).off(a).on(a,b); }); };
简而言之:
$(element).once('click', function(){ });
这是我的版本:
Utils.eventBoundToFunction = function (element, eventType, fCallback) { if (!element || !element.data('events') || !element.data('events')[eventType] || !fCallback) { return false; } for (runner in element.data('events')[eventType]) { if (element.data('events')[eventType][runner].handler == fCallback) { return true; } } return false; };
用法:
Utils.eventBoundToFunction(okButton, 'click', handleOkButtonFunction)
基于@ konrad-garus答案,但使用data
,因为我相信class
应该主要用于造型。
if (!el.data("bound")) { el.data("bound", true); el.on("event", function(e) { ... }); }
if ($("#btn").data('events') != undefined && $("#btn").data('events').click != undefined) { //do nothing as the click event is already there } else { $("#btn").click(function (e) { alert('test'); }); }
为什么不使用这个
bind()
之前的unbind()
bind()
$('#myButton').unbind().bind('click', onButtonClicked);
JQuery有解决scheme :
$( "#foo" ).one( "click", function() { alert( "This will be displayed only once." ); });
当量:
$( "#foo" ).on( "click", function( event ) { alert( "This will be displayed only once." ); $( this ).off( event ); });