моя функция наведения в jquery не работает

я пытаюсь добавить тег p с некоторым текстом, и я пытаюсь показать предупреждающее сообщение при наведении курсора на содержимое тега p, но здесь это не работает, вот мой код: код


person Suresh Pattu    schedule 12.12.2011    source источник
comment
Если вы собираетесь добавить несколько элементов (как это возможно в вашей демонстрации), используйте class вместо id. id должен быть уникальным во всем документе.   -  person Emil Lundberg    schedule 12.12.2011


Ответы (4)


Вот: http://jsfiddle.net/Skooljester/37TUN/3/ Вместо click и hover я использовал функцию live.

Вот код:

$('#addmore').live("click", function(){
   $('<p id="text3">text3</p>').appendTo('#paragraph_div');
});   
$('#text3').live("mouseover", function(){
   alert('its done!');
});
person ayyp    schedule 12.12.2011
comment
Это приемлемо, но обратите внимание, что в live есть некоторые серьезные недостатки и что он объявлен устаревшим. . Если возможно, я бы привязывал событие постфактум по мере необходимости, а когда это невозможно, использовал бы delegate или on. - person David Brainer; 12.12.2011
comment
@DavidBrainer-Banker Спасибо за предупреждение! Я посмотрю на другие вещи, это был лучший способ, который я знал, как это сделать. - person ayyp; 12.12.2011

Вы вызываете hover() для элемента, которого еще нет в DOM. Чтобы обойти это, используйте on():

  $('#paragraph_div').on('mouseover','#text3',function(e){
        if ($(e.target).is('#text3')){
            alert("It's done!");
        }
    });

демонстрация JS Fiddle.

Как отмечено в комментариях Alnitak, on() доступен только с версией jQuery 1.7 и выше. Чтобы использовать версию jQuery до версии 1.7, вы можете использовать delegate() для того же эффекта:

  $('#paragraph_div').delegate('#text3','mouseover',function(e){
        if ($(e.target).is('#text3')){
            alert("It's done!");
        }
    });

демонстрация JS Fiddle с использованием jQuery 1.4.4 (просто для демонстрации другой версии).

person David says reinstate Monica    schedule 12.12.2011
comment
но только если вы используете jQuery 1.7+, в противном случае используйте .live() - person Alnitak; 12.12.2011
comment
Что ж, до версии 1.7 delegate() является предпочтительным вариантом (согласно примечаниям к live()). - person David says reinstate Monica; 12.12.2011

Вам просто нужно немного изменить свой код. Вот что я изменил:

$('#addmore').click(function() {
    $('#paragraph_div').append("<p id='text3'>text3</p>");
    $('#text3').hover(function() {
        alert('its done!');
    });
});

Вы пытались связать событие hover до того, как создали div для его привязки. Я переместил его внутрь события click, где вы фактически создавали div text3. Вы должны всегда помнить о привязке событий после создания новых элементов dom.

Обратите внимание, что, как упоминалось в некоторых других ответах, вы можете использовать live (устаревшее), delegate или on (1.7+). Однако я склонен ошибаться, добавляя события к элементам после создания, когда это целесообразно.

Кроме того, вызов оповещения во время события hover может не иметь смысла в зависимости от ваших намерений. Возможно, вы захотите использовать hover для отображения div или выполнения другого действия. Если вы хотите всплывающее предупреждение, лучше использовать mouseover. Дополнительные сведения см. в разделе JavaScript/jQuery: событие запущено дважды.

$('#addmore').click(function() {
    $('#paragraph_div').append("<p id='text3'>text3</p>");
    $('#text3').mouseover(function() {
        alert('its done!');
    });
});
person David Brainer    schedule 12.12.2011
comment
Однако это вызывает предупреждение дважды. - person Prisoner; 12.12.2011
comment
@Prisoner Вы имеете в виду, если вы добавите более одного элемента с идентификатором text3? Вы определенно не должны добавлять несколько элементов с одним и тем же идентификатором. - person David Brainer; 12.12.2011
comment
Нет, это произойдет, если я создам только один #text3 и наведу на него курсор (дважды окно предупреждения) - используя Chrome 15. - person Prisoner; 12.12.2011
comment
@Prisoner Проблема, о которой вы говорите, связана с взаимодействием между предупреждением и наведением (см. stackoverflow.com/questions/598276/). Было бы лучше использовать наведение мыши или что-то другое, кроме предупреждения. Я просто отвечал на вопрос оригинального плаката. - person David Brainer; 12.12.2011

1-е, пожалуйста, удалите document кавычки. Во-вторых, измените hover, чтобы он жил с событиями mouseenter и mouseleave, потому что hover неявно вызывает события mouseenter и mouseleave. проверьте скрипку http://jsfiddle.net/37TUN/10/

$(document).ready(function () {
$('#addmore').click(function(){
$('#paragraph_div').append("<p id='text3'>text3</p>");
});
$('#text3').live('mouseenter mouseleave',function(){
alert('its done!');
});
}); 
person dku.rajkumar    schedule 12.12.2011