Làm cách nào để hủy liên kết "di chuột" trong jQuery?


107

Làm cách nào để hủy liên kết "di chuột" trong jQuery?

Điều này không hoạt động:

$(this).unbind('hover');

2
Bạn đang cố gắng hủy liên kết một chức năng mà bạn đã chỉ định cho sự kiện di chuột hay bạn đang cố gắng sửa đổi <a> </a> di chuột?
Justin Niessner

Để làm rõ câu hỏi của Justin Niessner, bạn đang cố xóa các sự kiện Javascript / DOM hay khai báo CSS? Sau đó là một vấn đề phức tạp hơn.
mí mắt

Câu trả lời:


214

$(this).unbind('mouseenter').unbind('mouseleave')

hoặc ngắn gọn hơn (cảm ơn @Chad Grant ):

$(this).unbind('mouseenter mouseleave')


42
hoặc $ (this) .unbind ('mouseenter mouseleave')
Chad Grant

trình tự cần thiết cho mouseenter sau đó sau mouseleave?
sanghavi7 5/10/12

70

Trên thực tế, tài liệu jQuery có cách tiếp cận đơn giản hơn các ví dụ theo chuỗi được hiển thị ở trên (mặc dù chúng sẽ hoạt động tốt):

$("#myElement").unbind('mouseenter mouseleave');

Kể từ jQuery 1.7, bạn cũng có thể sử dụng $.on()$.off()liên kết sự kiện, vì vậy, để hủy liên kết sự kiện di chuột, bạn sẽ sử dụng đơn giản hơn và gọn gàng hơn:

$('#myElement').off('hover');

Tên sự kiện giả "hover" được dùng làm cách viết tắt của "mouseenter mouseleave" nhưng đã được xử lý khác trong các phiên bản jQuery trước đó; yêu cầu bạn xóa rõ ràng từng tên sự kiện theo nghĩa đen. Sử dụng $.off()bây giờ cho phép bạn bỏ cả hai sự kiện chuột bằng cách sử dụng cùng một tốc ký.

Chỉnh sửa năm 2016:

Vẫn là một câu hỏi phổ biến, vì vậy cần thu hút sự chú ý của @ Dennis98 trong các nhận xét bên dưới rằng trong jQuery 1.9+, sự kiện "hover" đã không được dùng nữa để thay thế cho các lệnh gọi "mouseenter mouseleave" tiêu chuẩn. Vì vậy, khai báo ràng buộc sự kiện của bạn bây giờ sẽ giống như sau:

$('#myElement').off('mouseenter mouseleave');


4
Tôi có jQuery 1.10.2 và $.off("hover")không hoạt động. Tuy nhiên, sử dụng cả hai sự kiện đều hoạt động tốt.
Alexis Wilke

Đáng nói là khi đưa ra nhiều đối số lọc, tất cả các đối số được cung cấp phải khớp để trình xử lý sự kiện bị loại bỏ. Tôi cũng lưu ý rằng tài liệu jQuery API nói rằng phương thức .off () loại bỏ các trình xử lý sự kiện được đính kèm với .on (). Liệu điều đó có nghĩa là nó CHỈ áp dụng cho các sự kiện được thêm bằng .on () hay không, tôi không chắc. Nhưng nó không nên.
Phil.Wheeler

@AlexisWilke Yep, nó đã bị loại bỏ trong v1.9, tìm kiếm các liên kết cuối cùng ..;)
Dennis98

1
@ Dennis98 - Bạn chỉ đang nói về việc hack jQuery hover được chuyển sang không dùng nữa.js, phải không? ràng buộc sự kiện $ .off () vẫn có sẵn trong các phiên bản jQuery sau này.
Phil.Wheeler

Đúng. :) $.off()vẫn ở đó, đó là phương pháp được khuyến nghị cho các sự kiện hiện tại. Vì vậy, bây giờ bạn cần phải viết $(element).off("mouseenter mouseleave");.
Dennis98

10

