2011-08-23 175 views
0

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

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

有一些技巧来加速它。例如,其中一个插件检查“私人”$.cache中的所有元素,并仅检查具有scrollin事件绑定的元素。

但这也很丑。我需要的是一个额外的回调事件的绑定(除了处理回调),这将负责滚动管理,即将元素放入一些elementsCheckOnScrol缓存阵列中。

我在寻找类似:

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

编辑:这将是很好的API!

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

:-)

+0

事件委托,并且.live方法可能会授予您想要的内容。一个小小的演示可以帮助我们;) – roselan

回答

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)),但你可以实现这一点。

+0

谢谢,这将工作,但我希望有一些更干净的解决方案:-) – tillda

+0

@tillda:我不知道你想要的是建立在本地。 – pimvdb

相关问题