在jQuery中绑定自定义事件时触发代码

Trigger code when custom event is being bound in jQuery

本文关键字:代码 事件 自定义 jQuery 绑定      更新时间:2023-09-26

JQuery非常支持自定义事件- .bind("foo", function(e)...。但是,如果触发事件的机制还没有准备好,只能在那些绑定了事件的元素上构建呢?

例如,我想要一个scrollin事件,当一个元素被滚动到一个视口时被触发。要做到这一点,我将onscroll必须检查所有的元素和trigger scrollin在那些外面的视口,现在是在里面。这是不能接受的。

有一些技巧可以加快速度。例如,其中一个插件检查"private"$.cache中的所有元素,并且只检查那些具有scrollin事件绑定的元素。

但那也很丑。我需要的是一个额外的回调事件的绑定(额外的回调处理),这将照顾滚动管理,即把元素(s)到一些elementsCheckOnScrol缓存数组。

我在找这样的东西:

$.delegateBind("scrollin", function(jqSelection) { ... });
element.bind("scrollin", function(e) {..}); //Calls ^ after internal bind management
编辑:这将是一个很好的api!
$.bind("bind", function(onWhat) { ... }) 

: -)

如果我没有误解您的话,您可以像这样修补bind方法:

(function($) {
    var oldBind = $.fn.bind;
    $.fn.bind = function(name) { 
        if(name === "scrollin") {
             delegateFunction(this);
        }
        oldBind.apply(this, arguments);
    };
})(jQuery);

它所做的是检查scrollin是否被绑定,如果是,调用您的委托函数。之后,它只是调用原来的bind函数,它做所有jQuery的事情,就像它经常做的那样。

添加了这段代码之后,您可以这样使用它:http://jsfiddle.net/pimvdb/g4k2G/.

function delegateFunction(selection) {
    alert(selection.length);
}
$('a').bind('scrollin', function() {});

请注意,这并不支持将对象字面量传递给.bind(只支持(name, func)),但您也可以实现这一点。

我发现了一个$.event.special API,但我不知道它是"多少"公共。它不在文档中,并且之前至少更改过一次。http://benalman.com/news/2010/03/jquery-special-events/