Tengo algún formulario, que carga el archivo en un iframe. Me gustaría mantener su presentación hasta que verifique si es válida con ajax. Cómo puedo hacer esto ? Mi código pausa el envío y devuelve el resultado de validación (actualmente solo una función ficticia que devuelve 'resultado': 'verdadero') pero luego la acción 'enviar' no se realiza. También ¿Es normal que tome ~ 2s para mostrar los datos de respuesta después de obtener el estado de la respuesta 200?Envío de formulario de pausa para la validación
Aquí es mi 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>
y enlace: http://ntt.vipserv.org/artifact/
EDITAR
Con el código de abajo me Soy capaz de realizar la validación, y luego cuando el resultado es una forma positiva se envía. Ahora si codigo el objetivo para el formulario, mi alerta no se muestra y estoy bastante seguro de que la carga no se realiza (desafortunadamente la lista de cargas se actualiza cada 8h sa sabré si funcionó en algún momento). Si no se especifica el destino, el archivo se carga con la redirección de modo que se omite todo el proceso de escucha 'de envío'.
<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>
No puede publicar un archivo con AJAX. – Guffa
@Guffa - sí puede: http://api.jquery.com/jQuery.post/ –
Tengo la siguiente situación. El archivo del formulario se enviará a un servidor remoto en iframe. El resto de los campos se usarán para crear una instancia de objeto localmente. Por lo tanto, el objeto local se creará solo cuando todos los campos estén debidamente llenos. – mastodon