javascript - 实时事件和查询元素是否将响应事件

标签 javascript jquery events jquery-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 是否可以在不实际触发事件的情况下吐出此信息?

最佳答案

如果您想要一个可以向其传递选择器的实用程序,您可以这样做:

示例: 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/

相关文章:

javascript - 尝试访问存储变量时,React Redux "Cannot read property ' status' of undefined“错误

jquery - 如何从服务器加载 html 并使用 jquery 选择器

javascript - jQuery $.extend() - 如果新成员不存在,如何不向第一个对象添加新成员?

vb.net - 你如何在 vb.net 中创建一个可取消的事件

javascript - 如何在 Javascript 中创建自定义事件类?

javascript - Angular Material datepicker + moment,为后端序列化 moment 对象?

javascript - 使用 JavaScript 的带背景图像的径向光标

javascript - typescript 索引获取/设置

javascript - 禁用元素不通过表单提交

javascript - 编写自定义 .on()/.bind() JavaScript 的最高效方式