Hủy liên kết các sự kiện mouseentermouseleaveriêng lẻ hoặc hủy liên kết tất cả các sự kiện trên (các) phần tử.

$(this).unbind('mouseenter').unbind('mouseleave');

hoặc là

$(this).unbind();  // assuming you have no other handlers you want to keep

4

unbind () không hoạt động với các sự kiện nội tuyến được mã cứng.

Vì vậy, ví dụ: nếu bạn muốn hủy liên kết sự kiện di chuột qua khỏi <div id="some_div" onmouseover="do_something();">, tôi thấy rằng đó $('#some_div').attr('onmouseover','')là một cách nhanh chóng và dễ dàng để đạt được điều đó.


4

Một giải pháp khác là .die () cho các sự kiện gắn với .live () .

Ví dụ.:

// attach click event for <a> tags
$('a').live('click', function(){});

// deattach click event from <a> tags
$('a').die('click');

Bạn có thể tìm thấy sự khác biệt tốt ở đây: Khám phá jQuery .live () và .die ()

(Xin lỗi vì tiếng anh của tôi: ">)


2

Tất cả những gì di chuột đang thực hiện đằng sau hậu trường đều liên kết với thuộc tính di chuột qua và di chuột ra. Tôi sẽ ràng buộc và hủy liên kết các chức năng của bạn khỏi các sự kiện đó một cách riêng lẻ.

Ví dụ: giả sử bạn có html sau:

<a href="#" class="myLink">Link</a>

thì jQuery của bạn sẽ là:

$(document).ready(function() {

  function mouseOver()
  {
    $(this).css('color', 'red');
  }
  function mouseOut()
  {
    $(this).css('color', 'blue');
  }

  // either of these might work
  $('.myLink').hover(mouseOver, mouseOut); 
  $('.myLink').mouseover(mouseOver).mouseout(mouseOut); 
  // otherwise use this
  $('.myLink').bind('mouseover', mouseOver).bind('mouseout', mouseOut);


  // then to unbind
  $('.myLink').click(function(e) {
    e.preventDefault();
    $('.myLink').unbind('mouseover', mouseOver).unbind('mouseout', mouseOut);
  });

});

Sửa lại, Sau khi nhìn vào jquery src hover thực sự liên kết với mouseenter / mouseleave. Bạn nên làm như vậy.
bentewey

2

Bạn có thể xóa một trình xử lý sự kiện cụ thể đã được đính kèm bởi on, bằng cách sử dụngoff

$("#ID").on ("eventName", additionalCss, handlerFunction);

// to remove the specific handler
$("#ID").off ("eventName", additionalCss, handlerFunction);

Sử dụng điều này, bạn sẽ chỉ loại bỏ handlerFunction
Một phương pháp hay khác, là đặt một namespace cho nhiều sự kiện đính kèm

$("#ID").on ("eventName1.nameSpace", additionalCss, handlerFunction1);
$("#ID").on ("eventName2.nameSpace", additionalCss, handlerFunction2);
// ...
$("#ID").on ("eventNameN.nameSpace", additionalCss, handlerFunctionN);

// and to remove handlerFunction from 1 to N, just use this
$("#ID").off(".nameSpace");

0

Tôi thấy điều này hoạt động như đối số thứ hai (hàm) cho .hover ()

$('#yourId').hover(
    function(){
        // Your code goes here
    },
    function(){
        $(this).unbind()
    }
});

Hàm đầu tiên (đối số cho .hover ()) di chuột qua và sẽ thực thi mã của bạn. Đối số thứ hai là mouseout sẽ hủy liên kết sự kiện di chuột khỏi #yourId. Mã của bạn sẽ chỉ được thực thi một lần.


1
Chẳng phải $.unbind()tự nó sẽ xóa tất cả các sự kiện khỏi đối tượng đó sao? Trong trường hợp đó những thứ như $.click()sự kiện của bạn bây giờ sẽ thất bại, phải không?
Alexis Wilke
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.