2009-04-12 33 views
68

Tôi sẽ cố gắng giải thích vấn đề bằng một mã đơn giản.Cách ghi đè trình xử lý sự kiện jquery

var fireClick = function() { alert('Wuala!!!') }; 

$('#clickme').click(fireclick); 
$('#clickme').click(fireclick); 

Vì vậy, bây giờ nó sẽ rõ ràng cảnh báo 2 lần nhưng tôi cần cảnh báo chỉ một lần. Đã thử rất nhiều cách, nhưng không có kết quả.

Cảm ơn.

+0

Bạn có thể đưa ra một số bối cảnh xung quanh cách cuộc gọi kết thúc sự kiện kết thúc xảy ra hai lần không? Có thể bạn có thể ngăn cuộc gọi thứ hai thay đổi cách mã của bạn hoạt động một chút. –

+1

Related: http://stackoverflow.com/questions/209029/best-way-to-remove-an-event-handler-in-jquery –

+17

Đó là, "Thì đấy". :) –

Trả lời

121

Kể từ jQuery 1.7, bạn nên sử dụng off để xóa trình xử lý sự kiện và on để thêm chúng, mặc dù bạn vẫn có thể sử dụng viết tắt click.

$('#clickme').off('click').on('click', fireclick); 
$('#clickme').off().on('click', fireclick); 

Original câu trả lời:

Nếu bạn muốn thay thế tất cả các bộ xử lý nhấp chuột, gọi unbind đầu tiên mà không một đối số chức năng. Nếu bạn muốn thay thế tất cả trình xử lý sự kiện, không chỉ định loại sự kiện.

$('#clickme').unbind('click').click(fireclick); 
$('#clickme').unbind().click(fireclick); 
+1

Bah! Bạn giành chiến thắng cho chuỗi cuộc gọi, nhưng có thể tinh chỉnh câu trả lời của bạn để nó chỉ loại bỏ xử lý cụ thể được thêm lại? Vì vậy: $ ('# clickme'). Unbind ('click', fireclick) .click (fireclick) –

+4

Câu hỏi là "ghi đè lên xử lý sự kiện jquery" - Tôi đã giả định rằng anh ta muốn thay thế tất cả. Để làm điều đó, anh ta cần phải gọi unbind mỗi lần (đó là lý do tại sao tôi lặp lại cuộc gọi trên cả hai) và không chỉ định một đối số hàm. – tvanfosson

+3

Điều này chắc chắn là cách đúng đắn để làm điều này khi bạn trả lời câu hỏi, vì vậy tôi đã upvoted. Điều đó nói rằng, tôi tin rằng cách "mới và cải tiến" là với các phương thức on() và off(). Vì câu trả lời này là kết quả đầu tiên của google cho tìm kiếm "xử lý sự kiện thay thế jquery", điều này có thể hữu ích khi thêm vào câu trả lời của bạn. '$ ('# clickme'). off ('click'). on ('click', fireclick);' hoặc đơn giản '$ ('# clickme'). off ('click'). click (fireclick);' . – chucksmash

3

tôi sẽ cố gắng để loại bỏ các cuộc gọi thêm, nhưng ngắn tyhat bạn có thể chắc chắn rằng để gọi cả hai mỗi lần:

$('#clickme').unbind('click', fireclick); 
$('#clickme').click(fireclick); 
+0

Cảm ơn, nó hoạt động ngay bây giờ :) – taras

18

Bạn có thể sử dụng jQuery chức năng unbind để loại bỏ đầu tiên sự kiện:

var fireClick = function() { alert('Wuala!!!') }; 

$('#clickme').click(fireclick); 
$('#clickme').unbind('click', fireClick); // fireClick won't fire anymore... 
$('#clickme').click(fireclick); // ...but now it will 
-8

Bạn nên sử dụng setInterval. Vấn đề là bạn không thể có hai cảnh báo pop cùng một lúc. Người đầu tiên phải đóng đầu tiên hoặc thứ hai không thể xuất hiện trên màn hình ...

+5

Bạn đã đọc câu hỏi chưa? – kapa

20

Sử dụng một không gian tên để đảm bảo bạn không loại bỏ bất kỳ người nghe khác:

$('#clickme').off('click.XXX').on('click.XXX', fireclick); 

Chừng nào không có khác mã sử dụng XXX, bạn có thể chắc chắn rằng bạn đã không làm sai lệch một số hành vi khác mà bạn không biết.

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