2012-06-11 22 views
19

Tôi biết rằng chúng tôi có thể đính kèm các sự kiện với chức năng jQuery on() và xóa chúng một lần nữa với off().Sử dụng Jquery off(). On() hoặc chỉ trên()

Trong một dự án hiện tôi thỉnh thoảng đi qua mã tương tự như này:

$("#SomeId").off("click").on("click"); 

hoặc đôi khi sử dụng không gian tên tương tự như sau:

$("#SomeId").off("click.namespace").on("click.namespace"); 

Theo như tôi biết bạn chỉ có thể đính kèm một sự kiện duy nhất vào một không gian tên cụ thể của sự kiện.

Ví dụ: nếu tôi chỉ cần thực hiện on("click"), nó sẽ đính kèm chức năng được chỉ định của tôi, ghi đè chức năng hiện tại được gán , thêm vào sự kiện "nhấp".

Nếu tôi làm on("click.namespace"), nó sẽ đính kèm chức năng được chỉ định ghi đè chức năng hiện tại được gán , thêm vào click.namespace.

Điểm xóa bất kỳ sự kiện nào bằng cách ghép một số off("click") thành on("click) nếu on() đã thay thế bất kỳ chức năng nào được gán cho sự kiện/sự kiện.namespace được chỉ định?

Cú pháp dự phòng trong mã của chúng tôi hay có lý do nào đó mà tôi đã bỏ lỡ?

Edit - Cảm ơn bạn kapa
tôi cảm thấy một chút ngớ ngẩn bây giờ, tôi sửa lại kiến ​​thức bị lỗi của tôi ở trên. Thực hiện on("click.namespace1") nhiều lần tôi đã quan sát thấy rằng đối tượng data("events") tiếp tục thêm vào mảng sự kiện nhấp chuột.

Tôi nghĩ rằng câu trả lời cho câu hỏi của chính tôi ở đó. Đó là lý do tại sao người ta sẽ sử dụng off("event.namespace") để đảm bảo không có gì khác được đính kèm vào sự kiện/event.namespace chính xác đó.

Trả lời

29

Thực ra bạn có thể đính kèm nhiều trình xử lý sự kiện vào cùng một sự kiện, không chỉ một sự kiện. Ngay cả khi không gian tên được sử dụng. Hãy xem this quick demo.

Thực ra, một lợi thế của không gian tên là bạn có thể đánh dấu nhóm xử lý sự kiện và dễ dàng xóa chúng sau này để tránh gắn chúng nhiều lần. Đây là những gì dòng này không:

$("#SomeId").off("click.namespace").on("click.namespace"); 
+0

Tôi đã chỉnh sửa câu hỏi của mình với những phát hiện mới dựa trên phản hồi của bạn. Tôi cảm thấy một chút ngớ ngẩn Tôi không bao giờ nhận thấy rằng trước khi quan sát đối tượng 'dữ liệu (" sự kiện ")'. Cảm ơn bạn vì câu trả lời. – Jason

0

Nếu có một hander hiện có (kể từ khi bạn có thể có nhiều hơn một, trong trường hợp này, họ sẽ chuỗi), và nó gọi .stopPropagation(), sau đó thuận tay của bạn sẽ không được gọi . Viết mã như trên sẽ tránh được vấn đề này.

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