2012-03-29 51 views
1

我創建了一個名爲slides.swap的自定義事件,但是我想阻止trigger()click發生的事件。它不工作。我如何從trigger()那裏做到這一點? 我知道我可以阻止它在click函數中,但我只想保留所有「封裝」。是否可以在觸發器中使用.preventDefault()jQuery

JS:

tabs.on('click', 'a', function(e){ 
    $(this).trigger('slides.swap', e); 
}); 

//Custome event 
tabs.find('a').bind('slides.swap', function(e){ 
    var self = $(this), 
     selfIndex = self.parent().index(), 
     targetSlide = slides.eq(selfIndex); 

    e.preventDefault(); //somehow this doesn't work 

    //fade in/out slides 
    slides.filter('.active').stop(true, false).fadeOut(speed, function(){ 
     $(this).removeClass('active'); 
    }); 
    targetSlide.stop(true, false).fadeIn(speed).addClass('active'); 
    tabs.removeClass('selected'); 
    self.parent().addClass('selected'); 
}); 

非常感謝

+0

我不明白你爲什麼需要這個自定義事件。你不能直接將匿名函數綁定到click事件嗎? – alextercete 2012-03-30 01:38:20

回答

2

你的swap事件,這是不同click事件的事件對象上調用preventDefault()。嘗試在傳遞給slides.swap處理程序的事件對象上調用preventDefault();

tabs.find('a').bind('slides.swap', function(e, clickEvent){ 
    if (typeof clickEvent === "object" && typeof clickEvent.preventDefault === "function") { // Check the parameter was provided and that it was an event object. 
     clickEvent.preventDefault(); 
    } 

    // everything else 
}); 

雖然這不是很好的程序設計,但必須說。這是錯誤來操縱另一個事件鏈/對象。

+0

感謝您的回答@Matt。那麼,如果我可以問,我怎麼能更好地設計我的程序呢? – Shaoz 2012-03-29 12:10:45

+0

@Shaoz:我看不到在'slides.swap'處理程序或'click'處理程序中取消事件之間的功能差異?在'click'處理程序中執行它似乎是最好和最正確的選擇。 – Matt 2012-03-29 12:19:41

+0

很酷,我想我會堅持從'click'處理器取消,就像你說的那樣。感謝您的提示。 – Shaoz 2012-03-29 13:38:57

相關問題