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

时间:2011-08-23 15:27:59

标签: javascript jquery events custom-events

JQuery非常支持自定义事件 - .bind("foo", function(e)...。但是,如果触发事件的机制尚未准备好并且必须仅在那些绑定了事件的元素上构建呢?

例如,我希望在元素滚动到视口时触发scrollin事件。要做到这一点,我onscroll必须检查所有元素,并trigger scrollin检查那些位于视口之外且现在位于其中的元素。这是不可接受的。

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

但那也很难看。我需要的是事件的绑定的附加回调(除了处理的回调之外),它将负责滚动管理,即将元素放入某些{{ 1}}缓存数组。

我正在寻找类似的东西:

elementsCheckOnScrol

编辑:这将是一个很好的api!

$.delegateBind("scrollin", function(jqSelection) { ... });
element.bind("scrollin", function(e) {..}); //Calls ^ after internal bind management

: - )

2 个答案:

答案 0 :(得分:0)

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

(function($) {
    var oldBind = $.fn.bind;

    $.fn.bind = function(name) { 
        if(name === "scrollin") {
             delegateFunction(this);
        }

        oldBind.apply(this, arguments);
    };
})(jQuery);

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

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

function delegateFunction(selection) {
    alert(selection.length);
}

$('a').bind('scrollin', function() {});

请注意,这不支持将对象文字传递给.bind(仅(name, func)),但您也可以实现它。

答案 1 :(得分:0)

我找到了一个$.event.special API,但我不知道它有多“公开”。它不在文档中,至少在之前已经更改过一次。 http://benalman.com/news/2010/03/jquery-special-events/