URL Encode une chaîne dans jQuery pour une requête AJAX


217

J'implémente la recherche instantanée de Google dans mon application. Je voudrais déclencher des requêtes HTTP pendant que l'utilisateur tape dans la saisie de texte. Le seul problème que j'ai, c'est que lorsque l'utilisateur atteint un espace entre le prénom et le nom, l'espace n'est pas codé en tant que a +, interrompant ainsi la recherche. Comment puis-je remplacer l'espace par un +, ou simplement en toute sécurité URL encoder la chaîne?

$("#search").keypress(function(){       
    var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val();
    var options = {};
    $("#results").html(ajax_load).load(query);
});

Vous pouvez utiliser $.param.
jpaugh

Réponses:


490

Essayez encodeURIComponent .

Encode un composant URI (Uniform Resource Identifier) ​​en remplaçant chaque instance de certains caractères par une, deux, trois ou quatre séquences d'échappement représentant le codage UTF-8 du caractère (il n'y aura que quatre séquences d'échappement pour les caractères composés de deux «substituts» " personnages).

Exemple:

var encoded = encodeURIComponent(str);

2
Cela a résolu mon problème - lorsque je transmettais une URL en tant que paramètre à ma demande AJAX, l'URL perdait tout après le & pour toute chaîne de requête. Lorsque j'ai ajouté cela, cela a résolu mon problème. Merci!
leJerm

21

encodeURIComponent fonctionne bien pour moi. nous pouvons donner l'url comme ceci dans un appel ajax.Le code ci-dessous:

  $.ajax({
    cache: false,
    type: "POST",
    url: "http://atandra.mivamerchantdev.com//mm5/json.mvc?Store_Code=ATA&Function=Module&Module_Code=thub_connector&Module_Function=THUB_Request",
    data: "strChannelName=" + $('#txtupdstorename').val() + "&ServiceUrl=" + encodeURIComponent($('#txtupdserviceurl').val()),
    dataType: "HTML",
    success: function (data) {
    },
    error: function (xhr, ajaxOptions, thrownError) {
    }
  });

9

Meilleure façon:

encodeURIComponent échappe à tous les caractères sauf les suivants:alphabetic, decimal digits, - _ . ! ~ * ' ( )

Pour éviter des demandes inattendues au serveur, vous devez appeler encodeURIComponent sur tous les paramètres saisis par l'utilisateur qui seront transmis dans le cadre d'un URI. Par exemple, un utilisateur peut taper "Thym & time = again" pour un commentaire variable. Ne pas utiliser encodeURIComponent sur cette variable donnera à nouveau commentaire = Thym% 20 & time =. Notez que l'esperluette et le signe égal marquent une nouvelle paire clé / valeur. Ainsi, au lieu d'avoir une clé de commentaire POST égale à "Thyme & time = again", vous avez deux clés POST, une égale à "Thyme" et une autre (time) égale à nouveau.

Pour application / x-www-form-urlencoded (POST), par http://www.w3.org/TR/html401/interac...m-content-type , les espaces doivent être remplacés par '+', donc on peut souhaiter suivre un remplacement encodeURIComponent avec un remplacement supplémentaire de "% 20" par "+".

Si l'on souhaite être plus strict en adhérant à la RFC 3986 (qui réserve!, ', (,) Et *), même si ces caractères n'ont pas d'utilisations de délimitation URI formalisées, les éléments suivants peuvent être utilisés en toute sécurité:

function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}

1
For application/x-www-form-urlencoded (POST), per http://www.w3.org/TR/html401/interac...m-content-type, spaces are to be replaced by '+', so one may wish to follow a encodeURIComponent replacement with an additional replacement of "%20" with "+".Comment est-que quelqu'un peut faire ça?
Vince Kronlein

1
mais pour que cela soit utile, il faudrait un équivalent urldecode
M. Heelis

5

J'utilise MVC3 / EntityFramework comme back-end, le front-end consomme tous mes contrôleurs de projet via jquery, la publication directe (à l'aide de $ .post) ne nécessite pas l'inscription des données, lorsque vous transmettez des paramètres directement autres que l'URL codé en dur. J'ai déjà testé plusieurs caractères, j'ai même envoyé une URL (celle-ci http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb=1&pb=1 ) comme paramètre et j'avais aucun problème même si encodeURIComponent fonctionne très bien lorsque vous transmettez toutes les données dans l'URL (codé en dur)

URL codée en dur, c'est-à-dire>

 var encodedName = encodeURIComponent(name);
 var url = "ControllerName/ActionName/" + encodedName + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;; // + name + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;

Sinon, n'utilisez pas encodeURIComponent et essayez plutôt de passer des paramètres dans la méthode ajax post

 var url = "ControllerName/ActionName/";   
 $.post(url,
        { name: nameVal, fkKeyword: keyword, description: descriptionVal, linkUrl: linkUrlVal, includeMetrics: includeMetricsVal, FKTypeTask: typeTask, FKProject: project, FKUserCreated: userCreated, FKUserModified: userModified, FKStatus: status, FKParent: parent },
 function (data) {.......});

3
Cela aurait probablement été une meilleure solution à l'époque :)
Brian D

0

essaye celui-là

var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val().replace(/ /g, '+');

5
La solution d'Anders Fjeldstad est bien meilleure. Remplacer les espaces par des signes plus peut fonctionner, mais si vous avez d'autres caractères (avec des trémas, etc.), vous allez avoir des ennuis.
Uku Loskit

1
@Uku: OP voulait remplacer les espaces par +, je lui ai donc répondu comment le faire. encodeURIComponent lui donne% 20
genesis

2
Je pense que @Uku a raison. Bien que cela réponde à la question littérale (et cela fonctionne certainement), je pense que la solution de @ Anders est meilleure dans le plus grand schéma des choses.
Brian D
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.