Làm cách nào để đảm bảo trường biểu mẫu <select> được gửi khi nó bị vô hiệu hóa?


180

Tôi có một selecttrường biểu mẫu mà tôi muốn đánh dấu là "chỉ đọc", vì trong người dùng không thể sửa đổi giá trị, nhưng giá trị vẫn được gửi cùng với biểu mẫu. Sử dụng disabledthuộc tính ngăn người dùng thay đổi giá trị, nhưng không gửi giá trị với biểu mẫu.

Các readonlythuộc tính chỉ có sẵn cho inputtextarealĩnh vực, nhưng đó là cơ bản những gì tôi muốn. Có cách nào để làm việc đó không?

Hai khả năng tôi đang xem xét bao gồm:

  • Thay vì vô hiệu hóa select, hãy vô hiệu hóa tất cả các options và sử dụng CSS để chọn màu xám để nó trông giống như bị vô hiệu hóa.
  • Thêm một trình xử lý sự kiện nhấp vào nút gửi để nó cho phép tất cả các menu thả xuống bị vô hiệu hóa trước khi gửi biểu mẫu.

2
xin lỗi vì tham gia muộn, tuy nhiên các giải pháp được cung cấp bởi @ trafalmadorianworkest là tốt nhất. Nó vô hiệu hóa tất cả các đầu vào không được chọn. Nó cũng sẽ hoạt động nếu nó chọn có nhiều tùy chọn được kích hoạt. $('#toSelect')find(':not(:selected)').prop('disabled',true);
Abhishek Madhani

Ngoài ra, bạn có thể để điều khiển bị vô hiệu hóa trên UI nhưng truy xuất giá trị trong phương thức hành động: công khai ActionResult insertRecord (mô hình MyType) {if (model.MyProperty == null) {model.MyProperty = Request ["MyProperty"]; }}
Beastieboy

Câu trả lời:


118
<select disabled="disabled">
    ....
</select>
<input type="hidden" name="select_name" value="selected value" />

Trong trường hợp select_namelà tên mà bạn thường sẽ cung cấp cho các <select>.

Một lựa chọn khác.

<select name="myselect" disabled="disabled">
    <option value="myselectedvalue" selected="selected">My Value</option>
    ....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />

Bây giờ với cái này, tôi đã nhận thấy rằng tùy thuộc vào máy chủ web nào bạn đang sử dụng, bạn có thể phải đặt hiddenđầu vào trước hoặc sau <select>.

Nếu bộ nhớ của tôi phục vụ cho tôi một cách chính xác, với IIS, bạn đặt nó trước, với Apache bạn đặt nó sau. Như mọi khi, kiểm tra là chìa khóa.


3
Làm thế nào điều này sẽ phụ thuộc vào máy chủ web ? Không phải máy khách sẽ hiển thị trang với trường đã chọn và do đó, trong trường hợp có xung đột như vậy, nó sẽ là máy khách quyết định có gửi giá trị đến máy chủ hay không?
Ilari Kajaste

8
Nó phụ thuộc vào cách máy chủ xử lý nhiều đầu vào có cùng tên.
Jordan S. Jones

1
Tốt hơn hết là bạn không nên dựa vào một loại máy chủ cụ thể, vì vậy tôi nghĩ rằng cách tiếp cận đầu tiên sạch hơn và ít bị lỗi hơn ..
Luke

5
@Jordan: Trình duyệt không gửi các giá trị trường bị vô hiệu hóa đến máy chủ, đó là lý do tại sao chúng trống khi bạn cố xử lý phía máy chủ. Nếu bạn có một trường ẩn với giá trị mong muốn và (các) trường hiển thị bị tắt, chỉ có trường ẩn sẽ được gửi đến máy chủ. Ergo, trường ẩn chỉ nên được tạo (thông qua mã JS hoặc mã phía máy chủ) khi các trường hiển thị bị vô hiệu hóa và không có vấn đề ưu tiên.
Matt van Andel

1
Đây chỉ là tùy chọn nếu bạn cần một biểu mẫu hoạt động mà không cần javascript.
Andrew

224

Vô hiệu hóa các trường và sau đó kích hoạt chúng trước khi biểu mẫu được gửi:

Mã jQuery:

jQuery(function ($) {        
  $('form').bind('submit', function () {
    $(this).find(':input').prop('disabled', false);
  });
});

15
Một giải pháp khá hay!
Chris

2
Đây là người tôi đã giải quyết, chủ yếu là vì nó ít gây khó chịu nhất.
Jonathan

