2010-11-19 9 views
29

Estoy realizando asincrónica HTTP (Ajax) solicitudes a través de jQuery con el básico $ .ajax(). El código es el siguiente:Ampersand (&) carácter dentro de un valor de jQuery AJAX solicitud de datos opción

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + thisId + "&value=" + thisValue, 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 

}); 

todo está funcionando correctamente, como de costumbre, hasta el usuario escribe en el interior área de texto y comercial (&) carácter. Que cuando depuro la función PHP, que guarda el valor, siempre tiene un valor hasta este carácter.

Creo que tiene que haber una solución para omitir el ampersand (&) de alguna manera. ¿Algunas ideas?

Respuesta

81

En lugar de:

data: "id=" + thisId + "&value=" + thisValue 

hacer:

data: { id: thisId, value: thisValue } 

De esta manera jQuery se encargará de codificar correctamente los valores de URL. concatenaciones de cadenas son la raíz de todo el mal :-)

+5

+1 Tal vez no * todo *, pero mucho. :-) –

+0

pero luego podré obtener valores en el archivo PHP usando $ _POST simple []? Lo mismo que pasar valores en una cadena, ¿no? –

+0

@Nikita, yeap, absolutamente de la misma manera. La diferencia es que estarán codificados correctamente. –

6

sólo tiene que utilizar la función de JavaScript encodeURIComponent():

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + thisId + "&value=" + encodeURIComponent(thisValue), 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 

}); 
+0

nunca es demasiado tarde para que alguien lo rechace: D – mkey

26

recomendamos que utilice el solution provided by Darin anterior, si es posible; de esta forma, puedes reutilizar el código bien probado para construir POST datos.

Pero si realmente, realmente, realmente necesita usar la concatenación de cadenas (en este caso, o en otra parte en su aplicación cuando la construcción de cadenas de consulta o POST datos fuera de las entradas del usuario), es necesario utilizar encodeURIComponent:

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + encodeURIComponent(thisId) + "&value=" + encodeURIComponent(thisValue), 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 
}); 

De forma predeterminada al enviar un POST con jQuery.ajax, está enviando datos con el tipo de contenido application/x-www-form-urlencoded, lo que significa que está prometiendo que los datos están codificados de esa manera. Debe asegurarse de mantener su parte del trato y codificarlo realmente. Esto no es solo importante para ampersands.

+0

+1 para explicar _por qué ocurrió el error y cómo solucionarlo tal como está. – sholsinger

+0

De hecho, probé esto y no funcionó. También traté de reemplazar '&' con '&' y eso no hizo nada, sorprendentemente. –

+1

@EduardLuca: * "De hecho, probé esto y no funcionó." * Tendría que dar algunos detalles (probablemente en su propia pregunta); 'encodeURIComponent' ** es ** la forma correcta de hacerlo.* "También traté de reemplazar & con & y eso no hizo nada, sorprendentemente" * En realidad no es sorprendente, ya que esa es la codificación de entidades HTML que no tiene nada que ver con la codificación URI. –

0
$.ajax({ 

    type:'POST', 
dataType: "text", 
    url:'save.php', 
    data:'_id='+$('#id').val()+'&title='+$('#title').val(), 
?? 
data: { id: thisId, value: thisValue } 
+0

¿Es esta una solución que está proporcionando? –

Cuestiones relacionadas