URL AJAX isteği için jQuery'de bir dizeyi kodlama


217

Uygulamamda Google'ın Hızlı Arama'yı uyguluyorum. Kullanıcı metin girişinde yazarken HTTP isteklerini kapatmak istiyorum. Sahip olduğum tek sorun, kullanıcı ad ve soyadları arasındaki boşluğa ulaştığında, alanın bir kodlanmadığı +, böylece aramayı kıran olmasıdır. Alanı nasıl a ile değiştirebilirim +veya dizeyi güvenli bir şekilde URL Kodlaması yapabilirim?

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

Kullanabilirsiniz $.param.
15:49

Yanıtlar:


490

EncodeURIComponent öğesini deneyin .

Belirli karakterlerin her bir örneğini karakterin UTF-8 kodlamasını temsil eden bir, iki, üç veya dört kaçış dizisiyle değiştirerek Tekdüzen Kaynak Tanımlayıcısı (URI) bileşenini kodlar (iki "vekilden oluşan karakterler için yalnızca dört kaçış dizisi olacaktır) "karakter).

Misal:

var encoded = encodeURIComponent(str);

2
Bu benim sorunum çözüldü - AJAX isteğime bir parametre olarak bir URL geçirirken, URL içindeki herhangi bir sorgu dizeleri için & sonra her şeyi kaybediyordu. Bunu eklediğimde sorunum çözüldü. Teşekkürler!
theJerm

21

encodeURIComponent benim için iyi çalışıyor. ajax çağrısında böyle url verebiliriz.Aşağıda gösterilen kod:

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

Daha iyi yol:

encodeURIComponent aşağıdakiler dışındaki tüm karakterlerden kaçar:alphabetic, decimal digits, - _ . ! ~ * ' ( )

Sunucuya beklenmedik istekleri önlemek için, kullanıcı tarafından girilen parametrelerde URI'nin bir parçası olarak geçirilecek olan encodeURIComponent öğesini çağırmalısınız. Örneğin, bir kullanıcı değişken yorum için "Kekik ve zaman = tekrar" yazabilir. Bu değişken üzerinde encodeURIComponent kullanılmaması tekrar comment = Thyme% 20 & time = değerini verecektir. Ve işareti ve eşittir işaretinin yeni bir anahtar ve değer çiftini işaretlediğine dikkat edin. Dolayısıyla, "Kekik ve zaman = tekrar" a eşit bir POST yorum tuşuna sahip olmak yerine, biri "Kekik" e ve diğerine (zaman) eşit olan iki POST anahtarınız vardır.

/ X-www-form-urlencoded (POST) uygulaması için, http://www.w3.org/TR/html401/interac...m-content-type uyarınca boşluklar '+' ile değiştirilmelidir. "% 20" ek "+" ile değiştirilen bir encodeURIComponent değiştirme işlemi takip edilebilir.

Birisi RFC 3986'ya (bu!, ', (,) Ve * ayrılmış) uymak konusunda daha sıkı olmak isterse, bu karakterlerin resmi URI sınırlayıcı kullanımları olmamasına rağmen, aşağıdakiler güvenle kullanılabilir:

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 "+".Kişi bunu nasıl yapar?
Vince Kronlein

1
ancak bunun yararlı olması için bir urldecode eşdeğeri olması gerekir
Bay Heelis

5

Ben arka uç olarak MVC3 / EntityFramework kullanıyorum, ön uç doğrudan URL sabit kodlu dışında params geçirdiğinizde doğrudan ($ .post kullanarak) gönderme veri jetonu gerektirmez jquery üzerinden tüm proje denetleyicileri tüketir. Zaten birkaç karakter test ettim ve parametre olarak bir URL (bu http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb=1&pb=1 ) bile gönderdim ve URL içindeki tüm verileri ilettiğinizde encodeURIComponent harika çalışıyor olsa bile sorun yok (sabit kodlanmış)

Sabit kodlanmış URL yani>

 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;

Aksi takdirde encodeURIComponent kullanmayın ve bunun yerine ajax post yönteminde params geçirmeyi deneyin

 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
Bu muhtemelen daha iyi bir çözüm olurdu :)
Brian D

0

bunu dene

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

5
Anders Fjeldstad'ın çözümü çok daha iyi. Boşlukları artı işaretleriyle değiştirmek işe yarayabilir, ancak başka karakterleriniz varsa (umlaut'larla vb.), Sorun yaşarsınız.
Uku Loskit

1
@Uku: OP, boşlukları + ile değiştirmek istedi, bu yüzden ona nasıl yapılacağına cevap verdim. encodeURIComponent ona% 20 verir
genesis

2
Bence @Uku haklı. Bu gerçek soruya cevap verirken (ve kesinlikle işe yarıyor), bence @ Anders'in çözümü daha büyük şemada daha iyi.
Brian D
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.