3
Các tài liệu jQuery khuyên bạn nên sử dụng .prop và .removeProp cho 'đã chọn', 'đã chọn' và 'bị vô hiệu hóa' thay vì .attr và .removeAttr xem http://api.jquery.com/prop/
Jim Bergman

2
Một chút liên quan của nhận xét của @ JimBergman - "Các thuộc tính thường ảnh hưởng đến trạng thái động của phần tử DOM mà không thay đổi thuộc tính HTML được tuần tự hóa. Ví dụ bao gồm thuộc tính giá trị của các thành phần đầu vào, thuộc tính bị vô hiệu của đầu vào và nút hoặc thuộc tính được kiểm tra của hộp kiểm. Phương thức .prop () nên được sử dụng để đặt bị vô hiệu hóa và được kiểm tra thay vì phương thức .attr (). Phương thức .val () nên được sử dụng để nhận và đặt giá trị. " - từ api.jquery.com/prop
Vũ điệu Joshua

2
Bạn là một thiên tài (Y)
TommyDo

13

Tôi đã tìm kiếm một giải pháp cho việc này, và vì tôi không tìm thấy giải pháp nào trong chủ đề này nên tôi đã tự làm.

// With jQuery
$('#selectbox').focus(function(e) {
    $(this).blur();
});

Đơn giản, bạn chỉ làm mờ trường khi bạn tập trung vào nó, một cái gì đó như vô hiệu hóa nó, nhưng bạn thực sự gửi dữ liệu của nó.


Wow Giải pháp tuyệt vời và dễ dàng. Cảm ơn .. +1 từ tôi :)
Naeem Ul Wahhab

Tôi thích điều này rất nhiều .. tùy thuộc vào các tương tác trong biểu mẫu của tôi, các yếu tố được bật / tắt trở lại ... làm cách nào để bật lại trường 'mờ' trong kịch bản này?
bkwdesign

Từ googling, trông giống như $ ('# selectbox'). Off ('tập trung'); sẽ thực hiện thủ thuật kích hoạt lại
bkwdesign

2
hoạt động cho các hộp văn bản, không hoạt động đối với các hộp được chọn, cộng với siêu dễ dàng để di chuyển bằng cách nhấp và giữ nút
Andrew

7

Tôi đã phải đối mặt với một kịch bản hơi khác, ở chỗ tôi chỉ muốn không cho phép người dùng thay đổi giá trị được chọn dựa trên một hộp chọn trước đó. Điều cuối cùng tôi làm chỉ là vô hiệu hóa tất cả các tùy chọn không được chọn khác trong hộp chọn bằng cách sử dụng

$('#toSelect')find(':not(:selected)').attr('disabled','disabled');

Cảm ơn, tôi thấy bạn đơn giản nhất về mặt logic. Tuy nhiên attrnên thay đổi với prop, sẽ trông giống như$('#toSelect')find(':not(:selected)').prop('disabled',true);
Abhishek Madhani

6

Giải pháp tương tự được đề xuất bởi Tres mà không cần sử dụng jQuery

<form onsubmit="document.getElementById('mysel').disabled = false;" action="..." method="GET">

   <select id="mysel" disabled="disabled">....</select>

   <input name="submit" id="submit" type="submit" value="SEND FORM">
</form>

Điều này có thể giúp ai đó hiểu nhiều hơn, nhưng rõ ràng là kém linh hoạt hơn so với jQuery.


Nhưng, nó không tốt cho nhiều bộ chọn. Chúng ta có thể sử dụng getElementsByTagName('select')?
May mắn

6

nó không hoạt động với: bộ chọn đầu vào cho các trường được chọn, sử dụng cái này:

    jQuery(function() {

    jQuery('form').bind('submit', function() {
        jQuery(this).find(':disabled').removeAttr('disabled');
    });

    });

5

Tôi sử dụng mã tiếp theo để vô hiệu hóa các tùy chọn trong các lựa chọn

<select class="sel big" id="form_code" name="code" readonly="readonly">
   <option value="user_played_game" selected="true">1 Game</option>
   <option value="coins" disabled="">2 Object</option>
   <option value="event" disabled="">3 Object</option>
   <option value="level" disabled="">4 Object</option>
   <option value="game" disabled="">5 Object</option>
</select>

// Disable selection for options
$('select option:not(:selected)').each(function(){
 $(this).attr('disabled', 'disabled');
});

4

Cách dễ nhất tôi tìm thấy là tạo một hàm javascript nhỏ gắn với biểu mẫu của bạn:

