2010-11-19 20 views
29

Tôi đang thực hiện các yêu cầu HTTP (Ajax) không đồng bộ thông qua jQuery với $ .ajax() cơ bản. Đoạn mã trông giống như sau:Dấu và (&) ký tự bên trong giá trị của tùy chọn dữ liệu yêu cầu jQuery AJAX

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + thisId + "&value=" + thisValue, 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 

}); 

Mọi thứ đều hoạt động bình thường như thường lệ, cho đến khi người dùng gõ bên textarea dấu và (&) nhân vật. Hơn khi tôi gỡ lỗi chức năng PHP, tiết kiệm giá trị, nó luôn có giá trị cho đến khi ký tự này.

Tôi tin rằng phải có giải pháp để bỏ qua dấu và (&) bằng cách nào đó. Bất kỳ ý tưởng?

Trả lời

81

Thay vì:

data: "id=" + thisId + "&value=" + thisValue 

làm:

data: { id: thisId, value: thisValue } 

Bằng cách này jquery sẽ chăm sóc đúng cách URL mã hóa các giá trị. concatenations chuỗi là gốc rễ của mọi điều ác :-)

+5

+1 Có thể không * tất cả *, nhưng rất nhiều. :-) –

+0

nhưng sau đó tôi sẽ có thể nhận được các giá trị trong tệp PHP bằng cách sử dụng đơn giản $ _POST []? Giống như truyền các giá trị trong một chuỗi, đúng không ?! –

+0

@Nikita, yeap, hoàn toàn giống như vậy. Sự khác biệt là chúng sẽ được mã hóa đúng cách. –

6

chỉ cần sử dụng chức năng javascript encodeURIComponent():

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + thisId + "&value=" + encodeURIComponent(thisValue), 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 

}); 
+0

không bao giờ là quá muộn cho một ai đó để downvote bạn: D – mkey

26

mạnh khuyên bạn nên sử dụng solution provided by Darin trên nếu có thể; theo cách đó, bạn có thể sử dụng lại mã được kiểm tra kỹ lưỡng để xây dựng dữ liệu POST.

Nhưng nếu bạn thực sự, thực sự, thực sự cần phải sử dụng dây nối (ở đây, hay ở nơi khác trong ứng dụng khi xây dựng chuỗi truy vấn hoặc POST dữ liệu ra khỏi đầu vào người sử dụng), bạn cần phải sử dụng encodeURIComponent:

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + encodeURIComponent(thisId) + "&value=" + encodeURIComponent(thisValue), 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 
}); 

Theo mặc định khi gửi POST với jQuery.ajax, bạn đang gửi dữ liệu có loại nội dung application/x-www-form-urlencoded, có nghĩa là bạn hứa rằng dữ liệu được mã hóa theo cách đó. Bạn phải chắc chắn để giữ một phần của bạn mặc cả và thực sự mã hóa nó. Điều này không chỉ quan trọng đối với dấu và.

+0

1 cho giải thích _why_ lỗi xảy ra và làm thế nào để sửa chữa nó như là. – sholsinger

+0

Tôi thực sự đã thử điều này và nó không hoạt động. Tôi cũng đã thử thay thế '&' bằng '& 'và điều đó không có gì tốt, đáng ngạc nhiên. –

+1

@EduardLuca: * "Tôi thực sự đã thử điều này và nó không hoạt động." * Bạn sẽ phải đưa ra một số chi tiết cụ thể (có thể trong câu hỏi của riêng bạn), 'encodeURIComponent' ** là ** cách chính xác để làm điều này.* "Tôi cũng đã thử thay thế & bằng & và điều đó không có gì tốt, đáng ngạc nhiên" * Trên thực tế không đáng ngạc nhiên, vì đó là mã hóa thực thể HTML không liên quan gì đến mã hóa URI. –

0
$.ajax({ 

    type:'POST', 
dataType: "text", 
    url:'save.php', 
    data:'_id='+$('#id').val()+'&title='+$('#title').val(), 
?? 
data: { id: thisId, value: thisValue } 
+0

Đây có phải là giải pháp bạn đang cung cấp không? –

Các vấn đề liên quan