URL Mã hóa một chuỗi trong jQuery cho một yêu cầu AJAX


217

Tôi đang triển khai Tìm kiếm tức thì của Google trong ứng dụng của mình. Tôi muốn loại bỏ các yêu cầu HTTP khi người dùng nhập vào văn bản. Vấn đề duy nhất tôi gặp phải là khi người dùng đến một khoảng trắng ở giữa tên và họ, không gian không được mã hóa thành a +, do đó phá vỡ tìm kiếm. Làm cách nào tôi có thể thay thế khoảng trắng bằng một +hoặc mã URL an toàn Mã hóa chuỗi?

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

Bạn có thể sử dụng $.param.
jpaugh

Câu trả lời:


490

Hãy thử encodeURIComponent .

Mã hóa thành phần Định danh tài nguyên đồng nhất (URI) bằng cách thay thế từng trường hợp của một số ký tự nhất định bằng một, hai, ba hoặc bốn chuỗi thoát đại diện cho mã hóa UTF-8 của ký tự (sẽ chỉ là bốn chuỗi thoát cho các ký tự được tạo thành từ hai "thay thế " nhân vật).

Thí dụ:

var encoded = encodeURIComponent(str);

2
Điều này đã giải quyết vấn đề của tôi - khi tôi chuyển URL dưới dạng tham số cho yêu cầu AJAX của mình, URL đã mất mọi thứ sau & cho bất kỳ chuỗi truy vấn nào trong đó. Khi tôi thêm điều này, điều đó đã giải quyết vấn đề của tôi. Cảm ơn!
theJerm

21

encodeURIComponent hoạt động tốt cho tôi. chúng ta có thể cung cấp url như thế này trong cuộc gọi ajax. Mã được hiển thị bên dưới:

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

Cách tốt hơn:

encodeURIComponent thoát tất cả các ký tự ngoại trừ các ký tự sau:alphabetic, decimal digits, - _ . ! ~ * ' ( )

Để tránh các yêu cầu không mong muốn đến máy chủ, bạn nên gọi encodeURIComponent trên bất kỳ tham số nào do người dùng nhập sẽ được chuyển qua như một phần của URI. Ví dụ: người dùng có thể nhập "Thyme & time = again" cho một nhận xét thay đổi. Không sử dụng encodeURIComponent trên biến này sẽ cho nhận xét = Thyme% 20 & time = lần nữa. Lưu ý rằng ký hiệu và dấu bằng đánh dấu một cặp khóa và giá trị mới. Vì vậy, thay vì có khóa nhận xét POST bằng "Thyme & time = again", bạn có hai khóa POST, một bằng với "Thyme" và một (thời gian) khác bằng lần nữa.

Đối với ứng dụng / x-www-form-urlencoding (POST), mỗi http://www.w3.org/TR/html401/interac...m-content-type , các khoảng trắng sẽ được thay thế bằng '+', vì vậy người ta có thể muốn theo dõi thay thế mã hóa bằng thay thế bổ sung "% 20" bằng "+".

Nếu một người muốn nghiêm ngặt hơn trong việc tuân thủ RFC 3986 (dự trữ !, ', (,) Và *), mặc dù các ký tự này không sử dụng phân định URI chính thức, có thể sử dụng một cách an toàn:

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 "+".Làm thế nào để làm điều này?
Vince Kronlein

1
nhưng để điều này trở nên hữu ích, cần phải có một mã vạch tương đương
Mr Heelis

5

Tôi đang sử dụng MVC3 / EntityFramework làm back-end, front-end tiêu thụ tất cả các bộ điều khiển dự án của tôi thông qua jquery, đăng trực tiếp (sử dụng $ .post) không yêu cầu mã hóa dữ liệu, khi bạn chuyển trực tiếp các thông số khác ngoài URL được mã hóa. Tôi đã kiểm tra một số ký tự tôi thậm chí đã gửi một URL (cái này http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb=1&pb=1 ) làm tham số và đã hoàn toàn không có vấn đề gì mặc dù encodeURIComponent hoạt động rất tốt khi bạn truyền tất cả dữ liệu vào trong URL (được mã hóa cứng)

URL được mã hóa tức là>

 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;

Mặt khác, không sử dụng encodeURIComponent và thay vào đó hãy thử truyền tham số trong phương thức bài ajax

 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
Đó có lẽ là một giải pháp tốt hơn vào thời điểm đó :)
Brian D

0

thử cái này

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

5
Giải pháp của Anders Fjeldstad là tốt hơn nhiều. Thay thế khoảng trắng bằng dấu cộng có thể hoạt động, nhưng nếu bạn có các ký tự khác (bằng ô, v.v.), bạn sẽ gặp nhiều rắc rối.
Uku Loskit

1
@Uku: OP muốn thay thế khoảng trắng bằng + vì vậy tôi đã cho anh ấy trả lời cách thực hiện. encodeURIComponent mang lại cho anh ta% 20
genesis

2
Tôi nghĩ @Uku đã đúng. Mặc dù điều này không trả lời cho câu hỏi theo nghĩa đen (và nó chắc chắn hoạt động), tôi nghĩ giải pháp của @ Anders tốt hơn trong sơ đồ lớn hơn.
Brian D
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.