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

Ale*_*yne 5 javascript jquery events javascript-events

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

HTML

<div id="foo">Click me!</div>
Run Code Online (Sandbox Code Playgroud)

JS

$('#foo').live('mousedown', function() {
  console.log('triggered mousedown event');
}

if ($('#foo').__willRespondToLiveEvent__('mousedown')) {
  console.log('#foo is wired up properly');
}
Run Code Online (Sandbox Code Playgroud)

这是一个有点简单和人为的例子,但我正在寻找一个实际适用于__willRespondToLiveEvent__伪代码的替代品.

是否有jQuery在没有实际触发事件的情况下咳出这些信息?

use*_*716 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'));
Run Code Online (Sandbox Code Playgroud)

或者如果你想针对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'));
Run Code Online (Sandbox Code Playgroud)

请注意,这两个只检查选择器,因为这是.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'));
Run Code Online (Sandbox Code Playgroud)

编辑:修复了没有.live()分配事件时崩溃的问题,感谢@Gaby.

  • 将`evts`赋值更改为`var evts = $ .data(document);`和`if(evts)`更改为`if(evts && evts ['events'] && evts.events [type])`.否则,如果根本没有分配实时事件,它就会崩溃. (3认同)