J'ai un formulaire qui télécharge le fichier dans un iframe. J'aimerais tenir sa soumission jusqu'à ce que je vérifie si c'est valide avec ajax. Comment puis-je faire ceci ? Mon code met en pause la soumission et renvoie le résultat de la validation (actuellement juste une fonction fictive qui renvoie 'result': 'true') mais l'action 'submit' n'est pas effectuée. Aussi est-il normal qu'il faut ~ 2s pour afficher les données de réponse après avoir obtenu le statut de réponse 200?Soumettre un formulaire de soumission pour validation
Voici mon html:
<div id="message" style="background:black; width:400px; height:80px; display:none; color:white;">
</div>
<h1>Submit</h1>
<form action="{{upload_url}}" target="upload_target" method="POST" id="file_upload_form" enctype="multipart/form-data">
{% render_upload_data upload_data %}
<table>{{ form }}</table>
<p>
<input type="hidden" maxlength="64" name="myfileid" value="{{ myfileid }}" >
</p>
<p>
<input type="submit" id="file_upload_submit" value="Submit" />
</p>
<iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>
Js:
$(function() {
$('#file_upload_submit').click(function(e){
e.preventDefault();
var fileUploadForm = document.getElementById('file_upload_form');
$.ajax({
type: "POST",
url: '/artifact/upload/check-form/',
data: 'foo=bar',
dataType: "json",
success: function(data){
if(data['result'] == "true"){
$("#message").show();
$("#message").fadeIn(400).html('<span>'+data["message"]+'</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function() {
$("#message").hide();
});
}, 1500);
$('#file_upload_form').attr('target','upload_target').submit(function(){
alert('Handler for .submit() called.');
return false;
});
}
else{
$("#message").show();
$("#message").fadeIn(400).html('<span">'+data["message"]+'</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function() {
$("#message").hide();
});
}, 1500);
return false;
}
}
});
return false;
});
});
</script>
et lien: http://ntt.vipserv.org/artifact/
EDIT
Avec le code ci-dessous I Je suis en mesure d'effectuer la validation, puis lorsque le résultat est positif, le formulaire est soumis. Maintenant, si je code en dur cible pour le formulaire, mon alerte n'est pas affichée et je suis à peu près sûr que le téléchargement n'est pas effectué (malheureusement la liste des uploads est rafraichie tous les 8h je sais si ça marche depuis un moment). Si la cible n'est pas spécifiée, le fichier est téléchargé avec la redirection, de sorte que tout l'écouteur d'événement 'submit' est omis.
<script>
$('#fake_upload_submit').click(function(e){
e.preventDefault();
var fileUploadForm = document.getElementById('file_upload_form');
fileUploadForm.addEventListener("submit", function() {
alert("sent in iframe");
fileUploadForm.target = 'upload_target';
}, false);
$.ajax({
type: "POST",
url: '/artifact/upload/check-form/',
data: 'foo=bar',
dataType: "json",
success: function(data){
if(data['result'] == "true"){
$("#message").show();
$("#message").fadeIn(400).html('<span>'+data["message"]+'</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function() {
$("#message").hide();
});
}, 1500);
fileUploadForm.submit();
}
else{
$("#message").show();
$("#message").fadeIn(400).html('<span">Response false</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function() {
$("#message").hide();
});
}, 1500);
return false;
}
}
});
return false;
});
</script>
html:
<div id="message" style="background:black; width:400px; height:80px; display:none; color:white;">
</div>
<h1>Submit</h1>
<form action="{{upload_url}}" method="POST" target="" id="file_upload_form" enctype="multipart/form-data">
{% render_upload_data upload_data %}
<table>{{ form }}</table>
<p>
<input type="hidden" maxlength="64" name="myfileid" value="{{ myfileid }}" >
</p>
<p>
<input type="submit" style="display:none" id="true_upload_submit" value="Submit" />
</p>
<iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>
<p>
<input type="submit" id="fake_upload_submit" value="Submit" />
</p>
Vous ne pouvez pas publier un fichier en utilisant AJAX. – Guffa
@Guffa - oui vous pouvez: http://api.jquery.com/jQuery.post/ –
J'ai la situation suivante. Le fichier du formulaire sera envoyé à un serveur distant dans iframe. Le reste des champs va être utilisé pour créer une instance d'objet localement. Donc l'objet local ne sera créé que lorsque tous les champs seront correctement remplis. – mastodon