2012-08-08 14 views
7

używam tego kodu, aby wyświetlić alert na pewnym elemencie:jQuery alert onclick na elemencie elementu?

$("#resultsBox").click(function (event) { 
    console.log('a'); 
    }); 

chcę wyświetlić alert tylko po kliknięciu elementów „LI” wewnątrz "#resultsBox.

Staram się zrobić to tak:

$("#resultsBox li").click(function (event) { 
    console.log('a'); 
    }); 

Jest to element w #resultsBox struktura:

<div id="resultsBox"> 
    <ul> 
    <li></li> 
    <li></li> 
    </ul> 
</div> 

Jak można to zrobić?

+3

Co jest nie tak z tym? To nie działa? To powinno .. – elclanrs

+0

I? Jaki jest problem? Wygląda dobrze. – Strelok

+0

To powinno zadziałać. Być może dynamicznie dodajesz elementy 'li'? A może HTML jest nieważny i jakoś psuje selektor? – jeff

Odpowiedz

15

Podczas wiązania programu obsługi zdarzeń z .click() to dotyczy wszelkich elementów dopasowanych do selektora w tej chwili, nie później elementów dodawanych dynamicznie.

Biorąc pod uwagę Twój div nazywa się „resultsBox”, zasadne wydaje się zakładać, że faktycznie dodawanie rzeczy do niego dynamicznie wyświetlać wyniki innej pracy, w takim przypadku trzeba użyć delegowanego obsługi zdarzenia:

$("#resultsBox").on("click", "li", function (event) { 
    console.log('a'); 
}); 

Ta składnia łączy program obsługi z "#resultsBox", ale po kliknięciu jQuery sprawdza, czy element potomny pasuje do selektora "li" w drugim parametrze - jeśli tak, to wywołuje funkcja, w przeciwnym razie nie.

+0

Czy to jest ważne? Wybierasz 'li' i przekazujesz' li' w drugim arg? – Jashwant

+0

Edytowałeś swoje pytanie, mój komentarz nie jest ważny;) – Jashwant

+0

Przepraszam @ Jashwant, masz rację, ale zauważyłem to literówka i usunąłem. – nnnnnn

0

UPDATE po edycji pytanie:

<div id="resultsBox"> 
    <ul id="myList"> 
    <li></li> 
    <li></li> 
    </ul> 
</div> 


$("#myList > li").click(function (event) { 

     console.log('a'); 

     }); 

Demo

+1

To przyniesie pracę. 'li' nie jest bezpośrednim potomkiem' # resultsBox'' – Jashwant

+0

Zgadzam się, ale to pytanie zostało dodane przed edytowaniem pytania i powiedziano, że 'kliknij 'li' elementy wewnątrz '# resultsBox'' –

+0

Zawsze możesz także edytować swoją odpowiedź :) – Jashwant

1

Coś jak to powinno działać

$("#resultsBox").find("li").click(function(){ 
    alert("You clicked on li " + $(this).text()); 
}); 

To powinno działać teraz: http://jsbin.com/ocejar/2/edit

Ale tak czy inaczej, też swój przykład powyżej przy użyciu $("#resultsBox li") powinien działać dobrze. Zobacz here. Jednak użycie parametru $("#resultsBox").find("li") powinno być zgodne z wymaganiami wydajności.

+0

Po prostu wypróbowałem i nie złapałem kliknięcia. Zaktualizowałem pytanie z zawartością elementów, może dlatego to nie działa. – lisovaccaro

+0

@ Liso22 Odpowiednio zaktualizowałem swoją odpowiedź – Juri

+0

Selektor w pytaniu był '$ (" # resultsBox li ") ...", który będzie już szukał elementów li, które są potomkami (niekoniecznie bezpośrednimi dziećmi) #resultsBox. W kodzie pytania nie ma żadnego znaku ">". – nnnnnn

0
$("#resultsBox").find('li').click(function (event) { 
    alert($(this).text()); 
    }); 
1

Kod jak masz powinien pracować: http://jsfiddle.net/GxCCb/

Ważne, aby pamiętać, że elementy próbujesz dołączyć do obsługi zdarzeń musi istnieć, gdy kod jest oceniany. Jeśli zostanie dodany później, musisz użyć on() (v1.7 +) lub delegate() (< 1.7), który jest używany do delegowania zdarzeń i pozwala na odwoływanie się do elementów, jeśli zostaną dodane później ..

Stosując na():

$("#resultsBox").on('click', 'li', function (event) { 
    alert(this.innerHTML); 
    }); 

Demo: http://jsfiddle.net/7Lz2Y/

Stosując pełnomocnik():

$("#resultsBox").delegate('li', 'click', function (event) { 
    alert(this.innerHTML); 
    }); 

Demo: http://jsfiddle.net/XwYs5/

Jednakże, istnieje wiele innych sposobów na dołączenie obsługi zdarzeń dla elementów, które istniały przed:

$("#resultsBox").find('li').click(function (event) { 
    alert(this.innerHTML); 
    }); 

Demo: http://jsfiddle.net/74Q7p/

$("#resultsBox ul > li").click(function (event) { 
    alert(this.innerHTML); 
    }); 

Demo: http://jsfiddle.net/a28U5/

+0

Masz rację co do elementów, które muszą istnieć, gdy ten kod jest uruchamiany, ale dwie alternatywne metody, które pokazujesz, mają ten sam problem. – nnnnnn

+0

@nnnnnn - Dobra uwaga, dodałem przykład używając 'on()' i 'delegate()' i zaktualizowałem moją odpowiedź dla wyjaśnienia. – RobB

0

To s mógł pracować.

$("#resultsBox ul li").click(function (event) { 
    console.log('a'); 
}); 
0
$("#resultsBox").click(function (event) { 
    if(event.target.tagName.toLowerCase() == "li"){ 
     console.log('a'); 
    } 
}); 

Będzie działać dla dynamicznie dodawanych elementów li.

+0

Czy to przeglądarka internetowa? – Jashwant

+0

Tak, to jest, podczas wiązania zdarzeń z javascript, event.target nie jest identyfikowany w Internet Explorer. Wyszukuje event.srcElement. To było doskonale obsługiwane w jQuery. – Ankur

Powiązane problemy