Bagaimana cara melepaskan "hover" di jQuery?

107

Bagaimana cara melepaskan "hover" di jQuery?

Ini tidak bekerja:

$(this).unbind('hover');
zsharp
sumber
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')

Crescent Fresh
sumber
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');

Phil.Wheeler
sumber
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
tvanfosson.dll
sumber
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.

Jaytop
sumber
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: ">)

Briganti
sumber
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);
  });

});
bendewey
sumber
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");
Halayem Anis
sumber
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.

Foppe
sumber
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