2014-01-28 316 views
3

我有一個我附加到我的文檔的keydown事件處理程序,所以我可以在任何地方看到keydown事件。但是,條件滿足後,我希望能夠移除該處理程序並僅處理該處理程序。我怎樣才能做到這一點?在事件處理程序中刪除jquery事件處理程序

這是我目前的處理程序:

$(document).keydown(function(event){ 
     console.log(event); 

     var tag = event.target.tagName.toLowerCase(); 
     if(event.which = 27 && tag != 'input' && tag != 'textarea'){ //escape has been pressed 
      _dismissModal(modal_id); 
     } 
    }); 

我想_dismissModal被調用後刪除此keydown事件處理程序。我如何在不刪除所有keydown事件處理程序的情況下做到這一點?

+0

你試過jquery off()方法嗎? –

回答

2

你可以使用jquery off()方法。你也可以把你的keydown邏輯放到一個單獨的函數中,所以你只能在你的off方法中定位這個keydown動作。

var mykeydownfunction= function(){ 
    console.log(event); 

    var tag = event.target.tagName.toLowerCase(); 
    if(event.which = 27 && tag != 'input' && tag != 'textarea'){ //escape has been pressed 
     _dismissModal(modal_id); 
     $(this).off('keydown', mykeydownfunction);// $(this) is the document 
    } 
} 

$(document).on('keydown', mykeydownfunction); 
2

當條件滿足時,使用.off()

$(document).off('keydown'); 
+0

@kasperTaeymans - 感謝您的編輯。 – Krishna

+0

是否會刪除所有keydown事件處理程序或只是我的? – Malfist

+0

@Malfist - 這將刪除所有keydown事件處理程序。 – Krishna

2

使用.off()

$(document).off('keydown'); 
+0

是否會刪除所有keydown事件處理程序或只是我的? – Malfist

+0

@Malfist,該類型的所有事件(包括直接和委託)都從jQuery集合中的元素(這裏是文檔)中移除 – Satpal

2

使用.off()刪除事件處理程序。

$(document).on("keydown", function(event){ 
    console.log(event); 

    var tag = event.target.tagName.toLowerCase(); 
    if(event.which = 27 && tag != 'input' && tag != 'textarea'){ //escape has been pressed 
     _dismissModal(modal_id); 
     $(this).off("keydown"); 
    } 
}); 
+0

是否會刪除所有keydown事件處理程序或只是我的? – Malfist

+0

所有這些。是好還是壞? –

+0

我想只刪除我的。 – Malfist

1

這已經得到了回答,但使用命名空間與刪除事件是非常有用的,並確保您不會造成任何副作用。

// add click event with my.namespace as the namespace 
$('element').on('click.my.namespace', function (e) { 
    // do something 
}); 

// remove my.namespace click event from element 
$('element').off('click.my.namespace'); 

可以打通,開發者控制檯,並期待在一個元素的事件與

$._data($('element')[0], 'events'); 

打開的對象,你會看到一個點擊陣列。展開你的活動,你會看到的命名空間實際上顯示爲

namespace.my 

,而不是

my.namespace 

http://api.jquery.com/on/

爲更多信息事件名稱和命名空間的搜索。

+0

命名空間技巧值得更多upvotes – Alex