URL Zakoduj ciąg znaków w jQuery dla żądania AJAX

Wdrażam Błyskawiczne wyszukiwanie Google w mojej aplikacji. Chciałbym odpalić żądania HTTP, gdy użytkownik wpisuje tekst. Jedynym problemem, który mam jest to, że gdy użytkownik dostaje się do spacji pomiędzy imieniem i nazwiskiem, spacja nie jest zakodowana jako +, co przerywa wyszukiwanie. Jak mogę zastąpić spację +, lub po prostu bezpiecznie zakodować ciąg znaków?

$("#search").keypress(function(){       
    var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val();
    var options = {};
    $("#results").html(ajax_load).load(query);
});
Author: Rusty, 2011-07-01

5 answers

Spróbuj encodeURIComponent .

Koduje komponent Uniform Resource Identifier (URI), zastępując każdą instancję pewnych znaków jednym, dwoma, trzema lub czterema sekwencjami escape reprezentującymi kodowanie UTF-8 znaku (będą to tylko cztery sekwencje escape dla znaków złożonych z dwóch "zastępczych" znaków).

Przykład:

var encoded = encodeURIComponent(str);
 504
Author: Anders Fjeldstad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-26 15:02:14

EncodeURIComponent działa dobrze dla mnie. możemy podać adres url w ten sposób w wywołaniu ajax.Kod pokazany poniżej:

  $.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) {
    }
  });
 21
Author: Praveen04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 20:19:45

Lepszy sposób:

EncodeURIComponent usuwa wszystkie znaki z wyjątkiem następujących: alphabetic, decimal digits, - _ . ! ~ * ' ( )

Aby uniknąć nieoczekiwanych żądań do serwera, należy wywołać encodeURIComponent na dowolnych parametrach wprowadzonych przez Użytkownika, które zostaną przekazane jako część URI. Na przykład, użytkownik może wpisać "Thyme & time = again" dla komentarza zmiennej. Nieużywanie encodeURIComponent na tej zmiennej da comment=Thyme%20 & time=again. Zauważ, że Znak ampersand i znak równości oznaczają nowy klucz i wartość para. Tak więc zamiast mieć klawisz post comment równy "Thyme & time=again" , masz dwa klawisze POST, jeden równy "Thyme", a drugi (time) równy again.

For application / x-www-form-urlencoded (POST), per http://www.w3.org/TR/html401/interac...m-content-type , spacje należy zastąpić przez"+", więc można chcieć zastąpić enkodeuricomponent dodatkowym zastąpieniem " %20 "przez"+".

Jeśli ktoś chce być bardziej rygorystyczny w przestrzeganiu RFC 3986 (co rezerwuje !, ', (,) i *), mimo że znaki te nie mają sformalizowanego delimitowania URI, można bezpiecznie użyć następujących znaków:

function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}
 9
Author: StackOverFlow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-08 05:05:02

Używam MVC3 / EntityFramework jako back-end, front-end zużywa wszystkie kontrolery mojego projektu poprzez jquery, publikując bezpośrednio (używając $.post) nie wymaga zapisu danych, gdy przekazujesz params bezpośrednio inny niż adres URL zakodowany na twardo. Przetestowałem już kilka znaków, nawet wysłałem URL (ten http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb=1&pb=1) jako parametr i nie miał żadnego problemu, mimo że encodeURIComponent działa świetnie, gdy przekazujesz wszystkie dane w within the URL (hardcoded)

Hardcoded URL czyli>

 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;

W Przeciwnym Razie nie używaj encodeURIComponent i zamiast tego spróbuj przekazać params w metodzie 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) {.......});
 5
Author: d1jhoni1b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 21:14:27

Spróbuj tego

var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val().replace(/ /g, '+');
 0
Author: genesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-01 06:51:36