2013-07-24 116 views
1

我試圖根據CSS類的存在摧毀一個函數。jQuery - 檢查類是否存在,如果沒有銷燬函數

我想檢查類.active,這個類是通過點擊一個按鈕切換。 我嘗試使用

if(jQuery(#test).hasClass('.active')

,但它只能使用一次,如果我刪除.active還是這個功能正在運行,而我想去除.active類的後摧毀它。

我也試過.unbind()但沒用。

請告訴我,我該如何摧毀這個功能去除.active

function destroy_no_active_class(){ 
     jQuery('#test.active').mouseover(function (e) { 
       e.stopPropagation();e.preventDefault(); 
       jQuery(this).addClass('highlight'); 
      }).mouseout(function() { 
       jQuery(this).removeClass('highlight'); 
      }).click(function(e){ 
       e.stopPropagation(); 
       e.preventDefault(); 
       show_data(this); 
      }); 

     }); 
    } 

回答

4

通過「破壞作用」你想讓它停止突出元素,你只是意味着假設後完全,你可以簡單地內查處理程序一旦被觸發,並有條件地執行邏輯。這比解除綁定處理程序更有用,因爲如果元素再次變爲「活動」,它將自動重新工作。

function destroy_no_active_class(){ 
    jQuery('#test').on('mouseover.mine mouseout.mine', function (e) { 
      if ($(this).is(".active")) { 
       e.stopPropagation(); 
       e.preventDefault(); 
       jQuery(this).toggleClass('highlight'); 
      } 
     }).on('click.mine', function(e){ 
      if ($(this).is(".active")) { 
       e.stopPropagation(); 
       e.preventDefault(); 
       show_data(this); 
      } 
     }); 
    }); 
} 

在處理程序中,你可以做交替

if (!$(this).is(".active")) { 
    $(this).off('mouseover.mine mouseout.mine click.mine'); 
} 

這裏的缺點是,如果元素再次變得活躍,你必須重新綁定的處理程序。 (注$簡直是jQuery的別名。如果你有一個命名衝突,就在上面,你一直在做的代碼替換jQuery$。)

+0

是的,你的想法很棒..我會嘗試你的代碼 – user007

+0

當使用[關閉事件名稱](http://api.jquery.com/off/)時,要注意的一件事是所有的處理程序都將被刪除:「該類型的所有事件(包括直接和委託)都從jQuery集合中的元素中移除」。對你而言這可能沒有問題,但需要注意的事情。 – dc5

+0

但是我在同一個元素中可以拖動和縮短.. – user007

1

.unbind()是清除事件行爲的正確方法。

您的代碼有錯誤。小心你使用的選擇器,以及他們是否應該在他們周圍引用引號。

if ($('#test').hasClass('active')) { 
    $('#test').unbind().removeClass('active'); 
} 
+2

從jQuery 1.7開始,開/關優先於[bind/unbind](http://api.jquery.com/結合/)。 – dc5

1

如果我正確地理解了這個問題,你想在你完成它們之後刪除你的事件處理程序。

如果是這樣的話,你要麼需要

  1. 保留對處理函數的引用,所以你可以通過它,當你刪除你的事件處理程序
  2. 使用jQuery's event.namespace capability

自jQuery 1.7開啓/關閉是添加事件處理程序的首選方法:

function myhandler(e) {…} 

$('#test').on('click', myhandler); 
$('#test').off('click', myhandler); 
相關問題