2011-03-17 46 views
0

我有一個這樣的腳本,執行水平手風琴的動畫。每當手風琴上的不同滑道(li)被打開時,它就被放入「活動」對象內。如何從動畫中排除jQuery對象?

<script type="text/javascript" > 
$(document).ready(function(){ 
    active = $('ul li:first-child'); 

    $('ul li').click(
     function(){ 
     $(active).animate({width: '40px'}, { queue:false, duration:600 }); 
     $('div').fadeOut(100).delay(400).fadeIn(100); 
     $(this).animate({width: '660px'}, { queue:false, duration:600}); 
     active = this;   
     } 
    ); 
}); 
</script> 

的動畫所有工作的偉大,但唯一的問題是,當我點擊當前打開的滑動運行this--

$('div').fadeOut(100).delay(400).fadeIn(100);) 

如何排除運行此當前打開幻燈片?我試過。不是,但不是,但也許我做錯了。

+1

有些HTML會幫助我更好地理解你是否有它 – 2011-03-17 17:26:25

+0

我發現代碼中的幾個嚴重問題開始時很可能是無意的。以'$('div')....'開始的行會在點擊的整個頁面上淡化每個div。那真的是你想要的嗎?既然你寫的動畫工作正常,也許它的目的。其次,以'$(active).click(function()...'開頭的行每次點擊li時會綁定一個新的事件處理程序,您無法做到這一點,我相信您想要刪除在函數的_end_處輸入'return false'; – Thomas 2011-03-17 17:41:13

+0

考慮它,也許你打算把事件作爲參數e並在代碼中執行:'$('ul li')。click ( 函數(e){ e.stopPropagation(); [...] ' – Thomas 2011-03-17 17:46:02

回答

1

嘗試把保護條款設置動畫什麼... 像

if (active == this) return; 

如點擊處理函數第一行之前?

+0

非常感謝,這工作! – Nicholas 2011-03-17 18:47:08

1

不應該

if(this != active[0]) $('div').fadeOut(100).delay(400).fadeIn(100); 

工作?

0

jQuery有一個鮮爲人知的方式來處理這個問題。使用.not()函數。你可以使用它從jQuery對象中移除元素。

我會做這樣的事情:

<script type="text/javascript" > 
$(document).ready(function(){ 
    active = $('ul li:first-child'); 

    $('ul li').not('li.open').click(
     function(){ 
     $(this).addClass('open'); 
     $(active).animate({width: '40px'}, { queue:false, duration:600 }); 
     $('div').fadeOut(100).delay(400).fadeIn(100); 
     $(this).animate({width: '660px'}, { queue:false, duration:600}); 
     $(active).click(function() { event.StopPropagation(); }); 
     active = this;   
     } 
    ); 
}); 
</script> 

重要的線。不是( 'li.open'),然後 「$(本).addClass( '開放')」。

您需要添加一種方法,在菜單關閉後從所有li中刪除'open'類,但不知道您的HTML我無法告訴您該如何做到最好。