jQuery:实时事件并查询元素是否会响应事件

时间:2010-12-22 23:47:20

标签: javascript jquery events javascript-events

我想问一个元素是否会响应实时事件,而不会实际触发该事件。

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在没有实际触发事件的情况下咳出这些信息?

2 个答案:

答案 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');
  }

<击>