2011-06-23 15 views
0

現在、3つのリンクを含むメニューがあります。これは、隠れたdivの関連性を開き、このjqueryコードを使用します(下記参照)。そのは「fooboxが」開いている場合は、元のdiv要素...jQuery open/close divのトグルを切り替える

すなわちを開けた後、ユーザーがfooboxは「いつものように

$('#foo').toggle(function(){ 
$('#foobox').animate({marginLeft: '354'}, 1000); 
}, 
function(){ 
    $('#foobox').animate({marginLeft: '0'}, 1000); 
}); 

$('#foo2').toggle(function(){ 
$('#foo2box').animate({marginLeft: '354'}, 1000); 
}, 
function(){ 
    $('#foobox3').animate({marginLeft: '0'}, 1000); 
}); 

$('#foo3').toggle(function(){ 
$('#foobox3').animate({marginLeft: '354'}, 1000); 
}, 
function(){ 
    $('#foobox3').animate({marginLeft: '0'}, 1000); 
}); 

を閉じます」「foobox2」を開くには、「foo2は」をクリックする閉じること開いたあなたに感謝あらかじめ。

答えて

2

アクティブなものであることを示す新しいクラスを追加します。そしてあなたが何かを開くたびに、アクティブなものを閉じます。

$('#foo').toggle(function(){ 
    $('.active').animate({marginLeft: '0'}, 1000).removeClass('active'); 
    $('#foobox').animate({marginLeft: '354'}, 1000).addClass('active'); 
    }, 
function(){ 
    $('#foobox').animate({marginLeft: '0'}, 1000).removeClass('active'); 
}); 

さらに、HTMLとjQueryを変更して1つのイベントハンドラだけを必要とすることをお勧めします。代わりに、この例の場合 :

<div id="foo">Link</div> 
<div id="foobox">Content</div> 

<div id="foo2">Link</div> 
<div id="foobox2">Content</div> 

あなたが行うことができ、次のjQueryを使って

<div class="foo" data-target="1">Link</div> 
<div id="foobox-1">Content</div> 

<div class="foo" data-target="2">Link</div> 
<div id="foobox-2">Content</div> 

を:

$('.foo').toggle(function(){ 

    $('.active').animate({marginLeft: '0'}, 1000).removeClass('active'); 
    $('#foobox-'+$(this).data('target')).animate({marginLeft: '354'}, 1000).addClass('active'); 

},function(){ 

    $('#foobox-'+$(this).data('target')).animate({marginLeft: '0'}, 1000).removeClass('active'); 

}); 
+0

を次のように

<div id="foo" class="menu"> <div id="foobox" class="special"></div> </div> <div id="foo2" class="menu"> <div id="foo2box" class="special"></div> </div> <div id="foo3" class="menu"> <div id="foobox3" class="special"></div> </div> 

とjQueryがなるあなたのhtmlこれは、私はそれがjfiddleに細かい仕事を得ることができますが後に、あなたに感謝何イムですと仮定私のスクリプト内ではない....私は少し考えて、もう一度感謝の周りに遊ぶ必要があるだろう。 – Dizzi

+1

これはそれだとは思いませんが、 '.data()'を受け付けないjQueryの古いバージョンを使用している可能性はありますか?何かエラーがありますか? 'console.log( 'test')'とコンソール(例えばFirebug)を使って、スクリプトのどこが間違っているのかを知ることができます。 – Kokos

+1

私は以前のjqueryバージョン(1.4.2)を使用していましたが、今度は完璧に動作してくれてありがとうございます:) – Dizzi

0
$('#foobox').animate({marginLeft: '354'}, 1000).data('open', true); 

データにあなたがdiv要素を開くたびに与えます、 divを開くたびに、他のすべてのdivに.data('open') == trueがあるかどうかを確認します。そうであれば、開いていることを意味します。そのデータ値を削除します。あなたが別のボックス、単に近くの$ opened_elementを開いたときに次に

$('#foobox').animate({marginLeft: '354'}, 1000); 
$opened_element = $('#foobox'); 

EDITは

また同様に、変数に開かれた要素を格納することができます。おそらく、それはあなたのコードを与えるグローバル変数でなければなりません。

1

で覆われていると考えている(#foo、#のfoo2は、#のfoo3 ...)クラスfooの はまた、すべてのfoobox要素に追加します( #foobox、#のfoobox2、#のfoobox3 ...)クラスfoobox 、これを使用します。その後、

$('.foo').live('click', function() { 
if (!$(this).next().is(':visible')) { 
$('.foobox').hide(); 
$(this).next().slideToggle(); 
if ($(this).next().is(':visible')) { 
    //DoSomething 
} 
} 
//DoSomething } 
}); 
+0

これは私より優れた解決策ですが、すべての 'foobox'が関連する' foo' 。すべての 'foo'が全ての' foobox'から分離した 'div'に入っていれば動作しません。 – Kokos

1

使用例class="special"用などのクラスと現在を開く前に閉鎖を置くか、そのクラス上のアニメーションアクションを逆にするjQueryのを使用しますクラスを持つすべてのメニューが閉じられ、現在の1つのw開かれない。

$('.special').live('click',function(){ 
    $('#foo').toggle(function(){ 
     $('.special').animate({marginLeft: '0'}, 1000); 
     $('#foobox').animate({marginLeft: '354'}, 1000); 
    }, 
    function(){ 
     $('#foobox').animate({marginLeft: '0'}, 1000); 
    }); 

    $('#foo2').toggle(function(){ 
     $('.special').animate({marginLeft: '0'}, 1000); 
     $('#foo2box').animate({marginLeft: '354'}, 1000); 
    }, 
    function(){ 
     $('#foo2box').animate({marginLeft: '0'}, 1000); 
    }); 

    $('#foo3').toggle(function(){ 
     $('.special').animate({marginLeft: '0'}, 1000); 
     $('#foobox3').animate({marginLeft: '354'}, 1000); 
    }, 
    function(){ 
     $('#foobox3').animate({marginLeft: '0'}, 1000); 
    }); 
}); 

Example on JSFIDDLE.net

関連する問題