Comunidad de diseño web y desarrollo en internet online

Como bloquear el doble envío de peticiones Ajax

Citar            
MensajeEscrito el 11 Ene 2014 04:27 am
Hola,
Estoy intentando subir imágenes al servidor.
Necesito un método que me permita bloquear el envío de una misma petición Ajax cuando aún no hemos recibido la respuesta de una petición anterior.
He intentado implementar la función data() con $('#imagen1')removedata(); para eliminar todos los datos asociados al nodo en cuestión, pero no lo implemento correctamente. Llevó con esto 2 días y estoy por utilizar otro método para subir imágenes.
El código es el siguiente:


$(document).ready(function(){
$(".messages").hide();
//queremos que esta variable sea global
var fileExtension = "";
var fileSize = "";
//función que observa los cambios del campo file y obtiene información
$('#imagen1:file').change(function()
{
//obtenemos un array con los datos del archivo
var file = $("#imagen1")[0].files[0];
//obtenemos el nombre del archivo
var fileName = file.name;
//obtenemos la extensión del archivo
fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1);
//obtenemos el tamaño del archivo
fileSize = file.size;
//obtenemos el tipo de archivo image/png ejemplo
var fileType = file.type;
//mensaje con la información del archivo
showMessage("<span class='info'>Archivo para subir: "+fileName+", peso total: "+
fileSize+" bytes.</span>");
});
//al enviar el formulario
$('#send_foto:button').click(function(){
//información del formulario
var formData = new FormData($(".contact-form-imagen1")[0]);
var message = "";
//hacemos la petición ajax
$.ajax({
url: '../../includes/upload-imagen1.php',
type: 'POST',
// Form data
//datos del formulario
data: formData,
//necesario para subir archivos via ajax
cache: false,
contentType: false,
processData: false,
//mientras enviamos el archivo
beforeSend: function(){
message = $("<span class='before'>Subiendo la imagen, por favor
espere...</span>");
showMessage(message);
},
//una vez finalizado correctamente
success: function(data){
if(isImage(fileExtension))
{
if (fileSize <=500000)
{
message = $("<span class='success'>La imagen ha subido
correctamente.</span>");
showMessage(message);
$(".showImage").html("<img src='../../images/imgpresupuestos/"+data+
"' />");
-1-
C:\xampp\htdocs\presupuestos\js\funcion_cargar_imagen1.js viernes, 10 de enero de 2014 19:47
}else
{
message = $("<span class='success'>La imagen superá el tamaño
máximo de 500000 Bytes.</span>");
showMessage(message);
}
}
else {
message = $("<span class='success'>Tan solo se admiten imágenes de
formato JPG, GIF, PNG.</span>");
showMessage(message);
}
},
//si ha ocurrido un error
error: function(){
message = $("<span class='error'>Ha ocurrido un error.</span>");
showMessage(message);
}
});
});
})
//como la utilizamos demasiadas veces, creamos una función para
//evitar repetición de código
function showMessage(message){
$(".messages").html("").show();
$(".messages").html(message);
}
//comprobamos si el archivo a subir es una imagen
//para visualizarla una vez haya subido
function isImage(extension)
{
switch(extension.toLowerCase())
{
case 'jpg': case 'gif': case 'png': case 'jpeg':
return true;
break;
default:
return false;
break;
}
}

Gracias de antemano.

Manuel.

Por maligix

13 de clabLevel



Genero:Masculino  

Directorio de profesionales

firefox
Citar            
MensajeEscrito el 11 Ene 2014 02:19 pm
Desactiva el botón o link que genera la petición inmediatamente después de ser pulsado.

En el código que has puesto, creo que es:

Código Javascript :

$('#send_foto:button').click(function(){
  $(this).attr('disabled','disabled');
[...]

Y reactivalo cuando la petición termine (por exito o por fallo).

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 12 Ene 2014 03:10 am

maligix escribió:

Hola,
Estoy intentando subir imágenes al servidor.
Necesito un método que me permita bloquear el envío de una misma petición Ajax cuando aún no hemos recibido la respuesta de una petición anterior.
He intentado implementar la función data() con $('#imagen1')removedata(); para eliminar todos los datos asociados al nodo en cuestión, pero no lo implemento correctamente. Llevó con esto 2 días y estoy por utilizar otro método para subir imágenes.
El código es el siguiente:


$(document).ready(function(){
$(".messages").hide();
//queremos que esta variable sea global
var fileExtension = "";
var fileSize = "";
//función que observa los cambios del campo file y obtiene información
$('#imagen1:file').change(function()
{
//obtenemos un array con los datos del archivo
var file = $("#imagen1")[0].files[0];
//obtenemos el nombre del archivo
var fileName = file.name;
//obtenemos la extensión del archivo
fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1);
//obtenemos el tamaño del archivo
fileSize = file.size;
//obtenemos el tipo de archivo image/png ejemplo
var fileType = file.type;
//mensaje con la información del archivo
showMessage("<span class='info'>Archivo para subir: "+fileName+", peso total: "+
fileSize+" bytes.</span>");
});
//al enviar el formulario
$('#send_foto:button').click(function(){
//información del formulario
var formData = new FormData($(".contact-form-imagen1")[0]);
var message = "";
//hacemos la petición ajax
$.ajax({
url: '../../includes/upload-imagen1.php',
type: 'POST',
// Form data
//datos del formulario
data: formData,
//necesario para subir archivos via ajax
cache: false,
contentType: false,
processData: false,
//mientras enviamos el archivo
beforeSend: function(){
message = $("<span class='before'>Subiendo la imagen, por favor
espere...</span>");
showMessage(message);
},
//una vez finalizado correctamente
success: function(data){
if(isImage(fileExtension))
{
if (fileSize <=500000)
{
message = $("<span class='success'>La imagen ha subido
correctamente.</span>");
showMessage(message);
$(".showImage").html("<img src='../../images/imgpresupuestos/"+data+
"' />");
}else
{
message = $("<span class='success'>La imagen superá el tamaño
máximo de 500000 Bytes.</span>");
showMessage(message);
}
}
else {
message = $("<span class='success'>Tan solo se admiten imágenes de
formato JPG, GIF, PNG.</span>");
showMessage(message);
}
},
//si ha ocurrido un error
error: function(){
message = $("<span class='error'>Ha ocurrido un error.</span>");
showMessage(message);
}
});
});
})
//como la utilizamos demasiadas veces, creamos una función para
//evitar repetición de código
function showMessage(message){
$(".messages").html("").show();
$(".messages").html(message);
}
//comprobamos si el archivo a subir es una imagen
//para visualizarla una vez haya subido
function isImage(extension)
{
switch(extension.toLowerCase())
{
case 'jpg': case 'gif': case 'png': case 'jpeg':
return true;
break;
default:
return false;
break;
}
}

Gracias de antemano.

Manuel.

Por maligix

13 de clabLevel



Genero:Masculino  

Directorio de profesionales

msie8
Citar            
MensajeEscrito el 14 Ene 2014 09:04 am

DriverOp escribió:

Desactiva el botón o link que genera la petición inmediatamente después de ser pulsado.

En el código que has puesto, creo que es:

Código Javascript :

$('#send_foto:button').click(function(){
  $(this).attr('disabled','disabled');
[...]

Y reactivalo cuando la petición termine (por exito o por fallo).


Parece que funciona pero ¿como se reactiva?
$(this).attr('enabled','enabled');


Gracias,

Manuel.

Por maligix

13 de clabLevel



Genero:Masculino  

Directorio de profesionales

msie
Citar            
MensajeEscrito el 14 Ene 2014 09:42 am

DriverOp escribió:

Desactiva el botón o link que genera la petición inmediatamente después de ser pulsado.

En el código que has puesto, creo que es:

Código Javascript :

$('#send_foto:button').click(function(){
  $(this).attr('disabled','disabled');
[...]

Y reactivalo cuando la petición termine (por exito o por fallo).


ya está:

$('#send_foto:button').removeAttr("disabled");

Es engorroso esto de subir imágenes si quieres hacerlo ordenada coherentemente y de forma segura.

Gracias,

Manuel.

Por maligix

13 de clabLevel



Genero:Masculino  

Directorio de profesionales

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.