jQuery envoyer des données avec des échappées?

J’ai entendu dire que lorsque j’utilise jQuery.ajax et que l’envoi de données en tant qu’object – automatiquement – échappe aux caractères.

où est-ce écrit? Je ne l’ai pas trouvé dans la documentation

est-ce vrai ?

Dans le code source, une fonction locale add est définie:

 add = function( key, value ) { value = jQuery.isFunction( value ) ? value() : value; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); }; 

Cette fonction prépare les entrées en évitant les caractères spéciaux. Lorsqu’un object est passé en tant qu’argument, la méthode buildParams est appelée, en passant à la fonction add vient d’être définie:

 for ( var prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } 

Dans la fonction récurrente buildParams , la méthode add est appelée pour chaque paramètre d’object. Les saveurs diffèrent, mais sont généralement dans le format suivant:

 add( prefix, obj ); 

Code pertinent, dérivé du code source :

  // Serialize an array of form elements or a set of // key/values into a query ssortingng param: function( a, traditional ) { var s = [], add = function( key, value ) { // If value is a function, invoke it and return its value value = jQuery.isFunction( value ) ? value() : value; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); }; // Set traditional to true for jQuery <= 1.3.2 behavior. if ( traditional === undefined ) { traditional = jQuery.ajaxSettings.traditional; } // If an array was passed in, assume that it is an array of form elements. if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); }); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( var prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ).replace( r20, "+" ); } }); function buildParams( prefix, obj, traditional, add ) { if ( jQuery.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // If array item is non-scalar (array or object), encode its // numeric index to resolve deserialization ambiguity issues. // Note that rack (as of 1.0.0) can't currently deserialize // nested arrays properly, and attempting to do so may cause // a server error. Possible fixes are to modify rack's // deserialization algorithm or to provide an option or flag // to force array serialization to be shallow. buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); } }); } else if ( !traditional && obj != null && typeof obj === "object" ) { // Serialize object item. for ( var name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } 

Ceci est implicitement supposé.

En général, chaque fois que vous avez une fonction qui transmet des données à partir d’un object ou d’un paramètre, vous pouvez supposer que la fonction échappera / paramétrera correctement les données afin de pouvoir transmettre des chaînes arbitraires.

En supposant que vous utilisez des bibliothèques bien écrites (ce que jQuery est), vous ne devriez avoir besoin que d’échapper à des choses lorsque vous construisez explicitement des chaînes.

Par exemple, la fonction text() de jQuery échappera automatiquement votre texte au format HTML.