2016-01-30 22 views
7

私は1分ごとにjsonレスポンスをポーリングしており、レスポンスに基づいてページ上にオーバーレイを追加または削除しています。 私の反応はほとんどの場合正解です。この場合、オーバーレイクラスを削除する必要があります。 以下のコードでは、elseは毎回実行され、classとhide関数は毎回実行されます。 これを避ける方法はありますか? jqueryにクラスが追加されているかどうかを調べるメソッドはありますか?また、非表示になっているかどうかは非表示です。 誰かがブール変数を設定したり解除したりすることでこれを達成するための構文を与えることができます。jquery - 条件に基づいてクラスを削除する

(function poll() { 
    setTimeout(function() { 
    $.ajax({ 
     url: "path", 
     type: "GET", 
     success: function(data) { 
     console.log("polling" + data); 
     if (data.is_running === true) { 
      $("#overlay").addClass('show'); 
      $("#alertDiv").show(); 
     } else { 
      console.log("removing ...."); 
      $("#overlay").removeClass('show'); 
      $("#alertDiv").hide(); 

     } 
     }, 
     dataType: "json", 
     complete: poll, 
     timeout: 200 
    }) 
    }, 5000); 
})(); 
+0

使用hasClass法のようにコードを変更してください! –

答えて

3

要素がhasclass()と特定のクラスがあるかどうかをチェックすることができます:

var overlay = $('#overlay'); 

if (overlay.hasClass('show')) { 
    overlay.removeClass('show'); 
} 

をしかし、あなたはPranav's answerを参照してください、toggle()toggleClass()を使用することができます。

あなたが if...else文の必要はそう false

$("#overlay").toggleClass('show',data.is_running); 
$("#alertDiv").toggle(data.is_running); 

を返さず、要素がクラスを持っているか、いないことを確認するためにあなたがhasClass()を使用することができますBoolean値でtoggle()toggleClass()を使用することができます

+1

'if(overlay.hasClass( 'show')){overlay.removeClass( 'show'); } 'は' overlay.removeClass( 'show') 'を直接呼び出すよりも効率的ですが、' removeClass'はクラスの存在を最初に問い合わせるので、実際には効率がありません。 –

13

ました一致する要素が指定されたクラスに割り当てられている場合trueを返します

+2

これは受け入れられる回答である必要があります。 – cfischer

4

下記のように試して、$() query methodsを変数に入れておくと効率的です!

var $overLay = $("#overlay"), 
    $alertDiv = $("#alertDiv"), 
    sh = 'show'; 

if (data.is_running === true) { 
    $overLay.addClass(); 
    $alertDiv.show(sh); 
} else if ($overLay.hasClass(sh)) { 
    $overLay.removeClass(sh); 
    $alertDiv.hide(); 
} 
+0

これはもっとどのように効率的ですか? if文の分岐のうちの1つのみが実行されるため、DOMは両方の要素に対して一度だけ照会されます。 –

+0

私は効率的であることを意味するものはDOMです:)そのクエリは2回だけですが、オーバーレイは3回、alertDivは2回 –

0

私は、あなたが "真"

としてdata.is_runningを取得していると思います。この

if (data.is_running == true){ 
    //your code 
} 
or 
if (data.is_running == "true"){ 
    //your code 
} 
関連する問題