2010-10-19 26 views
39

Code:Làm thế nào để unbind một xử lý sự kiện cụ thể

$('#Inputfield').keyup(function(e) 
     { 
      if(e.which == 13) 
      { 
       functionXyz(); 
      } 
      else 
      { 
       functionZyx(); 
      } 
    }); 


$(document).keyup(function(exit) { 
       if (exit.keyCode == 27) { functionZzy(); } 
}); 

Câu hỏi: Làm thế nào để loại bỏ các xử lý sự kiện KeyUp của keyCode == 27 và giữ $ khác (tài liệu) .keyup xử lý sự kiện còn nguyên vẹn ?

+7

Tại sao bạn đặt tên cho đối tượng sự kiện là "thoát"? –

+0

'Mã khóa == 27' ** là ** mã được gắn vào' $ (tài liệu) .keyup' ... vui lòng làm rõ. –

Trả lời

74

Bạn phải sử dụng một hàm có tên, do đó bạn có thể tham khảo mà xử lý cụ thể khi gọi .unbind(), như thế này:

function keyUpFunc(e) { 
    if (e.keyCode == 27) { functionZzy(); } 
} 
$(document).keyup(keyUpFunc); 

Sau đó, sau khi unbinding:

$(document).unbind("keyup", keyUpFunc); 
8

jQuery cho phép bạn liên kết các sự kiện sẽ không bị ràng buộc sau lời kêu gọi đầu tiên của họ. Nếu bạn đang tìm kiếm để chỉ chạy chức năng KeyUp này một lần, nhìn vào .Một() phương pháp liệt kê ở đây: http://api.jquery.com/one/

$(document).one('keyup', function(e) { 
       if (e.keyCode == 27) { functionZzy(); } 
}); 
6

Nếu bạn chỉ có một bộ xử lý trên một phần tử, bạn có thể yên tâm unbind nó bằng cách sử unbind mà không sử dụng các chức năng được đặt tên như Nick Craver gợi ý. Trong trường hợp này, hãy gọi

$('#Inputfield').unbind('keyup'); 

sẽ không ảnh hưởng đến người xử lý trên document.

61

Bạn đang gắn bộ xử lý sự kiện vào các phần tử khác nhau, vì vậy bạn có thể loại bỏ trình xử lý một cách an toàn khỏi đối tượng cụ thể (đã được đề cập đến tôi biết).

Vì lợi ích của sự hoàn chỉnh, nếu bạn muốn đính kèm nhiều bộ xử lý cho sự kiện cùng với cùng đối tượng, bạn có thể sử dụng namespaced events:

$('#Inputfield').bind('keyup.keep', function(e){/*...*/}); 
$('#Inputfield').bind('keyup.notkeep', function(e){/*...*/}); 

$('#Inputfield').unbind('keyup.notkeep'); 
// or event $('#Inputfield').unbind('.notkeep'); 

Kể từ jQuery 1,7, các phương thức .on.off là cách ưu tiên để thêm và xóa trình xử lý sự kiện. Với mục đích này, chúng hoạt động chính xác như .bind.unbind và cũng hoạt động với các sự kiện không gian tên.

+9

Đây là câu trả lời hay nhất ở đây, khái niệm về không gian tên là thực sự hữu ích và tôi sử dụng nó mọi lúc. Nó cung cấp hỗ trợ nếu bạn (hoặc quan trọng hơn một người nào đó) thêm ràng buộc sự kiện vào cùng một phần tử vào một ngày sau đó mà không nhận ra nó đã có sự kiện bị ràng buộc với nó. Tất nhiên nếu họ đi và sử dụng một $ ('myelement'). Unbind ('focus'), gõ búa mà không có namespacing các sự kiện của bạn sẽ được unbound anyway ... Do đó nói với những người bạn làm việc với để bắt đầu sử dụng nó! – calumbrodie

+0

điều này khá hữu ích - điều mới đối với tôi - không gian tên - cảm ơn! – foxybagga

+2

Trong khi việc định vị tên có thể hữu ích, khả năng nhắm mục tiêu một thể hiện cụ thể của hàm bị ràng buộc có thể hữu ích hơn. Tôi có một số trường hợp của cùng một chức năng liên kết với tài liệu của tôi và tôi muốn tiêu diệt chỉ một trong số họ. Không gian tên không giúp tôi với điều đó. – Frug

Các vấn đề liên quan