2013-06-06 44 views
13

Tôi đã một thư viện lập trình xấu mà là làm điều nàyjQuery: cách hủy liên kết sự kiện được liên kết với đối tượng tài liệu?

$(document).on('click','#keep_first_only_button', function(){ 

tôi đã viết, sau này, một đoạn mã để 'đè' hành vi xấu này

$("keep_first_only_button").unbind("click"); 
$("keep_first_only_button").on("click", selectKeepFirstOfAll); 

NHƯNG này không hoạt động , sau đó trình xử lý hàm document.click được kích hoạt lại

Tôi không thể hủy liên kết tất cả các sự kiện nhấp từ tài liệu, vì thiên tai sẽ xảy ra trong trang.

Cách nào phù hợp để tiến hành trong trường hợp này?

CHỈNH SỬA: Xin lỗi vì mất thời gian, tôi không thấy chữ '#' bị thiếu trong bộ chọn của mình. Tôi thực sự xin lỗi!

+0

Tác phẩm này, nhưng vấn đề, như được báo cáo từ câu trả lời ưa thích là tôi chỉ đơn giản là thiếu '#' ...) :(Xin lỗi – realtebo

Trả lời

7
$("#keep_first_only_button")... 

Thiếu mã băm?

+1

Ôi Chúa ơi, xin đừng downvote câu hỏi của tôi, đây là vấn đề ... Xin lỗi ... – realtebo

+1

Tôi sẽ không downvote nó bởi vì nó là một câu hỏi chính xác, được giải thích tốt, nhưng tôi sẽ giữ nó randsom cho một câu trả lời được chấp nhận: D – dKen

+0

8 phút để chờ đợi, và tôi sẽ chấp nhận câu trả lời này, tất nhiên – realtebo

25

Trình xử lý sự kiện ban đầu bị ràng buộc dưới dạng sự kiện được ủy quyền, do đó bạn không thể xóa nó khỏi chính mình $('#keep_first_only_button'). Bạn cần xóa nó ở cấp độ document.

Từ the documentation:

Để loại bỏ xử lý sự kiện được giao cụ thể, cung cấp một cuộc tranh luận selector . Chuỗi chọn phải khớp chính xác với số được chuyển đến .on() khi trình xử lý sự kiện được đính kèm. Để xóa tất cả các sự kiện được ủy quyền từ một phần tử mà không xóa các sự kiện không được ủy quyền, hãy sử dụng giá trị đặc biệt "**".

Nói cách khác, để hủy liên kết sự kiện được ủy quyền, bạn chỉ nên sử dụng cùng một bộ đối số bạn đã sử dụng để liên kết chúng nhưng chuyển chúng sang off thay thế. Kể từ khi chức năng ràng buộc là vô danh bạn không thể tham chiếu đến nó, vì vậy bạn sẽ phải giải quyết với unbinding tất cả xử lý sự kiện giao ràng buộc để #keep_first_only_button trên document mức:

$(document).off('click', '#keep_first_only_button'); 

EDIT: Hình như vấn đề chỉ là băm thiếu. Rất tiếc, tôi nghĩ bạn không thể hủy liên kết các trình xử lý sự kiện được ủy quyền bằng cách sử dụng số điện thoại thông thường.off() ...

+0

Câu trả lời của bạn chắc chắn là hữu ích, cảm ơn, nhưng, thực sự, tắt công việc, tôi đã cố gắng crossbrowser, và i'ts tất cả làm việc. – realtebo

+0

Tôi đang sử dụng hộp thoại jquery và khi tôi tải trang trong hộp thoại tôi đang sử dụng: $ (tài liệu) .on ('click', '.blahblah', function() {}); và không thể cho cuộc sống của tôi tìm ra lý do tại sao $ ('. blahblah'). off() đã không xóa sự kiện nhấp chuột. câu trả lời này vừa tiết kiệm cho tôi nửa ngày đào bới. Cảm ơn bạn! – Rebecca

+0

Bạn đã cứu tôi rất nhiều thời gian. Thx –

4

Đối với bất kỳ ai tự hỏi ... Mattias Buelens là chính xác.

Nếu bạn đã yếu tố ràng buộc như

$(document).on("click","#element",function(){ }); 

Và muốn tắt nó đi sau đó, bạn phải làm điều đó như:

$("#element").click(function(e) { 
    $(document).off('click', '#element'); 
}); 
0

Nếu bạn muốn loại bỏ sự kiện với ra xem xét sử dụng selector

$ (tài liệu).tắt ("nhấp", "**");

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