Làm cách nào để xóa tất cả các trình xử lý sự kiện nhấp chuột bằng jQuery?


121

Tôi đang gặp một vấn đề. Về cơ bản, khi người dùng nhấp vào liên kết 'Chỉnh sửa' trên một trang, mã Jquery sau sẽ chạy:

$("#saveBtn").click(function () {
    saveQuestion(id);
});

Bằng cách thực hiện điều này, sự kiện onClick của nút lưu sẽ gọi saveQuestion()phương thức và chuyển ID của câu hỏi mà liên kết 'Chỉnh sửa' đã được nhấp vào.

Nhưng nếu trong cùng một phiên, người dùng nhấp vào chỉnh sửa trên 2 câu hỏi, thì thay vì ghi đè clicktrình xử lý sự kiện trước đó , thay vào đó, nó khiến 2 trình xử lý sự kiện chạy, một trình xử lý có thể gọi saveQuestion(1)và trình xử lý kia có thể gọi saveQuestion(2). Bằng cách làm này, 1 câu hỏi sẽ ghi đè câu hỏi kia.

Có cách nào để xóa tất cả các clicksự kiện trước đó đã được gán cho một nút không?

Câu trả lời:


203

Bạn sẽ sử dụng off () để xóa một sự kiện như vậy:

$("#saveBtn").off("click");

nhưng điều này sẽ xóa tất cả các sự kiện nhấp chuột liên kết với phần tử này. Nếu hàm có SaveQuestion là sự kiện duy nhất bị ràng buộc thì phần trên sẽ thực hiện. Nếu không làm như sau:

$("#saveBtn").off("click").click(function() { saveQuestion(id); });

31
Kể từ jQuery 1.7, bạn nên sử dụng và tắt thay vì ràng buộc và unbind
Ralph Jansen

@LockTar, bạn có thể đề xuất cách viết này thay thế không?
John Magnolia

@JohnMagnolia Xem các thay đổi của tôi ở trên.
Ralph Jansen

1
.addAttr ('onclick'); hoặc .removeAttr ('onclick');
Aliti

13

Có cách nào để loại bỏ tất cả các sự kiện nhấp chuột trước đó đã được chỉ định cho một nút không?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});

unbind()không được dùng nữa kể từ jQuery 3.0 và việc sử dụng off()đã được khuyến khích kể từ 1.7.
Skylar Ittner

7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});

2

Nếu bạn đã sử dụng ...

$(function(){
    function myFunc() {
        // ... do something ...
    };
    $('#saveBtn').click(myFunc);
});

... thì sau này sẽ dễ dàng tháo gỡ hơn.


1
Bạn thấy thế nào? Bất kể sự kiện của một phần tử bị ràng buộc như thế nào, chúng luôn có thể được hủy liên kết theo cùng một cách ... $ ('# saveBtn'). Unbind ('bất kỳ sự kiện nào (s)'); Bây giờ, để RE-BIND ... vâng, kỹ thuật của bạn có thể dễ dàng hơn trong một số trường hợp nhất định.
KyleFarris

1
Nếu bạn hủy liên kết tất cả các sự kiện nhấp chuột thì không có gì khác biệt. Nhưng nếu bạn chỉ muốn hủy liên kết một hành động cụ thể, tôi sẽ không muốn viết lại sự kiện đó ở hai nơi. Và như bạn đã nói, nếu tôi muốn gắn lại nó sau, điều đó lại dễ thực hiện hơn, vì tôi không phải viết hàm lần thứ ba.
Jarrett Meyer

0
$('#saveBtn').off('click').on('click',function(){
   saveQuestion(id)
});

Sử dụng jquery's offon

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.