【问题标题】:Trigger code when custom event is being bound in jQuery在jQuery中绑定自定义事件时触发代码
【发布时间】:2011-08-23 15:27:58
【问题描述】:

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

例如,我想要一个scrollin 事件,当元素滚动到视口时触发该事件。为此,我将onscroll 必须检查所有元素,trigger scrollin 必须检查那些在视口之外而现在在视口内的元素。这是不可接受的。

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

但这也很丑陋。我需要的是事件的 binding 的额外回调(除了处理回调之外),它将负责滚动管理,即将元素放入一些 @987654328 @缓存数组。

我正在寻找类似的东西:

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

编辑:这将是很好的 api!

$.bind("bind", function(onWhat) { ... }) 

:-)

【问题讨论】:

  • 事件委托,而 .live 方法可能会满足您的需求。一个小演示可以帮助我们帮助你;)

标签: javascript jquery events custom-events


【解决方案1】:

如果我没有误解你,你可以像这样修补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)),但您也可以实现它。

【讨论】:

  • 谢谢,这可行,但我希望有一些更干净的解决方案 :-)
  • @tillda:我不确定你想要的是否是原生内置的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多