Можно ли использовать jQuery .on и hover?

331

У меня есть, <ul>который заполняется JavaScript после начальной загрузки страницы. В настоящее время я использую .bindс mouseoverи mouseout.

Проект только что обновился до jQuery 1.7, поэтому у меня есть возможность использовать .on, но я не могу заставить его работать hover. Можно ли использовать .onс hover?

РЕДАКТИРОВАТЬ : элементы, с которыми я связываюсь, загружаются с JavaScript после загрузки документа. Вот почему я использую onи не только hover.

Ryre
источник
3
Из комментария ниже - поддержка события hover в On () устарела в jQuery 1.8 и удалена в jQuery 1.9 . Попробуйте с комбинацией mouseenterи mouseleave, как предложено calebthebrewer.
SexyBeast

Ответы:

677

( Посмотрите на последнее изменение в этом ответе, если вам нужно использовать .on()элементы, заполненные JavaScript )

Используйте это для элементов, которые не заполнены с использованием 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(), но:

Несмотря на то, что новый код настоятельно не рекомендуется, вы можете увидеть псевдо-событие-имя "hover", используемое как сокращение для строки "mouseenter mouseleave". Он присоединяет один обработчик событий к этим двум событиям, и обработчик должен изучить event.type, чтобы определить, является ли событие mouseenter или mouseleave. Не путайте псевдо-имя-события hover с методом .hover (), который принимает одну или две функции.

Кроме того, нет никаких преимуществ с точки зрения производительности, и это более громоздко, чем просто использование mouseenterили mouseleave. Ответ, который я предоставил, требует меньше кода и является правильным способом достижения чего-то подобного.

РЕДАКТИРОВАТЬ

Прошло много времени с тех пор, как на этот вопрос был дан ответ, и, похоже, он набрал обороты. Приведенный выше код остается в силе, но я хотел бы добавить что-то к своему первоначальному ответу.

Хотя я предпочитаю использовать mouseenterи mouseleave(помогает мне понять, что происходит в коде) с .on()ним все равно, что написать следующее сhover()

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

Так как в первоначальном вопросе спрашивалось, как они могут правильно работать on()с ними hover(), я подумал, что исправлю использование, on()и не счел необходимым добавлять hover()код в то время.

РЕДАКТИРОВАТЬ 11 ДЕКАБРЯ 2012 ГОДА

Некоторые новые ответы, представленные ниже, подробно описывают, как .on()должно работать, если рассматриваемый divвопрос заполнен с использованием JavaScript. Например, допустим, вы заполняете событие с divиспользованием jQuery .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

Этот код будет работать для элемента, заполненного JavaScript после .load()события. Просто измените свой аргумент на соответствующий селектор.

Sethen
источник
1
@ Скотт, обратите внимание, что ответ JonMcIntosh не отвечает на мой вопрос, потому что он использует только половину функции наведения.
Ryre
1
Это не работает для элементов, которые были добавлены в DOM. Как @Nik Chankov указывает ниже, вот правильное использование .on () для подключения нескольких обработчиков stackoverflow.com/questions/8608145/...
soupy1976
1
@ soupy1976 Отредактировал мой ответ, теперь он учитывает элементы, заполненные JavaScript.
Сетен
1
@SethenMaleno - точно, и ваше .on()решение работает либо с удалением псевдо- парения, либо с использованием реальных. Мне нравится первый, который вы проиллюстрировали с помощью mouseenter / mouseleave +1 для этого
Mark Schultheiss
1
Эта редакция изменила мой голос с отрицательного на положительный, хорошо сыграно, Сетен, хорошо сыграно!
Шон Кендл
86

Ни одно из этих решений не помогло мне при наведении указателя мыши на объекты, созданные после загрузки документа в качестве запросов. Я знаю, что этот вопрос старый, но у меня есть решение для тех, кто еще ищет:

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

Это свяжет функции с селектором, так что объекты с этим селектором, созданным после того, как документ будет готов, по-прежнему смогут вызывать его.

