0

我知道我可以附加这样的自定义事件

$("#customDropdownBox").on("clickOutside", function(){
    $(this).hide(300, hideCallback);
})

我知道我可以在正文上附加一个单击事件,以查找每个附加了自定义事件的元素,就像这样

$("body").on("click", function(event){
    $.each($("body *"), function(i, o){
        if($._data(o, "events") && $._data(o, "events")["clickOutside"])
            $(o).trigger("clickOutside");
    })
})

我想知道是否有更快的方法来执行此操作,而不必遍历 DOM 的所有 (*) 元素。我知道我可以使用类似的东西进行过滤

$("body div.classx")

但我宁愿不硬编码特定的 ID 或类。我想知道是否有一种选择器可以实现这一点。就像是

$("body *{event:'clickOutside'}")

或者

$.findEvent("clickOutside");
4

1 回答 1

0

为@Kevin B +1。我今天学到了新词“猴子补丁”和“打鸭子”:)。这就是我所做的。这是代码。"on" 和 "off" 方法的猴子补丁,如在此处详细说明和在此处循环说明

// Monkey patch on and off methods
(function($, window){
    window.clickOutside = [];
    var _oldOn = $.fn.on;
    $.fn.on = function(event,handler){
        if(event == "clickOutside"){
            $.fn.off.apply(this, arguments); // make sure the event is never registered twice
            window.clickOutside.push(this[0]);
        }
        return _oldOn.apply(this, arguments);
    };
    var _oldOff = $.fn.off;
    $.fn.off = function(event,handler){
        if(event == "clickOutside"){
            $.each(window.clickOutside, function(i, o){
                if(this == o){
                    window.clickOutside.splice(i, 1);
                }
            })
        }
        return _oldOff.apply(this, arguments);
    };
})(jQuery, window);

现在我的监听功能如下

// Listen for clickOutside/clickElseWhere events
$("body").on("click", function(event){
    var $target = $(event.target);
    $.each(window.clickOutside, function(i, o){
        if($._data(o, "events") && $._data(o, "events")["clickOutside"] && !$(o).find("*").andSelf().has($target).length){
            $(o).trigger("clickOutside");
        }
    });
});

这让我只循环具有该特定事件的元素。

于 2012-12-21T21:15:36.513 回答