我想问一个元素是否会响应实时事件,而不会实际触发该事件。
HTML
<div id="foo">Click me!</div>
JS
$('#foo').live('mousedown', function() {
console.log('triggered mousedown event');
}
if ($('#foo').__willRespondToLiveEvent__('mousedown')) {
console.log('#foo is wired up properly');
}
这是一个有点简单和人为的例子,但我正在寻找一个实际适用于__willRespondToLiveEvent__
伪代码的替换。
是否有jQuery在没有实际触发事件的情况下咳出这些信息?
答案 0 :(得分:6)
如果你想要一个可以传递选择器的实用程序,你可以这样做:
示例: 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
。因此,选择器需要是完全匹配。
修改强>
这是一个修改后的版本,使用.is()
针对为{1}提供的.live()
选择器测试jQuery对象。只要对象中的一个元素与该事件的.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'));
编辑:修复了@Gaby未分配.live()
个事件时的崩溃问题。
答案 1 :(得分:0)
忘了我的回答..错过了问题的live
部分..
查看patrick的answer
var events = $('#foo').data('events');
if (events)
{
for (var event in events)
console.log('#foois wired up for the "'+event+'" event');
}
这将打印#foo
设置为通过jQUery处理的所有事件。
用于if
var events = $('#foo').data('events');
if (events && events['click'])
{
console.log('#foo is wired up properly');
}
击> <击> 撞击>