jQuery 'on' registriert sich nicht im dynamisch generierten modalen Popup
Ich hatte den Eindruck, dass jQuery'son
event handler sollte in der lage sein, auf dynamisch erzeugte elemente zu 'lauschen' UND das verhalten von zu ersetzenlive
. Was ich jedoch erlebt habe, ist das Verwendenon
erfasst das Klickereignis während der Verwendung von nichtlive
ist erfolgreich!
Der knifflige Aspekt meiner Situation ist, dass ich nicht nur dynamisch Inhalte erstelle, sondern dies auch über AJAX mache.get()
aufrufen und das resultierende HTML in ein Modal einfügen.dialog()
jQueryUI-Popup.
Hier ist eine vereinfachte Version dessen, was ich erreichen wollte$(document).ready(...)
):
$.get("getUserDataAjax.php", queryString, function(formToDisplay) {
$("#dialog").dialog({
autoOpen: true,
modal: true,
buttons...
}).html(formToDisplay);
});
$(".classThatExistsInFormToDisplay").on("click", function() {
alert("This doesn't get called");
});
Aus der Dokumentation füron
Ich fand dies, und so näherte ich mich dem Schreiben meineron
Veranstaltung:
$("p").on("click", function(){
alert( $(this).text() );
});
Aus irgendeinem Grundlive
wird funktionieren wie ich es erwarte - wohingegenon
versagt mir.
Dies ist keine Frage für "Wie kann ich es zum Laufen bringen?" weil ich das gefunden habeon
wird erfolgreich sein (Capture-Klicks), wenn ich es deklariereInnerhalb dasfunction(formToDisplay)
Ruf zurück.
Meine Frage ist: was ist falsch miton
dass meine dynamisch erstellten Elemente nicht in einem modalen Popup gefunden werden? Meine jQuery-Instanz ist jquery-1.7.2. jQueryUI ist 1.8.21.
Hier sind zwei jsFiddles, die sich dem Problem annähern. Klicken Sie in beiden Fällen auf das Wort "Test", um das unterschiedliche Verhalten anzuzeigen. Der einzige Unterschied im Code ist das Ersetzenon
zumlive
.
Woherdas Klicken wird erfasst vonlive
.
Woherdas Klicken wird NICHT von erfasston
(Klicken Sie auf "Test - Klicken Sie auf mich", um zu sehen, dass nichts passiert.)
Mir ist klar, dass ich vielleicht nur benutzeon
unangemessen oder darum gebeten, etwas zu tun, das nicht beabsichtigt war, aber ich möchte es wissenWarum Es funktioniert nicht (aber wenn Sie etwas schrecklich Kluges haben, können Sie es gerne teilen). Danke für deine Weisheit!
Update / Antwort / Lösung:
Laut Benutzer 'undefined' besteht der Unterschied darin, dasson
wird nicht vollständig vom oberen Rand des Fensters delegiertdocument
Objekt währendlive
tut / ist.
Wie Claudio erwähnt, gibt es Teile deron
Dokumentation, die auf dynamisch erstellte Elemente verweistund das was du in die$("")
Teil der Abfragemuss zur Laufzeit existieren.
Hier ist meine neue Lösung: Erfassen von Klickereignissenon
Mein modaler Dialog, der bei der Erstellung des Ereignisses zur Laufzeit zwar keinen Inhalt hat, jedoch meinen Inhalt und mein Element mit einer speziellen Klasse finden kann, die später generiert wird.
$("#dialog").on("click", ".classThatExistsInFormToDisplay", function() {
... //(success! Event captured)
});
Vielen Dank!