jQueryで「ホバー」のバインドを解除するにはどうすればよいですか?


107

jQueryで「ホバー」のバインドを解除するにはどうすればよいですか?

これは動作しません:

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

2
ホバーイベントに割り当てた関数のバインドを解除しようとしていますか、それとも<a> </a>ホバーを変更しようとしていますか?
Justin Niessner、2009

Justin Niessnerの質問を明確にするために、JavaScript / DOMイベント、またはCSS宣言を削除しようとしていますか?後者はより複雑な問題です。
まぶたがない2009年

回答:



70

実際、jQueryのドキュメントには、上記のチェーンされた例よりも簡単なアプローチがあります(ただし、問題なく動作します)。

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

jQueryの1.7の時点で、あなたもでき、使用している$.on()$.off()そうホバーイベントをバインド解除するために、結合事象のために、あなたは簡単かつ整然とを使用します。

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

疑似イベント名「hover」は「mouseenter mouseleave」の省略形として使用されますが、以前のjQueryバージョンでは異なる方法で処理されていました。各リテラルイベント名を明示的に削除する必要があります。使用$.off()今は、あなたが同じ省略形を使用して、両方のマウスイベントをドロップすることができます。

2016年を編集:

まだ人気のある質問なので、jQuery 1.9以降では、標準の「mouseenter mouseleave」呼び出しに代わって「hover 」イベントが廃止されたという以下のコメントの@ Dennis98のポイントに注目する価値があります。したがって、イベントバインディング宣言は次のようになります。

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


4
jQuery 1.10.2を使用して$.off("hover")いますが、機能しません。ただし、両方のイベントを使用するとうまくいきます。
Alexis Wilke、2014年

複数のフィルタリング引数が指定されている場合、イベントハンドラーを削除するには、指定されたすべての引数が一致する必要があることを言及する価値があります。また、jQuery APIドキュメントには、.on()で添付されたイベントハンドラーが.off()メソッドによって削除されると記載されています。それが.on()を使用して追加されたイベントにのみ適用されるかどうかはわかりません。しかし、そうすべきではありません。
Phil.Wheeler 2015年

@AlexisWilkeはい、v1.9で削除されました。最後のリンクを調べてください;)
Dennis98

1
@ Dennis98-あなたはちょうどjQueryホバーハックがdeprecated.jsに移動されていることについて話している、そうですか?$ .off()イベントバインディングは、それ以降のバージョンのjQueryでも引き続き使用できます。
Phil.Wheeler 2016

正しい。:) $.off()はまだそこにあります。それは現在、イベントのバインドを解除する推奨方法です。だから今のところ書く必要があります$(element).off("mouseenter mouseleave");
Dennis98

10

アンバインドmouseentermouseleaveイベント個別に、またはアンバインド要素(複数可)上のすべてのイベント。

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

または

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

4

unbind()は、ハードコードされたインラインイベントでは機能しません。

したがって、たとえば、マウスオーバーイベントをからバインド解除したい場合、それを すばやく簡単に実行できる方法である<div id="some_div" onmouseover="do_something();">こと$('#some_div').attr('onmouseover','')がわかりました。


4

別の解決策は、.live()を使用してアタッチされたイベントの.die()です。

例:

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

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

ここで良い参照を見つけることができます:jQuery .live()と.die()の探索

(私の英語で申し訳ありません: ">)


2

すべてのホバーが舞台裏で行っていることは、mouseoverプロパティとmouseoutプロパティにバインドされています。私はあなたの機能をそれらのイベントから個別にバインドおよびアンバインドします。

たとえば、次のHTMLがあるとします。

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

あなたのjQueryは次のようになります:

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

});

修正、jqueryを確認した後、srcホバーは実際にmouseenter / mouseleaveにバインドしています。同じことをする必要があります。
bendewey 2009

2

onを使用して、によって添付された特定のイベントハンドラを削除できます。off

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

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

これを使用して、handlerFunctionのみを削除します
別の良い方法は、複数の添付イベントに名前空間を設定することです

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

これは.hover()の2番目の引数(関数)として機能することがわかりました

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

最初の関数(.hover()の引数)はマウスオーバーで、コードを実行します。2番目の引数はマウスアウトで、ホバーイベントを#yourIdからバインド解除します。コードは1回だけ実行されます。


1
$.unbind()このようにそれ自体で、そのオブジェクトからすべてのイベントを削除しませんか?あなたの$.click()イベントのようなものが今失敗するでしょう、そうですか?
Alexis Wilke 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.