2010-12-14 12 views
12

Ich habe einige HTML-Links mit jQuery generiert und an einige div angehängt, aber es scheint, dass ich Click-Methode jetzt nicht aufrufen kann, wenn diese Elemente angefügt werden (es funktionierte, wenn sie in hardcoded waren) html) $('#something a').click(function() ...jQuery klicken auf angefügte Elemente

Kennt jemand eine Lösung dafür?

Antwort

21

Verwenden .delegate() für diese Fälle:

$('#something').delegate('a', 'click', function() { 

Dies legt eine click Handler auf #something, anstatt Richtung auf die <a> Elemente innerhalb ... so funktioniert es auf später angehängten Anker. Die Alternative (schlimmer für ein paar Gründe) Version ist .live() wie folgt aus:

$('#something a').live('click', function() { 
+0

@ Nick - warum leben schlechter verwendet? Nur neugierig, weil ich es oft benutze. – Josh

+0

@Nick - könntest du bitte die Gründe kommentieren, warum .live() schlimmer ist - ich bin wirklich interessiert. Prost! –

+4

@Josh, @Jakub - Mit '.live()', nehmen wir den obigen Code - der '$ ('# etwas a')' Selektor wird sofort ausgeführt, aber es ist uns egal, was er gefunden hat ... der Ergebnis ist verschwendet. Auch da es an 'document' angehängt ist, * muss jeder' 'Klick' 'mit diesem Selektor verglichen werden. Mit '.delegate()' erhält nur der sehr schnelle '$ (' # irgendwas ') 'Selektor Läufe, und wir verwenden das Ergebnis. Außerdem müssen nur Klicks innerhalb von '# something' überprüft werden, da sie bei diesem Elternteil überprüft werden.' .delegate() 'adressiert 2 Leistungsgründe ... mit einem teureren Selektor sind die Gewinne noch größer. –

0

müssen Sie die Live-Funktion verwenden, um sicherzustellen, dass das Click-Ereignis auf Elemente binded wird, die auf das DOM nach der Seite hinzugefügt wurde

$('#something a').live('click',function() ..... 
+0

funktioniert gut, danke1 – Dejan

4

Was auch funktioniert, ist hinzuzufügen, die [hier klicken] Ereignis beim Anhängen der Elemente, etwa so::

$('<someElement>').click(function(){ 
    $('<someElement>').append('<htmlCodeToAppend>'); 
    $('<appendedElement>').click(function() { /* do something */ }); 
}); 

Dieser Ansatz macht den Job, aber ich bin nicht sicher, ob ich geladen wurde Es gibt irgendwelche Vorbehalte - vielleicht könnte einer der Profis hier hereinkommen.

Cheers, Erik

Verwandte Themen