URL Codifica una stringa in jQuery per una richiesta AJAX


217

Sto implementando la ricerca istantanea di Google nella mia applicazione. Vorrei disattivare le richieste HTTP mentre l'utente digita l'inserimento di testo. L'unico problema che sto riscontrando è che quando l'utente arriva a uno spazio tra nome e cognome, lo spazio non viene codificato come a +, interrompendo così la ricerca. Come posso sostituire lo spazio con un +, o semplicemente URL sicuro Codificare la stringa?

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

È possibile utilizzare $.param.
jpaugh,

Risposte:


490

Prova a codificareURIComponent .

Codifica un componente URI (Uniform Resource Identifier) ​​sostituendo ciascuna istanza di determinati caratteri con una, due, tre o quattro sequenze di escape che rappresentano la codifica UTF-8 del personaggio (saranno solo quattro sequenze di escape per i caratteri composti da due "surrogato " personaggi).

Esempio:

var encoded = encodeURIComponent(str);

2
Ciò ha risolto il mio problema: quando passavo un URL come parametro alla mia richiesta AJAX, l'URL stava perdendo tutto dopo il & per qualsiasi stringa di query in esso. Quando l'ho aggiunto, questo ha risolto il mio problema. Grazie!
theJerm

21

encodeURIComponent funziona bene per me. possiamo dare l'URL in questo modo in una chiamata Ajax. Il codice mostrato di seguito:

  $.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

Modo migliore:

encodeURIComponent sfugge a tutti i caratteri tranne i seguenti:alphabetic, decimal digits, - _ . ! ~ * ' ( )

Per evitare richieste impreviste al server, è necessario chiamare encodeURIComponent su tutti i parametri immessi dall'utente che verranno passati come parte di un URI. Ad esempio, un utente può digitare "Timo e tempo = di nuovo" per un commento variabile. Non usare encodeURIComponent su questa variabile restituirà comment = Thyme% 20 & time = again. Si noti che la e commerciale e il segno di uguale contrassegnano una nuova coppia chiave e valore. Quindi, invece di avere una chiave di commento POST uguale a "Timo e tempo = di nuovo", hai due chiavi POST, una uguale a "Timo" e un'altra (tempo) uguale di nuovo.

Per application / x-www-form-urlencoded (POST), per http://www.w3.org/TR/html401/interac...m-content-type , gli spazi devono essere sostituiti da '+', quindi si potrebbe desiderare di seguire una sostituzione del componente encodeURIC con una sostituzione aggiuntiva di "% 20" con "+".

Se si desidera essere più rigorosi nell'aderire a RFC 3986 (che riserva!, ', (,) E *), anche se questi caratteri non hanno usi di delimitazione URI formalizzati, è possibile utilizzare in sicurezza:

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 "+".Come si fa a fare questo?
Vince Kronlein,

1
ma affinché ciò sia utile ci dovrebbe essere un equivalente del codice urld
Heelis,

5

Sto usando MVC3 / EntityFramework come back-end, il front-end consuma tutti i miei controller di progetto tramite jquery, la pubblicazione diretta (usando $ .post) non richiede la codifica dei dati, quando si passano parametri direttamente diversi dall'URL codificato. Ho già testato diversi caratteri, ho persino inviato un URL (questo http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb=1&pb=1 ) come parametro e avevo nessun problema, anche se encodeURIComponent funziona benissimo quando si passano tutti i dati all'interno dell'URL (hardcoded)

URL hardcoded ovvero>

 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;

Altrimenti non usare encodeURIComponent e prova invece a passare i parametri all'interno del metodo 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
Probabilmente sarebbe stata una soluzione migliore in quel momento :)
Brian D,

0

prova questo

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

5
La soluzione di Anders Fjeldstad è decisamente migliore. La sostituzione di spazi con segni più può funzionare, ma se hai altri personaggi (con dieresi ecc.), Ti troverai in un mucchio di guai.
Uku Loskit,

1
@Uku: OP ha voluto sostituire gli spazi bianchi con +, quindi gli ho dato la risposta su come farlo. encodeURIComponent gli dà% 20
genesi

2
Penso che @Uku abbia ragione. Mentre questo risponde alla domanda letterale (e sicuramente funziona), penso che la soluzione di @ Anders sia migliore nello schema più grande delle cose.
Brian D,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.