jQuery .onとhoverを使用することは可能ですか?


331

<ul>最初のページの読み込み後にJavaScriptが入力されたがあります。現在.bindmouseoverおよびを使用していmouseoutます。

プロジェクトがjQuery 1.7に更新されたばかりなので、を使用するオプションがありますが、で動作する.onようには見えませんhover。それを使用することが可能である.onhover

編集:私がバインドしている要素は、ドキュメントの読み込み後にJavaScriptで読み込まれます。そのため、私はonだけでなくも使用していますhover


3
以下のコメントから-On()でのホバーイベントサポートはjQuery 1.8で廃止され、jQuery 1.9で削除されました。組み合わせで試してみてくださいmouseentermouseleavecalebthebrewerによって示唆されているように、。
SexyBeast 2016

回答:


677

JavaScriptが入力された要素で使用する必要がある場合は、この回答の最後の編集を確認してください.on()

JavaScriptを使用して入力されていない要素にこれを使用します。

$(".selector").on("mouseover", function () {
    //stuff to do on mouseover
});

.hover()独自のハンドラーがあります:http : //api.jquery.com/hover/

複数のことを行いたい場合は、.on()ハンドラーで次のようにチェーンします。

$(".selector").on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
});

下記の回答によると、で使用できますhover.on()

新しいコードでは強く非推奨ですが、文字列「mouseenter mouseleave」の省略形として使用される疑似イベント名「hover」が表示される場合があります。これらの2つのイベントに単一のイベントハンドラーをアタッチします。ハンドラーはevent.typeを調べて、イベントがmouseenterかmouseleaveかを判別する必要があります。「hover」疑似イベント名を、1つまたは2つの関数を受け入れる.hover()メソッドと混同しないでください。

また、それを使用してもパフォーマンス上の利点はなく、mouseenterまたはを使用するよりもかさばりmouseleaveます。私が提供した答えは、必要なコードが少なく、このようなことを実現する適切な方法です。

編集

この質問への回答からしばらく経ち、ある程度の牽引力を得ているようです。上記のコードはまだ有効ですが、元の回答に何かを追加したいと思いました。

私が使用して好むmouseentermouseleaveで(私はコードで起こっていただきましたを理解するのに役立ちます).on()それだけで書くと以下のように同じですhover()

$(".selector").hover(function () {
    //stuff to do on mouse enter
}, 
function () {
    //stuff to do on mouse leave
});

元の質問は、彼らが適切に使用することができますどのように尋ねなかったためon()hover()、私はの使用を修正するだろうと思ったon()し、それが必要な追加する見つけることができませんでしたhover()時にコードを。

2012年12月11日を編集

以下に提供されるいくつかの新しい回答.on()div、問題の問題がJavaScriptを使用して入力された場合にどのように機能するかを詳しく説明しています。たとえば、divjQueryの.load()イベントを使用して、次のように入力するとします。

(function ($) {
    //append div to document body
    $('<div class="selector">Test</div>').appendTo(document.body);
}(jQuery));

上記のコードは.on()有効ではありません。代わりに、次のようにコードを少し変更する必要があります。

$(document).on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
}, ".selector"); //pass the element as an argument to .on

このコードは、.load()イベントが発生した後にJavaScriptが入力された要素に対して機能します。引数を適切なセレクターに変更するだけです。


1
@スコット、ホバー機能の半分しか使用していないので、JonMcIntoshの回答は私の質問に回答しないことに注意してください。
Ryre

1
これは、DOMに追加された要素では機能しません。@Nik Chankov以下に指摘するように、ここで複数のハンドラ取り付けるため.onの正しい使用()であるstackoverflow.com/questions/8608145/...
soupy1976

1
@ soupy1976私の回答を編集し、JavaScriptが入力された要素を考慮に入れるようになりました。
Sethen

1
@SethenMaleno-正確に言えば、あなたの.on()ソリューションは、疑似ホバーイベントを削除して、実際のイベントを使用することで機能します。私はあなたがmouseenter / mouseleave +1でそれを説明した最初のものを気に入っています
Mark Schultheiss

1
その編集により、私の投票は下向きの投票から上向きの投票に変わりました。
Sean Kendle 2013

86

質問のリクエストとしてドキュメントが読み込まれた後に作成されたオブジェクトをマウスオーバー/マウスアウトすると、これらのソリューションはどれもうまくいきませんでした。私はこの質問が古いことを知っていますが、まだ探している人のための解決策があります:

