Hallo,
ich habe ein tricky Problem mit jQuery UI / Dialog und Formularen, die sich selbst ggf. bei fehlerhaften Eingaben selbst wieder in den Dialog laden. Das klappt genau 1x, danach funktionieren die im document.ready des Ajax-Requests stehenden submit-Handler nicht mehr und meine Formulare im Dialog lassen sich nicht mehr abschicken.
Schritt für Schritt:
Ich öffne per Klick einen Dialog, in den per Ajax Inhalt geladen wird:
Code:
function dialogDestroyAll() {
var dialogJ = $('.ui-dialog-content');
dialogJ.dialog('destroy');
}
function loadTraveller(index) {
dialogDestroyAll();
$.getJSON(
"\/reiseantrag-mitreisenden-hinzufuegen",
{ index: index },
function(json) {
var htmlJ = $('<div></div>').appendTo('body');
htmlJ.html(json.html);
htmlJ.dialog(JQUERY_UI_DIALOG_OPTIONS_DEFAULT);
return false;
}
);
return false;
}
Zurückgegeben wird in JSON eingebettetes HTML in diesem Format:
Code:
{errno:0,html:"...."}
Nun wird das HTML also in einen Dialog gepackt.
Dank Zend_Form sieht das View-Template recht knapp aus:
($this->form = Zend_Form Instanz)
Code:
<div>
<?php echo $this->form; ?>
<script type="text/javascript">
// <![CDATA[
//alert('ajax js');
$(document).ready(function() {
//alert('ajax document ready');
//alert('ajax inline');
console.log('Form found: ', $('#' + <?php echo json_encode($this->form->getId()); ?>));
$('#' + <?php echo json_encode($this->form->getId()); ?>).bind('submit', function() {
//alert('submitted');
var formJ = $('#' + <?php echo json_encode($this->form->getId()); ?>);
$.post(
formJ.attr('action'),
formJ.serialize(),
function(json) {
var dialogJ = $('.ui-dialog-content');
dialogJ.dialog('destroy');
if (json.errno == 0) {
sidebarRefresh();
} else {
var htmlJ = $('<div></div>').appendTo('body');
htmlJ.html(json.html);
htmlJ.dialog(JQUERY_UI_DIALOG_OPTIONS_DEFAULT);
}
return true;
},
'json'
);
return false;
});
});
// ]]>
</script>
</div>
Das Abschicken des Formulars im Dialog, klappt jetzt genau 1x, danach wird - bis zum vollständigen Pagereload - kein submit mehr akzeptiert, obwohl ich das Formular abschicke (geprüft mit onsubmit="alert(1)")! D.h. wenn das Formular korrekt ausgefüllt wurde (errno=0, das ist die wichtige Metaangabe), wird es wie erwartet geschlossen. Wobei mir schon unklar ist ob das Schließen korrekt gemacht ist, vermutlich nicht. Wenn das Formular nicht valide war, wird der Inhalt der JSON-Eigenschaft "html" als neuer Dialog angezeigt. Der Inhalt ist wieder exakt der, der oben gezeigt wird, mit dem Unterschied, das Zend_Form einige Fehlermeldungen anzeigt.
Kurze Info: Der submit-Button ist ein <input type="submit" />, es wird <form onsubmit="return false"> verwendet, das wird ja aber von $('#form_id').bind('submit', .. ) überschrieben (bzw. übersprungen). Die Form-ID ist immer vorhanden, immer korrekt!
Zwei konkrete Fragen, die ich trotz alert() Einbauten nicht abschließend klären konnte:
Wann wird ein per Ajax geladenes JavaScript ausgeführt? Sobald ich es ins DOM schieße, also bei htmlJ.html(json.html) - richtig? Dann exakt wird nämlich das oben ersichtliche document.ready() erneut aufgerufen (da das gleiche Formular ja wieder geladen wird, nur mit Fehlermeldungen diesmal), registriert den submit-Handler und DANN wird htmlJ.dialog() aufgerufen, hängt das DOM wieder um und der submit-Handler ist tot?!?!