cazzer
источник
5
У этого есть правильное решение: stackoverflow.com/questions/8608145/…
Ник Чанков
Вот так я и заработал, я нашел принятый ответ, помещающий селектор до того, как .on не работает после события .load (), но это работает.
MattP
@calebthebrewer Отредактировал мой ответ, теперь он учитывает элементы, заполненные JavaScript.
Сетен
5
Использование mouseoverи mouseoutсобытий здесь будет вызывать непрерывный запуск кода, когда пользователь перемещает мышь внутри элемента. Я думаю mouseenterи mouseleaveболее уместно, так как он будет срабатывать только один раз при входе.
johntrepreneur
1
Использование документа в качестве корневого элемента не является наилучшей практикой, так как его производительность голодна. вы отслеживаете документ, в то время как с помощью load () большую часть времени вы манипулируете только частью веб-сайта (например, #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()с, hoverкогда вы можете так же легко избавиться .on()и заменить его на .hover()функцию и получить те же результаты. Разве jQuery не пишет меньше кода?
Сетен
@ Пока это не так, смотрите мой ответ ниже, чтобы узнать, как выполнять mouseenterи mouseleaveфункционировать с.on()
Сетен
Я обновил свой ответ, чтобы включить использование обоих типов событий. Это работает так же, как ответ Сетена, но имеет другой вкус.
Джон Макинтош,
24
hoverподдержка событий On()была объявлена ​​устаревшей в jQuery 1.8 и удалена в jQuery 1.9.
Ушли кодирования
9

Функция наведения jQuery дает возможность наведения и наведения мыши.

$ (Селектор) .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
});

Несмотря на то, что это препятствовало вызову нескольких экземпляров моей анимации, я в конечном итоге пошел с помощью mouseover / mouseleave, так как мне нужно было определить, когда над дочерними элементами родительского элемента находились мыши.

KryptoniteDove
источник
Этот ответ фактически предоставил рабочее решение для добавления события наведения для селектора документа. +1
Рич Дэвис
5

Вы можете использовать .on()с hoverтем, что сказано в разделе «Дополнительные примечания»:

Несмотря на то, что новый код настоятельно не рекомендуется, вы можете увидеть псевдо-событие-имя "hover", используемое как сокращение для строки "mouseenter mouseleave". Он присоединяет один обработчик событий к этим двум событиям, и обработчик должен изучить event.type, чтобы определить, является ли событие mouseenter или mouseleave. Не путайте псевдо-имя-события hover с методом .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: имя «hover», используемое как сокращение для строки «mouseenter mouseleave». Он присоединяет один обработчик событий к этим двум событиям, и обработчик должен изучить event.type, чтобы определить, является ли событие mouseenter или mouseleave. Не путайте псевдо-имя-события hover с методом .hover (), который принимает одну или две функции.

Код Маверик
источник
1
Это просто больше работы, когда это легко сделать с помощью mouseenterи mouseleave... Я знаю, это не отвечает на первоначальный вопрос OP, но все же, использование hoverтаким образом, не разумно.
Сетен
Делая это таким образом, в точности следуйте тому, как команда jQuery предлагает вам сделать это в соответствии с вопросом ОП. Однако, как предполагает команда jQuery, мы настоятельно не рекомендуем новый код. Но это все еще правильный ответ на вопрос ОП.
Код Maverick
1
@ Скотт - ты был быстрее меня :-). @Sethen - оба способа будут работать, но спрашивающий запросил функциональность с .hover().
Джон Макинтош,
Вполне понятно и так, но все же, я думаю , что OP ищет решение для mouseenterи , mouseleaveа не просто заставить его работать с hover. Если нет никакой реальной причины для использования hoverпо соображениям производительности, зачем использовать его, когда он настоятельно не рекомендуется для нового кода?
Сетен
5
hoverподдержка событий On()была объявлена ​​устаревшей в jQuery 1.8 и удалена в jQuery 1.9.
Ушел кодирования
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');
webmaster01
источник
2

Вы можете указать один или несколько типов событий, разделенных пробелом.

Так hover что равняется mouseenter mouseleave.

Это мое предположение:

$("#foo").on("mouseenter mouseleave", function() {
    // do some stuff
});
user2386291
источник
Мне нравится решение JQ обесценить этот параметр. В предыдущей версии 1.8 использование hover в качестве пространства имен не совпадало с событием DOM, hover, никак не связано.
Jim22150
1

Если вам нужно, чтобы это было условием в другом событии, я решил это следующим образом:

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

Тогда в другом случае вы можете легко использовать его:

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

(Я вижу, что некоторые используют is(':hover')для решения этой проблемы. Но это (пока) не действительный селектор jQuery и не работает во всех совместимых браузерах)

Sanne
источник
-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.

Крис Марисик
источник