Bagaimana cara melepaskan "hover" di jQuery?


107

Bagaimana cara melepaskan "hover" di jQuery?

Ini tidak bekerja:

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

2
Apakah Anda mencoba melepaskan fungsi yang Anda tetapkan untuk peristiwa hover, atau Anda mencoba mengubah <a> </a> hover?
Justin Niessner

Untuk memperjelas pertanyaan Justin Niessner, apakah Anda mencoba menghapus peristiwa Javascript / DOM, atau deklarasi CSS? Yang terakhir adalah masalah yang lebih rumit.
Kelopak mata

Jawaban:


214

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

atau lebih ringkas (terima kasih @Chad Grant ):

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


42
atau $ (this) .unbind ('mouseenter mouseleave')
Chad Grant

apakah urutan yang diperlukan untuk mouseenter kemudian setelah mouseleave?
sanghavi7

70

Sebenarnya, dokumentasi jQuery memiliki pendekatan yang lebih sederhana daripada contoh berantai yang ditunjukkan di atas (meskipun mereka akan bekerja dengan baik):

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

Mulai jQuery 1.7, Anda juga dapat menggunakan $.on()dan $.off()untuk event binding, jadi untuk melepas event hover, Anda akan menggunakan yang lebih sederhana dan lebih rapi:

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

Pseudo-event-name "hover" digunakan sebagai singkatan dari "mouseenter mouseleave" tetapi ditangani secara berbeda di versi jQuery sebelumnya; mengharuskan Anda untuk secara tegas menghapus setiap nama acara literal. Menggunakan $.off()sekarang memungkinkan Anda untuk melepaskan kedua kejadian mouse menggunakan singkatan yang sama.

Edit 2016:

Masih merupakan pertanyaan yang populer sehingga perlu diperhatikan poin @ Dennis98 di komentar di bawah bahwa di jQuery 1.9+, acara "hover" sudah tidak digunakan lagi karena mendukung panggilan "mouseenter mouseleave" standar. Jadi, deklarasi pengikatan acara Anda sekarang akan terlihat seperti ini:

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


4
Saya memiliki jQuery 1.10.2 dan $.off("hover")tidak berfungsi. Namun, menggunakan kedua acara tersebut bekerja dengan baik.
Alexis Wilke

Perlu disebutkan bahwa ketika beberapa argumen pemfilteran diberikan, semua argumen yang diberikan harus cocok agar pengendali kejadian dapat dihapus. Saya juga mencatat bahwa dokumen jQuery API menyatakan bahwa metode .off () menghapus penangan kejadian yang dilampirkan dengan .on (). Apakah itu berarti HANYA berlaku untuk acara yang ditambahkan menggunakan .on (), saya tidak yakin. Tapi seharusnya tidak.
Phil.Wheeler

@AlexisWilke Ya, itu dihapus di v1.9, lihat tautan terakhir ..;)
Dennis98

1
@ Dennis98 - Anda baru saja berbicara tentang peretasan hover jQuery yang dipindahkan ke deprecated.js, bukan? event binding $ .off () masih tersedia di versi jQuery yang lebih baru.
Phil.Wheeler

Baik. :) $.off()masih ada, itu adalah metode yang disarankan untuk melepas peristiwa saat ini. Jadi mulai sekarang Anda perlu menulis $(element).off("mouseenter mouseleave");.
Dennis98

10

Lepaskan peristiwa mouseenterdan satu mouseleaveper satu atau lepaskan semua peristiwa di elemen.

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

atau

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

4

unbind () tidak berfungsi dengan kejadian sebaris hardcode.

Jadi, misalnya, jika Anda ingin melepaskan peristiwa gerakan mouse dari <div id="some_div" onmouseover="do_something();">, saya menemukan itu $('#some_div').attr('onmouseover','')adalah cara cepat dan kotor untuk mencapainya.


4

Solusi lain adalah .die () untuk acara yang dilampirkan dengan .live () .

Ex.:

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

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

Anda dapat menemukan referensi yang bagus di sini: Menjelajahi jQuery .live () dan .die ()

(Maaf untuk bahasa Inggris saya: ">)


2

Semua hover yang dilakukan di belakang layar mengikat properti mouseover dan mouseout. Saya akan mengikat dan melepaskan fungsi Anda dari acara tersebut satu per satu.

Misalnya, Anda memiliki html berikut:

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

maka jQuery Anda akan menjadi:

$(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);
  });

});

Koreksi, Setelah melihat jquery src hover sebenarnya mengikat mouseenter / mouseleave. Anda harus melakukan hal yang sama.
bendewey

2

Anda dapat menghapus penanganan kejadian tertentu yang dilampirkan oleh on, menggunakanoff

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

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

Dengan menggunakan ini, Anda hanya akan menghapus handlerFunction
. Praktik baik lainnya, adalah menyetel nameSpace untuk beberapa peristiwa yang dilampirkan

$("#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

Saya menemukan ini berfungsi sebagai argumen kedua (fungsi) ke .hover ()

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

Fungsi pertama (argumen ke .hover ()) adalah gerakan mouse dan akan mengeksekusi kode Anda. Argumen kedua adalah mouseout yang akan melepaskan peristiwa hover dari #yourId. Kode Anda hanya akan dieksekusi sekali.


1
Bukankah $.unbind()dengan sendirinya seperti ini menghapus semua kejadian dari objek itu? Dalam hal mana $.click()acara Anda sekarang akan gagal, bukan?
Alexis Wilke
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.