$("#container").on('mouseenter', '.selector', function() {
    //do something
});
$("#container").on('mouseleave', '.selector', function() {
    //do something
});

これにより、関数がセレクターにバインドされるため、ドキュメントの準備ができた後に作成されたこのセレクターを持つオブジェクトは、引き続きそれを呼び出すことができます。


5
この1は、適切な解決策を持っていますstackoverflow.com/questions/8608145/...
ニックChankov

これも私がそれを機能させた方法です..load()イベントの後に.onが機能しない前にセレクターを置くと受け入れられた答えが機能しませんでしたが、これは機能します。
MattP

@calebthebrewer私の回答を編集しました。JavaScriptが入力された要素が考慮されるようになりました。
Sethen

5
ここでmouseovermouseoutイベントを使用すると、ユーザーが要素内でマウスを動かしたときにコードが継続的に起動します。エントリー時に一度だけ発砲するのでmouseenter、私mouseleaveはより適切だと思います。
johntrepreneur 2013年

1
ルートエレメントとしてドキュメントを使用することは、パフォーマンスが低下するため、ベストプラクティスではありません。あなたはドキュメントを監視していますが、load()を使用すると、ほとんどの場合、ウェブサイトの一部のみを操作します(f.ex. #content)。そう、その優れた要素にそれを絞り込むしようとする、ザッツを操作...
honk31

20

JavaScriptの残りの部分がどのように見えるのかわからないので、干渉があるかどうかはわかりません。しかし.hover()、のイベントとしては問題なく動作し.on()ます。

$("#foo").on("hover", function() {
  // disco
});

イベントを利用できるようにするには、イベントから返されたオブジェクトを使用します。

$("#foo").on("hover", function(e) {
  if(e.type == "mouseenter") {
    console.log("over");
  }
  else if (e.type == "mouseleave") {
    console.log("out");
  }
});

http://jsfiddle.net/hmUPP/2/


これは、ホバーが使用するオン/オフの個別の機能をどのように処理しますか?例: $('#id').hover(function(){ //on }, function(){ //off});
Ryre

私には、これは必要ありません。簡単に削除して関数に置き換えて同じ結果を得ることができる場合は.on()、with を使用する必要はありません。jQueryはより少ないコードを書くことについてではないですか?hover.on().hover()
Sethen

@トーストはサポートしていません。以下で私の答えを見て、実行方法mouseentermouseleave機能を確認してください.on()
Sethen

両方のイベントタイプの使用率を含めるように回答を更新しました。これはSethenの回答と同じように機能しますが、風味が異なります。
ジョンマッキントッシュ

24
hoverでのイベントサポートはOn()jQuery 1.8で廃止され、jQuery 1.9で削除されました。
コーディング終了2013

9

jQueryホバー関数は、マウスオーバーとマウスアウトの機能を提供します。

$(selector).hover(inFunction、outFunction);

$(".item-image").hover(function () {
    // mouseover event codes...
}, function () {
    // mouseout event codes...
});

出典:http : //www.w3schools.com/jquery/event_hover.asp


3
間違いなく動作します。一部の人々は捨てられているので、あなたは反対票を投じました!ありがとうメイト
カリーム

8

ウェブからサーフィンして、貢献できると感じました。@calethebrewerが投稿した上記のコードを使用すると、セレクターで複数の呼び出しが発生し、予期しない動作が発生する可能性があることに気づきました。例:-

$(document).on('mouseover', '.selector', function() {
   //do something
});
$(document).on('mouseout', '.selector', function() {
   //do something
});

このフィドルhttp://jsfiddle.net/TWskH/12/は私のポイントを示しています。プラグインなどで要素をアニメーション化すると、これらの複数のトリガーが意図しない動作を引き起こし、アニメーションまたはコードが必要以上に呼び出される可能性があることがわかりました。

私の提案は、単にmouseenter / mouseleaveに置き換えることです:-

$(document).on('mouseenter', '.selector', function() {
   //do something
});
$(document).on('mouseleave', '.selector', function() {
   //do something
});

これにより、アニメーションの複数のインスタンスが呼び出されなくなりましたが、親の子がいつホバーされているのかを判断する必要があるため、最終的にマウスオーバー/マウス休暇を使いました。


この回答は実際には、ドキュメントセレクターのホバーイベントを追加するための実用的なソリューションを提供しました。+1
リッチデイビス

5

あなたはあなたが追加ノートセクションが言うことをする.on()ことhoverによって使うことができます:

新しいコードでは強く非推奨ですが、文字列「mouseenter mouseleave」の省略形として使用される疑似イベント名「hover」が表示される場合があります。これらの2つのイベントに単一のイベントハンドラーをアタッチします。ハンドラーはevent.typeを調べて、イベントがmouseenterかmouseleaveかを判別する必要があります。「hover」疑似イベント名を、1つまたは2つの関数を受け入れる.hover()メソッドと混同しないでください。

それは次のようにすることです:

$("#foo").on("hover", function(e) {

    if (e.type === "mouseenter") { console.log("enter"); }
    else if (e.type === "mouseleave") { console.log("leave"); }

});

編集(jQuery 1.8以上のユーザー向けの注意):

jQuery 1.8で非推奨、1.9で削除:文字列「mouseenter mouseleave」の省略形として使用される「hover」という名前。これらの2つのイベントに単一のイベントハンドラーをアタッチします。ハンドラーはevent.typeを調べて、イベントがmouseenterかmouseleaveかを判別する必要があります。「hover」疑似イベント名を、1つまたは2つの関数を受け入れる.hover()メソッドと混同しないでください。


1
これは、それが簡単に使用することによって行うことができるだけでより多くの仕事であるmouseentermouseleave私は知っている...、これはOPの元の質問に答えていないが、それでも、使用してhoverこのように、賢明ではありません。
Sethen

この方法で行うのは、OPの質問に従ってjQueryチームが提案する方法に正確に従います。ただし、jQueryチームが示唆しているように、新しいコードはお勧めしません。しかし、それでもOPの質問に対する正しい答えです。
コードマーベリック

1
@スコット-あなたは私よりも速かった:-)。@Sethen-どちらの方法でも機能し.hover()ますが、質問者はで機能を要求しました。
Jon McIntosh

当然のことながらそうですが、それでも、OPはで動作させるだけmouseentermouseleaveなく、のソリューションを探していたと思いますhoverhoverパフォーマンス上の理由で実際に使用する理由がない場合、新しいコードが推奨されないのになぜそれを使用するのですか?
Sethen

5
hoverでのイベントサポートはOn()jQuery 1.8で廃止され、jQuery 1.9で削除されました。
コーディング終了2013

5
$("#MyTableData").on({

 mouseenter: function(){

    //stuff to do on mouse enter
    $(this).css({'color':'red'});

},
mouseleave: function () {
    //stuff to do on mouse leave
    $(this).css({'color':'blue'});

}},'tr');

2

スペースで区切られた1つまたは複数のイベントタイプを指定できます。

だから、hover等号mouseenter mouseleave

これは私の提案です:

$("#foo").on("mouseenter mouseleave", function() {
    // do some stuff
});

このパラメーターを下げるというjQの決定が好きです。以前のバージョン1.8では、名前空間としてホバーするために使用すると、DOMイベント、ホバー、リレーションなしと一致しませんでした。
Jim22150 2014

1

他のイベントの条件として必要な場合は、次の方法で解決しました。

$('.classname').hover(
     function(){$(this).data('hover',true);},
     function(){$(this).data('hover',false);}
);

次に、別のイベントで簡単に使用できます。

 if ($(this).data('hover')){
      //...
 }

(私はis(':hover')これを解決するためにいくつかのを使用しているようです。しかし、これは(まだ)有効なjQueryセレクターではなく、すべての互換性のあるブラウザーで動作しません)


-2

jQueryプラグインhoverIntent http://cherne.net/brian/resources/jquery.hoverIntent.htmlは、ここにリストされた単純なアプローチよりもはるかに進んでいます。それらは確かに機能しますが、必ずしもユーザーの期待どおりに動作するとは限りません。

hoverIntentを使用する最大の理由は タイムアウトです機能です。これにより、ユーザーが目的のアイテムをクリックする前に、ユーザーがマウスを少し右または左にドラッグしすぎてメニューが閉じないようにすることができます。また、弾幕でホバーイベントをアクティブ化しない機能を提供し、ホバリングの集中を待ちます。

使用例:

var config = {    
 sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)    
 interval: 200, // number = milliseconds for onMouseOver polling interval    
 over: makeTall, // function = onMouseOver callback (REQUIRED)    
 timeout: 500, // number = milliseconds delay before onMouseOut    
 out: makeShort // function = onMouseOut callback (REQUIRED)
};
$("#demo3 li").hoverIntent( config )

これの詳細な説明はhttps://stackoverflow.com/a/1089381/37055で見つけることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.