2011-10-19 21 views
0

複数のオプションを持つセレクタがオプショングループにグループ化されています。オプトグループラベルをクリックしたときに、すべてのオプションの選択/選択解除を切り替えようとしています。jQueryを使用して選択オプションを切り替えます

初期ロード時に問題なく動作しますが、セレクタ間でオプションをコピーして戻す機能もあります。オプションがコピーされると、私のトグルは機能しなくなります。

$("optgroup").toggle(function(){ 
    $(this).children().attr("selected", "selected"); 
}, function() { 
    $(this).children().attr("selected", false); 
}); 

ここではcopy/remove scriptです。

+0

最新のバージョンのjQueryを使用している場合は、 'prop'メソッドを使用する必要があります。以前のバージョンのjQueryを使用している場合は、 'attr( 'selected'、false)の代わりに' removeAttr( 'selected') 'を使用してください。 ' – zzzzBov

答えて

3

これはないはあなたに必要なUXを与えるだろうが、それはトグルイベントはunbindedなって、あなたが持っている問題を解決します:あなたが使用することができますいずれかhttp://jsfiddle.net/rkw79/SwrVK/9/

$("select").delegate('optgroup', 'click', function() { 
    $(this).toggle(function() { 
     $(this).children().attr("selected", "selected"); 
    }, function() { 
     $(this).children().attr("selected", false); 
    }); 
}); 

を.live ()または.delegate();問題は、 'クリック'や 'ホバー'のようなベースイベントでのみ動作し、 'トグル'のような派生イベントではない(これが上にラップされた理由です)。

この解決策は、バインド解除の問題を解決することに注意してください。しかし、UXの点では、いくつかの調整が必要です。

更新:UXの追加http://jsfiddle.net/rkw79/SwrVK/15/

は、私はあなたの意図は、グループをクリックしたときにすべての子のオプションを選択することだと思います。以下のコードはそれを行います。

$("select").delegate('optgroup', 'click', function() { 
    $(this).children().attr("selected", "selected"); 
}); 

以下のコードは、各子オプションを個別に選択できるようにしています。イベントはノードツリー上に伝播しますので、ノードツリーを防止する必要があります(この場合)。

$("select").delegate('option', 'click', function(e) { 
    e.stopPropagation(); 
}); 
+0

それはすべて正しく見えますが、完璧な意味がありますが、最初のoptgroupを2回クリックしてすべての子供を選択しなければなりません... $( "optgroup")live( "click"、function(){はより合理的ですが結果はあまり良くはありません...奇妙な... – santa

+0

@santa:updated。UXであなたを助けるためのコードを追加しました。 – rkw

+0

これは素晴らしいです!しかし、選択を解除するトグルが失われました。オプションが選択されています。それらがすべて選択されているかどうかを調べるには、それぞれの追加の見た目が必要でしょうか? – santa

3

問題はトグルイベントをバインドすることと関係しています。オプトグループが選択項目の内外に移動するにつれて、イベントは新しく作成されたオプトグループに関連付けられなくなりました。悲しいことに、トグルイベントのライブバインディングはありません。

$("optgroup").live("click", function() { 
    var $children = $(this).children(); 
    if($children.attr("selected")) { 
     $children.attr("selected", false); 
    } else { 
     $children.attr("selected", "selected"); 
    } 
}); 

これは、これまでのページで作成した任意のoptgroupsにクリックイベントを結合し、いくつかの予期せぬ副作用を持つことができ、心に留めておくください:あなたは、仕事のようなもので行われます、一緒に何かをハックすることができます。このリスクを軽減するためには、クラスを使用してライブを使用することをお勧めします。

http://jsfiddle.net/Lw6QC/

+0

+1私をビートしてください。私は同じ理由で同じ種類のソリューションを持っていました:http://jsfiddle.net/jfriend00/Lf3L4/ – jfriend00

+0

ええ、私は私のものを投稿したようにあなたを見ました。あなたは実際に私にそれを打つ。私は= Dとコメントできるので、私は答えが得られてうれしいです。 – jcbelanger

+0

私は実際にはまだこれらのjsfiddleの例でも問題を抱えています... optgroupsをクリックすると、そのoptgroupの子供の選択/選択解除を切り替える必要があります。そして、それはオンとオフを動作するようだ... – santa

関連する問題