2010-08-10 26 views
42

Tôi đã tự hỏi liệu có thể lưu trữ json trả về trong trường nhập ẩn hay không. Ví dụ: đây là những gì json của tôi quay trở lại:giá trị json trả về của cửa hàng trong trường ẩn đầu vào

[{"id":"15aea3fa","firstname":"John","lastname":"Doe"}] 

Tôi muốn lưu trữ id trong trường ẩn để tôi có thể tham khảo sau này để làm điều gì đó với nó.

Ví dụ: Tôi có một cái gì đó như thế này:

<input id="HiddenForId" type="hidden" value="" /> 

và muốn jquery để trả về giá trị sau với tôi như vậy:

var scheduletimeid = $('#HiddenForId').val(); 
+0

cũng xem: http://stackoverflow.com/questions/11118947/jquery-equivalent-for-json-stringify –

Trả lời

18

Bạn có thể lưu trữ nó trong một trường ẩn, hoặc lưu trữ nó trong một đối tượng javascript (sở thích của tôi) như khả năng truy cập sẽ được thông qua javascript.

LƯU Ý: vì bạn có một mảng, điều này sau đó sẽ được truy cập là myvariable[0] cho phần tử đầu tiên (như bạn có).

EDIT chương trình ví dụ:

clip... 
      success: function(msg) 
      { 
       LoadProviders(msg); 
      }, 
... 

var myvariable =""; 

function LoadProviders(jdata) 
{ 
    myvariable = jdata; 
}; 
alert(myvariable[0].id);// shows "15aea3fa" in the alert 

EDIT: Tạo trang này: http://jsfiddle.net/GNyQn/ để chứng minh ở trên. Ví dụ này làm cho giả định rằng bạn đã trả về đúng các giá trị chuỗi có tên trong mảng và chỉ cần lưu trữ nó cho mỗi câu hỏi OP. Trong ví dụ này, tôi cũng đặt các giá trị của mảng đầu tiên được trả về (cho mỗi ví dụ OP) vào một div dưới dạng văn bản.

Tôi không chắc tại sao điều này được xem là "phức tạp" vì tôi thấy không có cách nào đơn giản hơn để xử lý các chuỗi này trong mảng này.

+0

không có nhận xét nào về phiếu giảm giá đối với giải pháp khả thi. Rõ ràng bạn cũng có thể đặt giá trị trong một trường ẩn với một cái gì đó như $ (myfieldselector) .val (myvalue); cũng. Cả hai đều tôi lưu ý. Mảng là lý do tôi chọn đối tượng Javascript. –

+2

Tôi đã bỏ phiếu vì nó quá phức tạp. – Derrick

+0

JS là giao diện người dùng và JSP là máy chủ. Điều gì sẽ xảy ra nếu bạn muốn đặt phía máy chủ json chỉ vì chúng sẽ không bị tấn công trong giao diện người dùng? Vậy làm thế nào u sẽ lưu trữ JSON trong các trường ẩn? – user2696258

-1

chỉ cần thiết lập các lĩnh vực tiềm ẩn với javascript:

document.getElementById('elementId').value = 'whatever'; 

hoặc tôi nhớ điều gì đó?

12

Nếu bạn sử dụng JSON Serializer, bạn chỉ có thể lưu trữ đối tượng của bạn ở định dạng chuỗi như vậy

myHiddenText.value = JSON.stringify(myObject); 

Sau đó bạn có thể nhận được giá trị trở lại với

myObject = JSON.parse(myHiddenText.value); 

Tuy nhiên, nếu bạn không sẽ chuyển giá trị này qua các lần gửi trang, nó có thể dễ dàng hơn cho bạn, và bạn sẽ tiết kiệm cho mình rất nhiều serialization, nếu bạn chỉ giấu nó đi như một biến javascript toàn cục.

18

Bạn có thể sử dụng input.value = JSON.stringify(obj) để chuyển đối tượng thành chuỗi.
Và khi bạn cần nó trở lại, bạn có thể sử dụng obj = JSON.parse(input.value)

Đối tượng JSON có sẵn trên các trình duyệt hiện đại hoặc bạn có thể sử dụng thư viện json2.js từ json.org

0

Dường như giá trị trả về là trong một mảng? Điều đó hơi kỳ lạ ... và cũng lưu ý rằng một số trình duyệt nhất định sẽ cho phép phân tích cú pháp từ yêu cầu tên miền chéo (điều này không đúng khi bạn có đối tượng JSON cấp cao nhất).

Dù sao, nếu đó là một wrapper mảng, bạn sẽ muốn một cái gì đó như thế này:

$('#my-hidden-field').val(theObject[0].id); 

Bạn sau đó có thể lấy nó thông qua một .val đơn giản() gọi trên cùng một trường. Điều này thực sự có vẻ kỳ lạ. Trường ẩn sẽ không tồn tại trên các yêu cầu trang, vậy tại sao bạn không giữ nó trong nhóm giá trị (pseudo-namespaced) của riêng bạn? Ví dụ:

$MyNamespace = $MyNamespace || {}; 
$MyNamespace.myKey = theObject; 

Điều này sẽ cung cấp cho bạn từ mọi nơi mà không cần quản lý trường nhập liệu đột nhập. Nó cũng hiệu quả hơn nhiều so với việc sửa đổi DOM để lưu trữ giá trị đơn giản.

105

Mặc dù tôi đã thấy những phương pháp đề nghị sử dụng và làm việc, tôi nghĩ rằng thiết lập các giá trị của một lĩnh vực tiềm ẩn chỉ bằng cách sử dụng JSON.stringify phá vỡ HTML ...

Ở đây tôi sẽ giải thích những gì tôi có nghĩa là:

<input type="hidden" value="{"name":"John"}"> 

như bạn có thể thấy các dấu nháy kép đầu tiên sau khi khung dây chuyền mở có thể được giải thích bởi một số trình duyệt như:

<input type="hidden" value="{" rubbish > 

vì vậy, cho một cách tiếp cận tốt hơn để tôi này sẽ đề nghị sử dụng hàm encodeURIComponent. Cùng với JSON.stringify chúng tôi shold có một cái gì đó như sau:

> encodeURIComponent(JSON.stringify({"name":"John"})) 
> "%7B%22name%22%3A%22John%22%7D" 

Bây giờ giá trị có thể được lưu trữ an toàn trong một loại ẩn đầu vào như sau:

<input type="hidden" value="%7B%22name%22%3A%22John%22%7D"> 

hoặc (thậm chí tốt hơn) bằng cách sử dụng đĩa dữ liệu thuộc tính của phần tử HTML thao túng bởi những kịch bản đó sẽ tiêu thụ dữ liệu, như vậy:

<div id="something" data-json="%7B%22name%22%3A%22John%22%7D"></div> 

Bây giờ để đọc dữ liệu trở lại chúng ta có thể làm điều gì đó như:

> var data = JSON.parse(decodeURIComponent(div.getAttribute("data-json"))) 
> console.log(data) 
> Object {name: "John"} 
+9

Đây là cách tiếp cận duy nhất để sử dụng nếu bạn cần trả về các đối tượng phức tạp trong biểu mẫu POST. Nó phải là câu trả lời được chấp nhận (vì hầu hết mọi người tìm kiếm và tìm câu hỏi này đều muốn làm chính xác điều đó). –

+0

Giải pháp tốt nhất cho đến nay, điều này cần được chấp nhận trả lời. – digz6666

+1

Wow giải pháp tốt nhất tôi đã có một vấn đề với JSON.stringify trong 2 giờ sau đó tôi thấy câu trả lời thổi tâm trí này. Cảm ơn bạn. –

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