2009-07-23 37 views
6

Có ai biết nếu có thể chuyển thông số yêu cầu bị ẩn với yếu tố <select><option> dưới dạng HTML không? Ví dụ: nếu người dùng chọn <option value="foo">foo</option> từ danh sách tùy chọn <select>, tôi có thể chuyển giá trị ẩn vào, cũng như giá trị "foo" và truy xuất giá trị đó dưới dạng tham số yêu cầu không? Ví dụ. <input type="hidden" name="x" value="bar"/> sẽ cho phép tôi nhận các giá trị "foo" và "bar" từ yêu cầu khi người dùng đã chọn tùy chọn foo.Truyền các trường nhập ẩn trong HTML Chọn tùy chọn

Cảm ơn

+1

Làm rõ. Đưa ra một ví dụ về những gì bạn muốn. – EFraim

+0

Hãy làm rõ những gì bạn muốn –

+0

Tôi đã làm rõ câu hỏi của mình. Rất tiếc, các yếu tố mã HTML được định dạng không chính xác đã không được hiển thị trước đây. Cảm ơn –

Trả lời

12

Danh sách chọn có cả giá trị được hiển thị cho người dùng và giá trị được chuyển trở lại máy chủ trong bài đăng biểu mẫu. Vì vậy, bạn có thể sử dụng một số loại delimiter trong giá trị được đưa lên có được cả hai giá trị được gửi trở lại và sau đó phân tích cho họ vào thời điểm đó:

 <select id="myselectlist" > 
      <option value="foo|bar">foo</option> 
      <option value="foo2|bar2">foo2</option> 
     </select> 

Nhưng tốt hơn nhưng sẽ là vượt qua trở lại một giá trị ID mà sau đó bạn có thể sử dụng để biết được mục được lựa chọn từ một cơ sở dữ liệu và cũng có thể sử dụng nó để tìm kiếm các tài liệu liên quan thứ hai:

 <select id="myselectlist" > 
      <option value="123">foo</option> 
      <option value="124">foo2</option> 
     </select> 

cơ sở dữ liệu của bạn có thể trông như thế này:

ID DisplayValue OtherData 
123 foo   bar  
124 foo2   bar2  
+0

Cảm ơn vì điều đó. Tôi đang thực sự sử dụng phương pháp phân tích cú pháp tại thời điểm này nhưng tự hỏi nếu có một cách đẹp hơn một chút bằng cách đăng lại hai giá trị với vùng chọn.Tôi không thể sử dụng giải pháp giá trị ID vì giá trị thứ hai không được lưu trữ trong cơ sở dữ liệu. Bằng cách mã HTML của tôi mà tôi đưa vào câu hỏi của tôi không được hiển thị, có lẽ bởi vì tôi đã không định dạng nó một cách chính xác, vì vậy đó là lý do tại sao nó đọc xấu, xin lỗi! –

+0

thử lưu trữ dữ liệu khác vào id tùy chọn – h3n

+0

Khi bạn tạo trang của mình, bạn biết rằng foo sẽ gửi lại cho bạn foo và thanh. Điều gì khiến bạn không thay đổi cách điều trị? Thay vì "khi xuất, tôi viết foo và bar", chỉ cần làm "nếu foo sau đó cũng thanh" tại điều trị Hoặc tôi đã bỏ lỡ điều gì đó? –

2

Có là hình thức đầu vào type='hidden' mà bạn có thể cập nhật bằng cách sử dụng sự kiện onchange của thả xuống chọn sau đó nó sẽ được đăng tải với biểu mẫu. Tôi nghi ngờ bạn sẽ muốn tạo một mảng các giá trị có thể cho đầu vào bị ẩn theo cùng thứ tự như các giá trị tương đương của chúng trong menu thả xuống và sau đó truy cập giá trị trong mảng theo chỉ mục bằng thuộc tính selectedIndex của phần tử chọn.

+0

Cảm ơn Dave, tôi đã xem xét Javascript nhưng đã quyết định chống lại nó cuối cùng. Tôi muốn sử dụng một giải pháp hoàn toàn HTML. –

3

Dưới đây là một solu thay thế tion giả sử jQuery có sẵn. Nếu bạn sử dụng một thư viện tiện ích js khác với jQuery, hoặc không có thư viện nào cả, điều này vẫn có thể thực hiện được. Nó chỉ liên kết một hàm với sự kiện onchange của lựa chọn và phân tích cú pháp json từ một thuộc tính data-custom.

<form> 
<select name="AnySelect"> 
<option value="primary-value0" data-support='["test",128,2014,"blackberry"]' /> 
<option value="primary-value1" data-support='["test1",39,2013,"apricot"]' /> 
<option value="primary-value2" data-support='["test2",42,2012,"peach"]' /> 
<option value="primary-value3" data-support='[null,null]' /> 
<option value="primary-value4" data-support='[30,28,null]' /> 
</select> 
. 
. 
. 
<span style="visibility: hidden" id="Support_AnySelect-container"><span> 
</form> 

^ Markup ------- Javascript v

//bind onchange once document is loaded and ready 
$.ready(function(){ $('#TheSelector').on('change',UpdateHidden); }); 

function UpdateHidden(event) 
{ 
    //Create a base name for grouping dynamic values; ex: Support_AnySelect 
    Name='Support_'+SelectField.attr('name'); 

    //Check if container was made for us already 
    Contain=$(this.parent).find('#'+Name+'-container'); 

    if(Container.length===0) //make the container if missing 
    { 
    $(this).after('<span id="'+Name+'-container" style="visibility: none;"></span>'); 
    Contain=$(this.parent).children('#'+Name+'-container'); 
    } 

    //get our special multi-values, jQuery will auto decode the JSON 
    SupportValues = this.data('support'); 

    Contain.empty(); //get rid of last select options 
    $.each(SupportValues,function(i,val) 
    { 
    Contain.append('<input type="hidden" name="'+Name+'['+i+'] value="'+val+'"/>'); 
    }); 
} 

lợi ích chính của việc này là nó nên, về mặt lý thuyết, cho phép bạn gửi một 'số lượng biến của các biến 'từ biểu mẫu. Bạn cũng có thể điều chỉnh tập lệnh để tính toán các đối tượng lồng nhau nhất định. Miễn là bạn chuyển JSON hợp lệ đến thuộc tính dữ liệu mà bạn chọn.

Nếu có ai đó cố gắng làm điều này trước khi tôi làm, vui lòng cho tôi biết. Tôi sẽ kiểm tra điều này sau nhưng có thể có một số lỗi nhỏ. Bạn sẽ có thể sử dụng điều này trên bất kỳ phần tử chọn nào và có các đầu vào ẩn tự động điền vào bên trong một phần tử khác; tập lệnh cũng phải đảm bảo chúng nằm trong cùng một thẻ biểu mẫu cho bạn và có tên duy nhất nhưng được nhóm lại qua mảng HTTP.

+0

Tôi nghĩ rằng giải pháp của bạn mạnh hơn và nhẹ hơn nhiều so với việc tạo một bảng mới trong cơ sở dữ liệu để lưu trữ các giá trị. Tuy nhiên, bạn sử dụng rất nhiều phím tắt trong mã của mình (như ''# TheSelector'') không rõ ràng đối với người mới sử dụng. Và bởi vì nó không hoạt động, tôi thậm chí không thể thử nó trong một fiddle để tìm ra những thứ của bản thân mình. Dù sao, đây là những điều nhỏ nhặt, và tôi vẫn nhận được mã của tôi làm việc nhờ vào chỉ dẫn của bạn mà chỉ cho tôi đi đúng hướng. Đã bỏ phiếu! –

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