function enablePath() {
    document.getElementById('select_name').disabled= "";
}

và bạn gọi nó trong mẫu của bạn ở đây:

<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">

Hoặc bạn có thể gọi nó trong chức năng bạn sử dụng để kiểm tra biểu mẫu của bạn :)


4

Chỉ cần thêm một dòng trước khi gửi.

$ ("# XYZ"). RemoveAttr ("bị vô hiệu hóa");


2

Hoặc sử dụng một số JavaScript để thay đổi tên của lựa chọn và đặt thành vô hiệu hóa. Bằng cách này, lựa chọn vẫn được gửi, nhưng sử dụng tên bạn không kiểm tra.


2

Tôi đã tạo ra một plugin nhanh chóng (chỉ dành cho Jquery), giúp lưu giá trị trong trường dữ liệu trong khi đầu vào bị vô hiệu hóa. Điều này chỉ có nghĩa là miễn là trường bị vô hiệu hóa theo chương trình thông qua jquery bằng cách sử dụng .prop () hoặc .attr () ... sau đó truy cập giá trị bằng .val (), .serialize () hoặc .serializeArra () sẽ luôn trả về giá trị ngay cả khi bị vô hiệu hóa :)

Ổ cắm không biết xấu hổ: https://github.com/Jezternz/jq-disables-inputs


2

Dựa trên giải pháp của Jordan, tôi đã tạo một hàm tự động tạo một đầu vào ẩn có cùng tên và cùng giá trị của lựa chọn bạn muốn trở thành không hợp lệ. Tham số đầu tiên có thể là id hoặc phần tử jquery; thứ hai là một tham số tùy chọn Boolean trong đó vô hiệu hóa "true" và "false" cho phép đầu vào. Nếu bị bỏ qua, tham số thứ hai sẽ chuyển chọn giữa "bật" và "tắt".

function changeSelectUserManipulation(obj, disable){
    var $obj = ( typeof obj === 'string' )? $('#'+obj) : obj;
    disable = disable? !!disable : !$obj.is(':disabled');

    if(disable){
        $obj.prop('disabled', true)
            .after("<input type='hidden' id='select_user_manipulation_hidden_"+$obj.attr('id')+"' name='"+$obj.attr('name')+"' value='"+$obj.val()+"'>");
    }else{
        $obj.prop('disabled', false)
            .next("#select_user_manipulation_hidden_"+$obj.attr('id')).remove();
    }
}

changeSelectUserManipulation("select_id");

tham số 'obj' phải là một đối tượng jquery
Doglas

1

Tôi tìm thấy một giải pháp khả thi: loại bỏ tất cả các yếu tố ngoại trừ một yếu tố được chọn. Sau đó, bạn có thể thay đổi phong cách thành một cái gì đó trông cũng bị vô hiệu hóa. Sử dụng jQuery:

jQuery(function($) {
    $('form').submit(function(){
        $('select option:not(:selected)', this).remove();
    });
});

0
<select id="example">
    <option value="">please select</option>
    <option value="0" >one</option>
    <option value="1">two</option>
</select>



if (condition){
    //you can't select
    $("#example").find("option").css("display","none");
}else{
   //you can select
   $("#example").find("option").css("display","block");
}

-8

Một tùy chọn khác là sử dụng thuộc tính readonly.

<select readonly="readonly">
    ....
</select>

Với chỉ đọc giá trị vẫn được gửi, trường đầu vào có màu xám và người dùng không thể chỉnh sửa nó.

Biên tập:

Trích dẫn từ http://www.w3.org/TR/html401/interact/forms.html#adef-readonly :

  • Các yếu tố chỉ đọc nhận được trọng tâm nhưng người dùng không thể sửa đổi.
  • Các yếu tố chỉ đọc được bao gồm trong điều hướng tab.
  • Yếu tố chỉ đọc có thể thành công.

Khi nó nói phần tử có thể thành công, có nghĩa là nó có thể được gửi, như đã nêu ở đây: http://www.w3.org/TR/html401/interact/forms.html#successful-controls


6
Kiểm soát KHÔNG được tô xám và người dùng CÓ THỂ chỉnh sửa nó. Bạn đã không thể đọc toàn bộ phần và tôi trích dẫn: "Các yếu tố sau hỗ trợ thuộc tính chỉ đọc: INPUT và TEXTAREA."
Carlos Rendon

3
Tôi biết rằng đây là một câu trả lời cũ, nhưng điều này thực sự hoạt động. Tôi không biết lý do của nhiều downvote.
Ze Luis
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.