2012-02-05 8 views
0

У меня есть хороший скрипт всплывающей подсказки. Scrip помещает атрибут title элемента в div tooltip. Подсказка следует за стрелкой мыши через mousemove, удаляет div после mouseout и возвращает название элемента. Он отлично работает на статических страницах, но у меня есть некоторые проблемы с ajax.Несколько .live() привязаны к элементу

http://jsfiddle.net/b5LRK/3/

И я пытаюсь применить .live() для этого сценария. Что-то вроде этого:

$('[title]').live({ 
    mouseover: function(e) { 
    var tip = $(this).attr('title'); 
    $(this).removeAttr('title'); 

    $('body').append('<div id="tooltip">' + tip + '<div class="tipArrow"></div></div>'); 

    $('#tooltip').css('top', e.pageY + 25); 
    $('#tooltip').css('left', e.pageX - 15); 

}, mousemove: function(e) { 

    $('#tooltip').css('top', e.pageY + 25); 
    $('#tooltip').css('left', e.pageX - 15); 

}, mouseout: function() { 

    $(this).attr('title', $('#tooltip').text()); 
    $('body').children('div#tooltip').remove(); 

}}); 

И это не работает! В чем проблема?

+0

возможно, потому что его 'live', когда вы удаляете атрибут' title', обработчик 'mouseout' больше не зарегистрирован? – yoavmatchulsky

ответ

1

Из того, что я видел, проблема с селектором - live() не может работать с селектором, например [title] - он может «прослушивать» селекторов классов или элементов.

Here is fiddle proving it, я только что изменил $('[title]') до $('.mydiv').

Так что просто добавьте класс в содержимое, которое вы загружаете, и оно должно работать нормально, так как вы можете «слушать» этот класс, и .live() может знать, когда добавляются новые элементы с таким классом, а затем присоединяют события.

Если вы не можете контролировать содержание AJAX, вы можете также применить класс на лету на всех элементов, имеющих title, например:

$("#btnAdd").click(function() { 
    $("#Panel").append("<div title='hello world'></div>"); 
    $("#Panel [title]").attr("class", "mydiv"); 
}); 

Updated fiddle.

+0

kudos. Я слишком медленный. проверьте [мою скрипку] (http://jsfiddle.net/b5LRK/10/). Я сохранил заголовок в другом атрибуте и зарегистрировал mouseout для элементов с атрибутом 'data-title'. – yoavmatchulsky

+0

@yoavmatchulsky ваша скрипка вообще не работает, по крайней мере для меня в Chrome. Всплывающая подсказка не движется вместе с мышью. –

+0

Ох, забыл переместить 'mousemove' в [название данных]. http://jsfiddle.net/b5LRK/11/. btw, Если вы не хотите использовать функцию заголовка браузера, не используйте его. сохраните заголовок, который вы хотите в атрибуте 'data-title' или что-то – yoavmatchulsky

2

Вы пропустили } в конце live функции:

$('[title]').live({ 
    mouseover: function(e) { 
    var tip = $(this).attr('title'); 
    $(this).removeAttr('title');  
    $('body').append('<div id="tooltip">' + tip + '<div class="tipArrow"></div></div>'); 

}, mousemove: function(e) { 

    $('#tooltip').css('top', e.pageY + 25); 
    $('#tooltip').css('left', e.pageX - 15); 

}, mouseout: function() { 

    $(this).attr('title', $('#tooltip').text()); 
    $('body').children('div#tooltip').remove(); 

}}/*<=that "}" was missing...*/);  
+0

Yup, мой плохой. Но. Он все еще работает неправильно. – Toon

+0

@Toon. Неправильно? Что именно? Пожалуйста, дайте ** JSFiddle ** для работы. – gdoron

+0

Подсказка показывает. Это все. Кажется, mousemove и mouseout не работают. – Toon

0
$('[title]').on("mouseover", function(e) { 

    var tip = $(this).attr('title'); 
    $(this).removeAttr('title'); 

    $('body').append('<div id="tooltip">' + tip + '<div class="tipArrow"></div></div>'); 

    $('#tooltip').css('top', e.pageY + 25); 
    $('#tooltip').css('left', e.pageX - 15); 

}).on("mousemove",function(e) { 

    $('#tooltip').css('top', e.pageY + 25); 
    $('#tooltip').css('left', e.pageX - 15); 

}).on("mouseout",function() { 

    $(this).attr('title', $('#tooltip').text()); 
    $('body').children('div#tooltip').remove(); 
}); 

с версии 1.7 есть новая функция для живой, призвал, может помочь

http://jsfiddle.net/gKsSz/1/

+0

Это действительно работает, но это не делегировать ... – gdoron

Смежные вопросы