2012-04-09 12 views
1

Lets sagen, dass ich eine Liste, wo die li dynamisch erstellt werden, über AJAX:

​<ul id="demo-list"> 
    <li data-test="test1" >Test 1</li> 
    <li data-test="test2" >Test 2</li> 
    <li data-test="test3" >Test 3</li> 
</ul>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

Wenn einer der li geklickt wird, möchte ich Holen Sie sich die Daten-Attribut-Test von diesem bestimmten li.

habe ich versucht, so etwas wie:

$('#demo-list').on('click', 'li', function() { 
    console.log($(this).find('li').data('test')); 
}); 

Aber es wird offensichtlich alle Listenelemente und nicht nur die bestimmten, wo das Ereignis stattfindet.

Auch weiß ich, wie dies zu tun mit .live(), aber meine Frage ist, wie es geht über .on()

+1

Ich persönlich glaube, dies mit .live getan werden muss(), da die Objekte nicht statisch verfügbar. – ericosg

+0

@ericosg Benutze 'live()' seit 1.7 nicht mehr als 'on() '- und schon davor war' live() 'langsam. Sie sollten stattdessen 'delegate()' in früheren Versionen verwenden. –

Antwort

6

Sie haben den Fund von nach dem $(this) Aufruf zu entfernen:

$('#demo-list').on('click', 'li', function() { 
console.log($(this).data('test')); 
}) 

Sie können die Arbeitsbeispiel finden Gebrüll:

http://jsfiddle.net/P356B/2/

EDIT :

Wenn Sie ein Widget/Plugin haben, das diesen Inhalt generiert, könnten Sie einfach den Click-Event-Handler im Plugin anhängen. oder haben ein Konstrukt wie:

(function($){ 
    $(function(){ 
    $('#demo-list').on('click', 'li', function() { 
    console.log($(this).data('test')); 
    }) 
    }); 
})(jQuery) 
+0

Nein, das habe ich zuerst versucht. In diesem Zusammenhang bezieht sich $ (this) auf $ ('# demo-list') – Maverick

+0

Sie liegen falsch, siehe das Beispiel auf jsfiddle. –

+0

Es funktioniert dort, aber es funktioniert nicht, wenn die Listenelemente dynamisch generiert werden. – Maverick

1

Ich glaube nicht, Sie find wollen. Just do

console.log($(this).data('test')); 
Verwandte Themen