2009-10-14 38 views
10

Tôi cần phải tuần tự hóa tất cả các yếu tố đầu vào từ một biểu mẫu thành chuỗi JSON.
Với sự giúp đỡ của this post, tôi thành công có thể tạo ra một chuỗi giá trị như sau:jQuery: Cách dừng chuỗi AJAX thoát JSON chuỗi được sử dụng để POST dữ liệu

{"input01":"value01","input02":"value02","input03":"value03"} 

Tuy nhiên, khi tôi cố gắng sử dụng chuỗi để gửi dữ liệu sử dụng chức năng Ajax jQuery, có vẻ như để thêm dấu xồ nguợc vào chuỗi , dẫn đến chuỗi JSON được gửi bằng GET chứ không phải POST. Trang PHP nạp trả về một mảng $_GET của:

[{\"input01\":\"value01\",\"input02\":\"value02\",\"input03\":\"value03\"}] => 

Tôi đã thử nghiệm chuỗi JSON sử dụng alert() để xác nhận cấu trúc là đúng trước khi được sử dụng trong hàm AJAX.
Ngoài ra, nếu tôi chỉ nhập chuỗi JSON hợp lệ theo cách thủ công, AJAX sẽ đăng dữ liệu chính xác.

Mã của tôi là như sau:

var dataJSON = $.toJSON($('#form').serializeObject()); 
alert(dataJSON); 

$.ajax({ 
    type: "POST", 
    url: "ajax.php", 
    data: 'Query01=01&Query02=02', 
    dataType: 'json', 
    success: function(data){ 
     if (data==1){ 
     $('#wrap').load('ajax.php',dataJSON); 
     } 
    } 
}); 
+0

Bạn đang gọi điện thoại '.ajax() ', sau đó làm cho một yêu cầu ajax với' .load() '. Đúng không? –

+0

Roatin, đó là chính xác. Ví dụ trên được đơn giản hóa từ tập lệnh thực tế của tôi. Tập lệnh thực tế đăng dữ liệu bằng cách sử dụng $ .ajax cần được xác thực, nếu được xác thực thành công, hàm $ .load tải HTML được tạo từ dữ liệu được đăng bởi chuỗi JSON. – ticallian

Trả lời

1

Sau khi cọ rửa Google và các trang web jQuery, tôi đã đi đến kết luận cá nhân mà các $.load chức năng sẽ chuyển đổi bất kỳ biến được truyền cho nó như một chuỗi truy vấn (Như bài toán ban đầu của tôi trên phác thảo). Nếu bạn muốn chuyển một chuỗi JSON qua nó, nó phải được nhập theo cách thủ công.

Để giải quyết vấn đề này, tôi đã sử dụng hàm mức thấp $.ajax thay thế. Lợi thế của việc sử dụng phương pháp này có nghĩa là tôi cũng có thể gửi dữ liệu POST bằng cách sử dụng hàm .serialize() tiêu chuẩn thay vì phải chuyển đổi dữ liệu biểu mẫu của tôi thành JSON.

mã cuối cùng của tôi:

var formData = $('#form').serialize(); 

$.ajax({ 
    type: "POST", 
    url: "ajax.php", 
    data: 'Query01=01&Query02=02', 
    dataType: 'json', 
    success: function(data){ 
      if (data==1){ 
       $.ajax({ 
        type: "POST", 
        url: "ajax.php", 
        data: formData, 
        success: function(html){ 
         $("#wrap").replaceWith(html); 
        } 
       }); 
      } 
    } 
}); 

Nếu bất cứ ai khác có một giải pháp, hãy bình luận.

+1

Vì bạn đang sử dụng php làm phía máy chủ. Tôi đoán, bạn có thể đã sử dụng hàm php 'stripslashes()' –

11

Đây là hành vi mặc định của $.ajax(). Bạn có thể thay đổi cài đặt này bằng cách đặt tùy chọn processData thành false. Xem $.ajax() options.

data Object, String 

dữ liệu được gửi đến máy chủ. Đó là được chuyển đổi thành chuỗi truy vấn, nếu không phải là đã là một chuỗi. Nó được nối vào url cho các yêu cầu GET. Xem tùy chọn processData để ngăn việc xử lý tự động này. Đối tượng phải là Khóa/Giá trị cặp. Nếu giá trị là một Mảng, jQuery sẽ nối tiếp nhiều giá trị với cùng một khóa tức là {foo: ["bar1", "bar2"]} trở thành '& foo = bar1 & foo = bar2'.

processData Boolean Default: true 

Theo mặc định, dữ liệu được truyền vào dữ liệu lựa chọn như một đối tượng (về mặt kỹ thuật, bất cứ điều gì khác hơn là một string) sẽ xử lý và chuyển thành một truy vấn chuỗi, phù hợp với mặc định loại nội dung "ứng dụng/x-www-form-urlencoded". Nếu bạn muốn gửi DOMDocuments hoặc dữ liệu không được xử lý khác, hãy đặt tùy chọn này thành sai.

+0

Tôi đã kiểm tra thông tin bạn đã liệt kê ở trên mà không có bất kỳ may mắn nào. Từ những gì tôi có thể thấy các tùy chọn $ .ajax không ảnh hưởng đến hàm .load lồng nhau. Bất kỳ ý tưởng về cách tôi có thể thay đổi các tùy chọn tương tự cho $ .load? – ticallian

+0

@ticallian Tôi không chắc tại sao bạn cần hàm tải bên trong hàm thành công. Bạn có thể không chỉ nhận được mọi thứ bạn cần trong yêu cầu $ .ajax bằng cách sử dụng giá trị json không? – Metropolis

+0

'processData: false' trả về không có gì –

2

Hãy chắc chắn rằng bạn

echo $_GET['varwithurl'] 

không

echo json_encode($_GET['varwithurl']) 

như nhiều ví dụ php web làm.

Tôi gửi dữ liệu có url bằng $.ajax() và không thấy dấu gạch chéo ngược không mong muốn trong tập lệnh php.

-2
<html> 
<head> 
<script src="resources/jquery-2.1.0.js"></script> 
<script src="resources/jquery.serializejson.min.js"></script> 
</head> 
<body> 
    <script> 

     $(document).ready(function(){ 

      $("#simplepost").click(function(e){ 

       var MyForm = $("#appForm").serializeJSON(); 
       console.log(MyForm); 

      $.ajax(
        { 
         url: "rest/emp/create", 
         type: "POST", 
         data: JSON.stringify(MyForm), 
         contentType: "application/json; charset=utf-8", 
         dataType: "json", 
         success:function(maindta){ 
          alert(maindta); 
         }, 
         error: function(jqXHR, testStatus, errorThrown){ 
          alert(errorThrown); 
         } 
        }); 
      e.preventDefault(); //STOP default action 
     }); 
    }); 
</script> 
<h2>Hello World!</h2> 
<form id="appForm" method="POST"> 
    EmployeeID:<input type="text" name='id' value="" /> 
    Employee Name:<input type="text" name="name" value=""/> 
<br> 
<input type="button" value="Submit" id="simplepost" /> 
</form> 
</body> 
</html> 
+2

Đoạn mã mà không có giải thích hiếm khi hữu ích. Hãy xem xét thêm một số bối cảnh cho câu trả lời của bạn. – Chris

0

Tôi đã làm như vậy để nó hoạt động với stripslashes ở phía php.

Something như thế này:

$data = json_decode(stripslashes($_POST['json_data'])); 
Các vấn đề liên quan