2010-06-04 3 views
1

Вот мой код:jQuery - Не может быть привязан к элементу метки .live(). Зачем?

HTML:

<ul id="more-items"> 
    <li><label class="button">hi</label></li> 
    <li><label class="button">hi</label></li> 
    <li><label class="button">hi</label></li> 
</ul> 

Javascript:

$('ul#more-items label.button').live('click', function() 
{ 
    alert(1); 
}); 

Щелкнув на этикетках не вызывает огонь предупреждение(). Связывание .live(), по-видимому, не влияет на элемент метки ...

Если я изменил его на использование .click() или даже .bind(), он отлично работает. Есть ли причина, по которой .live() не работает? Есть ли способ исправить это?

Причина, по которой я использую .live(), состоит в том, что ul#more-items будет считываться на страницу несколько раз, и я не хочу, чтобы каждый раз, когда происходит повторная попытка щелчка, нужно отключать функцию.

+2

Вы действительно не можете ожидать, ** что-нибудь ** работать, если одни и те же «ID» значение между несколькими элементами , – Pointy

ответ

0

попробовать

$('label.button').live('click', function() 
{ 
    alert(1); 
}); 

или

$('ul#more-items').delegate('label.button','click', function() 
{ 
    alert(1); 
}); 
+0

Просто попробовал и то, и другое не работал – dave

0

кажется нормально, но ваше предупреждение должно быть предупреждение ("1");

или:

var 1 = "1";

предупреждение (1);

+1

hmmm .... реально ?? серьезно ??? – Reigel

+0

предупреждение (1). для проверки типа javascript: alert (1) в адресной строке. вы увидите, что он правильно предупреждает номер 1. –

+0

@Reigel, могу ли я ошибиться? :([@John Hartsock, humm ... tks для головы вверх :)] – Zuul

1

Идентификаторы элементов должны быть уникальными. Ваш stament «Причина я использую .live(), потому что ули # более-элементы будут readded на странице несколько раз ..» говорит мне, что вы будете иметь несколько из них:

<ul id="more-items"> 
    <!--Stuff--> 
</ul> 
<ul id="more-items"> 
    <!--Stuff--> 
</ul> 

Это быть недопустимым HTML, поскольку идентификаторы больше элементов существуют дважды.

+0

Забыл Я читал, что UL несколько раз, когда Я писал HTML>. <Теперь изменил класс. Однако проблема с .live() не устраняется. – dave

+0

Вы тоже сменили селектор? 'ul.more-items label.button' (изменить« # »на«. ») – Pointy

-1

Ваш код работает для меня. Какую версию jquery вы используете? Вы определяете javascript в функции $ (document) .ready?

+0

Да, у меня есть код в функции $ (document) .ready. Я использую: http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js – dave

6

Метод jQuery's live() использует работу с пузырьками событий (вплоть до корневого узла).

Если есть какой-либо код, который остановит пузырьковое событие на label или любом из его предков, live() не будет работать.

Любой шанс, что у label или у одного из его предков есть обработчик с любым из следующих?

return false; 

или

event.stopPropagation(); 

Если да, то live() потерпит неудачу.


Соответствующие JQuery документы:

+0

Я просто наткнулся на эту проблему. У моих меток есть привязанный к ним плагин, который возвращает false. Причина этого в том, что функция .click() (привязанная к метке) срабатывает дважды, если не возвращается false. См. Http://groups.google.com/group/jquery-en/browse_thread/thread/af789262532a4c68 – dave

+1

Это сделает это. 'Return false;' вызывает остановку пузырька, поэтому обработчик, который находится в корне дерева DOM, никогда не получает уведомление об увольнении. Я предполагаю, что элементы добавляются динамически. Если это так, вы должны иметь возможность использовать 'bind' вместо' live' при создании элементов. Тогда нет никаких проблем. – user113716

0

Вы можете попробовать это. Он может работать

Изменение:

$('ul#more-items label.button').live('click', function() 
{ 
    alert(1); 
}); 

Для этого:

$('ul#more-items label.button').unbind('click').live('click', function() 
{ 
    alert(1); 
}); 
Смежные вопросы