2016-05-14 1 views
0

In meinem Projekt, ich erzeuge div-Elemente, die Eingabefelder mit den Anfrage Antwortdaten aus meiner Datenbank mit den Suchparametern enthalten. Ich muss in der Lage sein, ein keyup -Ereignis für zusätzliche Arbeit zu verwenden, aber der Klassenselektor funktioniert nicht, wenn die Eingabe mithilfe von append generiert wurde, obwohl die Klasse bei der Überprüfung vorhanden ist.Access keyup Ereignis auf Eingabeelement generiert durch Code

habe ich eine CodePen, die es zeigt: http://codepen.io/leofontes/pen/PNgabB?editors=1111

HTML

<div class="container" id="container"> 
    <button id="button">Click</button><br> 
</div> 

CSS

.container { 
    background-color: #F00; 
    height: 200px; 
    width: 200px; 
} 

.dynamic-input { 
    margin: 5px; 
} 

Javascript/jQuery

$(document).ready(function() { 
    $('#button').click(function() { 
    for(var i = 0; i < 5; i++) { 
     $('#container').append('<input type="text" class="dynamic-input">') 
    } 
    }); 


    $('.dynamic-input').keyup(function() { 
    console.log($(this).val()); 
    }); 
}); 

Die jQuery Code funktioniert gut, ich habe es mit Eingaben innerhalb der $ (Dokument) .ready Funktion getestet und es hat getan, was ich beabsichtigte, ich verstehe nicht, warum es nicht, wenn es später generiert wird.

Ich habe auch versucht, eine versteckte Eingabe mit der Klasse bereits mit dem HTML geladen, aber das funktioniert auch nicht.

Alle Ideen oder Vorschläge geschätzt, danke

+0

Mögliche Duplikat [Event dynamisch erstellten Elemente verbindlich?] (Http://stackoverflow.com/questions/203198/event-binding-on-dynamically-created-elements) – dave

+0

Sie könnten 'anprobieren ('input', function() 'anstelle von' keyup' ... – mk117

Antwort

2

Sie benötigen event delegation für dynamisch generierte Element.

$('#container').on('keyup', '.dynamic-input', function() { 
    console.log($(this).val()); 
}); 
+0

Ich würde betonen, die Verwendung von on() und nicht keyup(), die Ereignisdelegierung für Elemente, die noch nicht auf der Seite sind –

+0

Ich denke ' $ (document) 'ist zu hoch in der DOM-Struktur, wird jede' keyup' im gesamten Dokument abgefangen. Ich würde mich für '$ (" # container ")' (das unmittelbare Elternteil) entscheiden. – leaf

1

try this:

$(document).ready(function() { 
    $('#button').click(function() { 
    for(var i = 0; i < 5; i++) { 
     $('#container').append('<input type="text" class="dynamic-input">') 
    } 
    }); 


    $(document).on('keyup', '.dynamic-input', function() { 
    console.log($(this).val()); 
    }); 
}); 
-1

Das liegt daran, dass Sie die JQuery-Bindung ausgeführt haben, BEVOR das Element erstellt wird. Wenn $('.dynamic-input').keyup ausgeführt wird. Ihre Eingaben, die NACH dem Klicken auf die Schaltfläche erstellt werden, existieren noch nicht.

0

Das Problem besteht darin, dass Sie die Schaltfläche unabhängig vom Erstellen der Bindung erstellen. Was Sie tun sollten, ist die Eingabe und Bindung des Click-Ereignisses als Teil des Callbacks. Im Moment binden Sie das Element korrekt, syntaktisch, aber es existiert noch nicht. Also, was Sie möchten, ist.

$(document).ready(function() { 
    $('#button').click(function() { 
    for(var i = 0; i < 5; i++) { 
     $('#container').append('<input type="text" class="dynamic-input">') 
    } 
    //You're still within the scope of the callback, so this is the appropriate location 
    $('.dynamic-input').on('keyup, function() { 
     console.log($(this).val()); 
    }); 

    });