Если вам нужна утилита, в которую вы можете передать селектор, вы можете сделать это:
Пример: http://jsfiddle.net/NMBsG/3/
$('#foo').live('click', function() {
alert('hi');
});
(function($) {
$.hasLive = function(sel, type) {
var data = $.data(document);
if (data && data.events && data.events[type]) {
var evts = data.events[type];
for (var i = 0, len = evts.length; i < len; i++) {
if (evts[i].selector === sel) {
return true;
}
}
}
return false;
};
})(jQuery);
alert($.hasLive('#foo', 'click'));
Или, если вы хотите вызвать его для объекта jQuery, вы можете сделать это:
Пример: http://jsfiddle.net/NMBsG/4/
$('#foo').live('click', function() {
alert('hi');
});
(function($) {
$.fn.hasLive = function(type) {
var data = $.data(document);
if (data && data.events && data.events[type]) {
var evts = data.events[type];
for (var i = 0, len = evts.length; i < len; i++) {
if (evts[i].selector === this.selector) {
return true;
}
}
}
return false;
};
})(jQuery);
alert($('#foo').hasLive('click'));
Обратите внимание, что оба они проверяют только селектор, поскольку именно так работает .live()
. Вы можете реально выбрать тот же элемент, но с использованием другого подходящего селектора, и он вернет false
. Таким образом, селектор должен соответствовать точно .
EDIT:
Вот модифицированная версия, которая использует .is()
для проверки объекта jQuery с селекторами, которые были присвоены .live()
для предоставленного типа события. Пока один элемент в объекте соответствует обработчику .live()
для этого события, он должен возвращать true
.
Пример: http://jsfiddle.net/NMBsG/5/
var test = $('#foo').live('click', function() {
alert('hi');
});
(function($) {
$.fn.hasLive = function(type) {
var data = $.data(document);
if (data && data.events && data.events[type]) {
var evts = data.events[type];
for (var i = 0, len = evts.length; i < len; i++) {
if ( this.is(evts[i].selector) ) {
return true;
}
}
}
return false;
};
})(jQuery);
alert($('#foo').hasLive('click'));
РЕДАКТИРОВАТЬ: Исправлен сбой, когда не назначено .live()
событий, благодаря @Gaby.