2011-08-23 248 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

相關問題