2009-11-05 14 views
6

Poniższe pytanie jest inspirowane przez this blog entry w ajaxian.com i this comment by paul irish.Dlaczego wyrażenie na żywo musi być ocenione w jQuery

Oto sposób deklarowania wydarzenia na żywo.

$("li a").live(...) 

Zgodnie this blog entry, to jest moje zrozumienie, że żyć wydarzenia są niczym innym, jak połowu wszystko na poziomie dokumentu. Każde zdarzenie, które pęcznieje do samego końca, jest przechwytywane przez zdarzenia na żywo i jeśli selektor jest zgodny, wywoływana jest funkcja.

To jest moje zrozumienie, że na dokumencie gotowy jeśli modlę

$("li a").live('click', ..) 

potem wszystko jQuery powinien zrobić, to umieścić dosłowny selektor „li się” gdzieś w pamięci. Teraz, gdy dochodzi do kliknięcia i jeśli to kliknięcie powoduje bańki do samego końca, to na żywo należy sprawdzić, jaki jest element docelowy. Jeśli element docelowy spełnia regułę "li a", wówczas funkcja powinna zostać uruchomiona, w przeciwnym razie zignoruje to wydarzenie bąbelkowane.

Na podstawie tego domniemania na dokumencie gotowy kiedy wzywam

$("li a").live('click', ..) 

następnie idealnie jQuery nie powinny faktycznie patrząc na cały element dopasowanie „li a” ponieważ jQuery nie nic z tych elementów zrobić. Wiem na pewno, że elementy, które są obecnie obecne w dokumencie pasującym do "li a", nie są powiązane z żadną obsługą zdarzenia.

Jeśli wszystko, co jQuery musi zrobić, to umieścić dosłownie "li a" na poziomie katalogu głównego, po co szukać elementów spełniających kryteria "li a" w przygotowanym dokumencie. Ale w oparciu o link komentarza, o którym wspomniałem na górze, wygląda na to, że jQuery szuka elementu na gotowym dokumencie.

Moje pytanie brzmi: dlaczego metoda live powinna znajdować wszystkie metody "li a", gdy nie zamierza nic z nimi zrobić. Wydaje mi się, że składnia na żywo powinna być czymś w rodzaju czegoś podobnego do tego, co na przykład:

$.live('li a', 'click', function(){}) 
Czy brakuje mi tutaj czegoś?

Odpowiedz

5

Moje zrozumienie, dlaczego to łapie wszystkie elementy z DOM dlatego, że to, co robi funkcja $(), a następnie po jej wybrane elementy DOM wykonuje on funkcję live().

W takim przypadku należy zastosować jedno z obejść sugerowanych w innych miejscach w odpowiedziach tutaj.

0

Jest nieudokumentowana sposób w tej chwili, która będzie działać bez uprzednio wybierając elementy

jQuery.fn.selector="p"; 
jQuery.fn.live('click',function(){ 
    alert('clicked'); 
}); 

ta pozwala na ustawienie na żywo obsługi bez jQuery pasujące elementy, które obecnie istnieją w DOM, który ignoruje anyway .

2

i posiekany ten problem poprzez nadpisanie find():

jQuery.fn.find = function(old) { 
    return function() { 
     var m = arguments[0].match(/^lazy:(.*)/); 
     if(m) { 
      this.selector = m[1]; 
      return this; 
     } 
     return old.apply(this, arguments); 
    } 
} (jQuery.fn.find); 

    // this will select elements... 
    $("input").live("click", function() { 

    // this won't 
    $("lazy:input").live("click", function() { 
2

live to tylko sposób na delegowanie wydarzeń osobom, które nie rozumieją tego łatwo.

Zapoznajesz się z pojęciem i potrzebujesz wydajności. Sugerowałbym, aby rzeczywiście użyć delegowania zdarzeń zamiast live.

$(document).bind('click', function(event) 
{ 
    var $target = $(event.target); 

    if($target.is('li a')) 
    { 
     // Do something with $target 
    } 
}); 
Powiązane problemy