我想问一个元素是否会响应实时事件,而不实际触发该事件。
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 是否可以在不实际触发事件的情况下吐出此信息?
最佳答案
如果您想要一个可以向其传递选择器的实用程序,您可以这样做:
示例: 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()
来针对提供给 .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'));
编辑:修复了没有分配.live()
事件时的崩溃,感谢@Gaby .
关于javascript - 实时事件和查询元素是否将响应事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4514766/