2012-06-05 16 views
33

jqueryオブジェクトにremoveClass apiを使用する前に、クラスが存在するかどうかを確認する必要がありますか?例えば、 。hasClass before removeClass - jQuery

if($(this).hasClass("test")) 
    $(this).removeClass("test"); 

または

$(this).removeClass("test"); 

必要でない場合は、なぜ?

+0

いずれにしても試しましたか?それをやった? – lanzz

+0

よくjqueryはほとんどの場合スローエラーを回避し、うまく動作します – user917670

+0

それは動作し、エラーを生成しないので、明らかに必要ありません。サードパーティのコードで例外処理を二次的に推測しようとするべきではありません。例外がエスケープされない場合、処理されます。物事を説明する – lanzz

答えて

36

使用ちょうどこの:

$(this).removeClass("test"); 

クラスの存在をチェックする必要はありません。一致するサブストリングが存在しない場合

className = (" " + elem.className + " ").replace(rclass, " "); 
for (c = 0, cl = classNames.length; c < cl; c++) { 
    className = className.replace(" " + classNames[c] + " ", " "); 
}​ 

そしてreplaceは何も削除されません。

jQuery sourcesから、我々はremoveClass方法は、部分文字列を削除するためにreplaceメソッドを使用していることがわかります。

+1

。ありがとう – user917670

+1

+1素晴らしい説明のために – thecodeparadox

+1

正しい機能のために 'hasClass'は必要ないかもしれませんが、いくつかのクイックテストは、最初にチェックする方が速いことを示しています(少なくとも3つの異なるブラウザで私にとっては) - https://jsfiddle.net/trevorpower/5mu7shg1/2/ – tpower

3

いいえ、removeClass()を確認する必要はありません。

ただ、少なくともChromeの

$(this).removeClass("test"); 
5

を使用し、jQueryのは、無条件に新しい文字列にelem.classNameを割り当てるので、removeClass()の前にご確認ください)hasClassを(追加することに有用であっても「という文字列hasn場合変更されたため、Chromeはレイアウトを無効にして再計算します。

これはChromeのバグであり、classNameが実際に以前の値から変更されたかどうかを確認する必要があります。しかし、ブラウザには、html仕様のどこかに深く書かれているいくつかのわかりにくい要件のために、レイアウトを再計算するためにがあるかもしれません。

私はFirefoxをテストしていません。 SafariのWebインスペクタは、レイアウトが無効/再計算された理由(javascript関数がそれを引き起こした理由)を教えてくれないので役に立たない。

+1

これはChromeでも有効ですか? – Lipis