現在のHTMLに変更がなく、jQueryによるすべての変更があると仮定します。
$('h2').html(
function(i,h) {
return h + '<span>[+]</span>';
}).on('click', 'span', function(){
var that = $(this);
that.closest('h2').next('ul').toggle();
that.text(
function(){
return that.text().indexOf('+') !== -1 ? '[-]' : '[+]';
});
});
JSフィドルデモ。
上記のコードのこの部分を説明するために編集されました:
return that.text().indexOf('+') !== -1 ? '[-]' : '[+]';
これは三項演算子であり、条件(return that.text().indexOf('+') !== -1
)がtrueまたはfalseであるかどうかを評価します。次?
は「if-true」応答であり、次:
は「if-false」応答です。
したがって、条件は、現在の要素の+
から返された文字列内に文字が見つかったかどうかを評価します。見つかった部分文字列のインデックスを返すためtext()
、結果をと比較しています。部分文字列は(文字列の先頭)にあるため、文字列が見つからない場合に戻ります。したがって、要素のテキスト内でが見つかった場合(したがって、返される結果はに等しくなりません)、テキストはに変更されますが、が見つかった場合、テキストはに変更されます。-1
indexOf()
0
indexOf()
-1
+
-1
span
[-]
+
[-]
このreturn
ステートメントは、変更されたテキストをtext()
メソッドに返すだけです。
メソッドの関数を修正しtext()
、要素のテキストが関数の2番目のパラメーターとして使用できるという事実を利用するように更新されました。
$('h2').html(
function(i,h) {
return h + '<span>[+]</span>';
}).on('click', 'span', function(){
var that = $(this);
that.closest('h2').next('ul').toggle();
that.text(
function(i,t){
return t.indexOf('+') !== -1 ? '[-]' : '[+]';
});
});
JSフィドルデモ。
参照: