複数の要素がフェードされている場合のコールバック関数は、期待どおりに機能し.fadeOut()
ませ.fadeIn()
ん。コールバックは1回だけでなく、すべての要素に対して呼び出されます。
console.log()
コールバックの1つに呼び出しを入れる.fadeOut()
と、それが複数回ログに記録されることがわかります。(Chrome開発ツールは、これを左側に番号が付いた単一のログエントリにまとめます。)
http://jqapi.com/#p=fadeOut
コールバック関数
指定した場合、アニメーションが完了するとコールバックが発生します。これは、さまざまなアニメーションを順番につなぎ合わせるのに役立ちます。コールバックには引数は送信されませんが、これはアニメーション化されるDOM要素に設定されます。複数の要素がアニメーション化されている場合、コールバックは、アニメーション全体に対して1回ではなく、一致した要素ごとに1回実行されることに注意することが重要です。
jQuery 1.6以降、.promise()メソッドをdeferred.done()メソッドと組み合わせて使用すると、一致するすべての要素がアニメーションを完了したときに、アニメーション全体に対して単一のコールバックを実行できます(.promiseの例を参照してください)。 ())。
.promise()
重複するコールバックを削除するために使用するコードのバージョンは次のとおりです。また、フェードアウトする要素をfadeOutから除外するというj08691の提案も組み込まれています。
var groups = {
Adventure: '.adv',
Puzzle: '.puz',
Shooter: '.sho',
All: 'div'
};
function fade( group ) {
$('#games div')
.not(group)
.fadeOut()
.promise()
.done( function() {
console.log( group );
$('#games ' + group).fadeIn();
});
}
$('input[name$="group1"]').click(function () {
fade( groups[ $(this).val() ] );
});
このコードは、重複したコードを1つの関数に結合することにより、元のコードよりも大幅に簡略化されています。最後に、console.log()を残して、行われている呼び出しを確認しました。
また、HTMLに関するいくつかのコメント:<br />
XHTMLを作成している場合を除いて、使用する必要はありません。XHTMLを作成していないことを願っています。<br>
結構です。さらに重要なことに、<label>
ラベル全体がクリック可能になるように、ラジオボタンのラベルにタグを使用する必要があります。
<label><input type="radio" name="group1" value="All" checked>Show All</label><br>
<label><input type="radio" name="group1" value="Adventure">Adventure</label><br>
<label><input type="radio" name="group1" value="Puzzle">Puzzle</label><br>
<label><input type="radio" name="group1" value="Shooter">Shooter</label>
これが更新されたjsfiddleです。
ここでも単純化するための追加の機会があります。value
ラジオボタンの属性が特定の文字列「All」、「Adventure」などである必要がありますか?value
そうでない場合は、グループセレクターを属性に直接配置できます。
<label><input type="radio" name="group1" value="div" checked>Show All</label><br>
<label><input type="radio" name="group1" value=".adv">Adventure</label><br>
<label><input type="radio" name="group1" value=".puz">Puzzle</label><br>
<label><input type="radio" name="group1" value=".sho">Shooter</label>
そして、JavaScriptコードは次のように簡略化されます。
function fade( group ) {
$('#games div')
.not(group)
.fadeOut()
.promise()
.done( function() {
console.log( group );
$('#games ' + group).fadeIn();
});
}
$('input[name$="group1"]').click(function () {
fade( $(this).val() );
});
最新のjsfiddle
別の更新...Alexがコメントで指摘しているように、このバージョンのコードでは、[すべて表示]と特定のジャンルの間を行ったり来たりすると、ブロックがジャンプします。
これは、コードの次の行が原因です。
.not(group)
この更新されたjsfiddleに示すように、その行を削除すると、よりスムーズな遷移が得られます。