Làm thế nào để POST / Gửi một hộp kiểm đầu vào bị vô hiệu hóa?


130

Tôi có một hộp kiểm, với những điều kiện nhất định, cần phải bị vô hiệu hóa. Hóa ra HTTP không đăng các đầu vào bị vô hiệu hóa.

Làm thế nào tôi có thể nhận được xung quanh đó? gửi đầu vào ngay cả khi nó bị vô hiệu hóa và giữ đầu vào bị vô hiệu hóa?


Tôi nghĩ giải pháp này cũng có ích ở đây: stackoverflow.com/questions/12769664/
Kẻ

Tôi nghĩ giải pháp này cũng có ích ở đây: stackoverflow.com/questions/12769664/
Kẻ

Câu trả lời:


106

CẬP NHẬT : READONLYkhông hoạt động trên các hộp kiểm

Bạn có thể sử dụng disabled="disabled"nhưng tại thời điểm này, giá trị của hộp kiểm sẽ không xuất hiện thành POSTcác giá trị. Một trong những chiến lược là thêm giá trị của hộp kiểm giữ trường ẩn trong cùng một biểu mẫu và đọc lại giá trị từ trường đó

Đơn giản chỉ cần thay đổi disabledthànhreadonly


7
Để làm cho HTML hợp lệ, cụ thể đặt giá trị của chỉ đọc thành chỉ đọc, tức là:<input name="foo" value="bar" readonly="readonly" />
Matt Huggins

5
Để đưa trường nhập "chỉ đọc" vào LOOK như trường "bị vô hiệu hóa", hãy đặt 'style = "color: grey; background-color: # F0F0F0;"'.
Dan Nissenbaum

3
@MattHuggins Đặt giá trị cho các thuộc tính tên thuộc tính chỉ như đã chọn, chỉ đọc, v.v ... và dấu gạch chéo trên các thuộc tính không ghép đôi không liên quan gì đến tính hợp lệ của HTML - những điều này cần thiết cho tính hợp lệ của XHTML ...
jave.web

Btw: Có lẽ vấp ngã ai đó về điều này: KHÔNG SỬ DỤNG CNTT cho loại đầu vào = nút, họ sẽ không bị "vô hiệu hóa", sử dụng "tật = 'bị vô hiệu hóa" "
Meister Schnitzel

2
readonlysẽ không hoạt động vì bạn sẽ không thể đăng giá trị của hộp kiểm với thẻ đó, sử dụng disabledcùng với phần tử đầu vào ẩn để giữ giá trị của hộp kiểm, xem cách: stackoverflow.com/a/8274787/448816
mikhail-t

91

Tôi đã giải quyết vấn đề đó.

readonly="readonly"thẻ không hoạt động (tôi đã thử các trình duyệt khác nhau), nên bạn phải sử dụng disabled="disabled" thay thế. Nhưng giá trị hộp kiểm của bạn sẽ không được đăng sau đó ...

Đây là giải pháp của tôi:

Để có được giao diện "chỉ đọc" và giá trị của hộp kiểm POST cùng một lúc, chỉ cần thêm một "đầu vào" ẩn có cùng tên và giá trị với hộp kiểm của bạn . Bạn phải giữ nó bên cạnh hộp kiểm của bạn hoặc giữa các <form></form>thẻ giống nhau :

<input type="checkbox" checked="checked" disabled="disabled" name="Tests" value="4">SOME TEXT</input>

<input type="hidden" id="Tests" name="Tests" value="4" />

Ngoài ra, chỉ để cho bạn biết readonly="readonly", readonly="true", readonly="",hoặc READONLYsẽ KHÔNG giải quyết điều này! Tôi đã dành vài giờ để tìm ra nó!

Tài liệu tham khảo này cũng KHÔNG liên quan (có thể chưa hoặc không còn nữa, tôi không biết): http://www.w3schools.com/tags/att_input_readonly.asp


Ở đây phải có cùng id cho đầu vào ẩn và hộp kiểm?
user2167382

Không, Id có thể là bất cứ điều gì, nhưng 'tên' và 'giá trị' phải giống nhau.
mikhail-t

Làm thế nào đáng tin cậy trong các trình duyệt khác nhau?
Tim

này đã được thử nghiệm và làm việc tốt trong mới nhất của Chrome, Firefox và IE 11, đây là một thực hiện, hãy thử nó trong trình duyệt của bạn: mvccbl.com/...
Mikhail-t

74

Nếu bạn hài lòng khi sử dụng JQuery thì hãy xóa thuộc tính bị vô hiệu hóa khi gửi biểu mẫu:

$("form").submit(function() {
    $("input").removeAttr("disabled");
});

Điều này sẽ làm cho điều khiển "được kích hoạt" trong UI?
anar khalilov

Nó loại bỏ thuộc tính bị vô hiệu hóa nên theo lý thuyết là có. Trong thực tế, tôi không nghĩ người dùng có thể thay đổi trường thông qua giao diện người dùng giữa điều này xảy ra và biểu mẫu được gửi ... Tôi rất muốn biết chắc chắn.
Tristan Channing

Một chút cũ, nhưng là sidenote: Nếu bạn sử dụng <select>hoặc <textfield>các thành phần HTML khác hỗ trợ disabledthuộc tính, bạn có thể chọn chúng và bật tất cả với: $( "*:disabled" ).removeAttr("disabled");
Gusstavv Gil

10

Bạn có thể xử lý theo cách này ... Đối với mỗi hộp kiểm, hãy tạo một trường ẩn có cùng namethuộc tính. Nhưng đặt giá trị của trường ẩn đó với một số giá trị mặc định mà bạn có thể kiểm tra. Ví dụ..

<input type="checkbox" name="myCheckbox" value="agree" />
<input type="hidden" name="myCheckbox" value="false" />

Nếu hộp kiểm được "chọn" khi biểu mẫu được gửi, thì giá trị của tham số biểu mẫu đó sẽ là

"agree,false"

Nếu hộp kiểm không được chọn, thì giá trị sẽ là

"false"

Bạn có thể sử dụng bất kỳ giá trị nào thay vì "sai", nhưng bạn có ý tưởng.


5
Bạn không ghét nó khi bạn viết ra một số giải pháp phức tạp cho một vấn đề và sau đó khi bạn làm mới, ai đó (như Francesco) sẽ đi và viết một bài đơn giản? ;)
jessegavin

Điều này là hoàn hảo cho những gì tôi đang cố gắng thực hiện, tôi muốn hộp kiểm không được chọn để gửi một giá trị thay vì không có gì, cảm ơn: D.
Geoffrey

@jessegavin Cho rằng 'một lớp lót đơn giản' của anh ấy không còn hoạt động nữa và anh ấy đã cập nhật câu trả lời của anh ấy để bao gồm câu trả lời của bạn, không, tôi không thể nói rằng tôi làm.
RyanfaeScotland

8
<input type="checkbox" checked="checked" onclick="this.checked=true" />

Tôi bắt đầu từ vấn đề: "làm thế nào để POST / Gửi hộp kiểm đầu vào bị vô hiệu hóa?" và trong câu trả lời của tôi, tôi đã bỏ qua bình luận: "Nếu chúng tôi muốn vô hiệu hóa hộp kiểm, chúng tôi chắc chắn cần phải giữ một giá trị tiền tố (được chọn hoặc không được kiểm tra) và chúng tôi cũng muốn người dùng biết về nó (nếu không chúng tôi nên sử dụng loại ẩn và không phải là một hộp kiểm) ". Trong câu trả lời của tôi, tôi cho rằng chúng tôi muốn luôn kiểm tra hộp kiểm và mã đó hoạt động theo cách này. Nếu chúng ta nhấp vào ckeckbox đó, nó sẽ được kiểm tra mãi mãi và giá trị của nó sẽ được POST / Gửi! Theo cách tương tự nếu tôi viết onclick = "this.checked = false" mà không được kiểm tra = "đã kiểm tra" (lưu ý: mặc định là không được chọn), nó sẽ mãi mãi không được kiểm tra và giá trị của nó sẽ không được POST / Gửi!.


điều này chỉ đơn giản là sao chép những gì hộp kiểm đã làm, nhưng nếu nó đã bị vô hiệu hóa bởi javascript hoặc vì vậy nó vẫn sẽ bị vô hiệu hóa, bạn có thể giải thích thêm một chút về những gì bạn đang làm không, có thể tôi hiểu sai vì đây chỉ là một dòng mã
ScottC

8

tạo một lớp css, vd:

.disable{
        pointer-events: none;
        opacity: 0.5;
}

áp dụng lớp này thay vì thuộc tính bị vô hiệu hóa


7

Cách đơn giản nhất để làm điều này là:

<input type="checkbox" class="special" onclick="event.preventDefault();" checked />

Điều này sẽ ngăn người dùng không thể bỏ chọn hộp kiểm này và nó vẫn sẽ gửi giá trị của nó khi biểu mẫu được gửi. Xóa chọn nếu bạn muốn người dùng không thể chọn hộp kiểm này.

Ngoài ra, sau đó bạn có thể sử dụng javascript để xóa onclick sau khi một điều kiện nhất định được đáp ứng (nếu đó là những gì bạn đang theo đuổi). Đây là một câu đố khó hiểu cho thấy ý tôi là gì. Nó không hoàn hảo, nhưng bạn có ý chính.

http://jsfiddle.net/vwUUc/


4

Công việc này như một cái duyên vậy:

  1. Xóa các thuộc tính "bị vô hiệu hóa"
  2. Gửi mẫu
  3. Thêm các thuộc tính một lần nữa. Cách tốt nhất để làm điều này là sử dụng hàm setTimeOut , ví dụ với độ trễ 1 mili giây.

Nhược điểm duy nhất là nhấp nháy ngắn lên của các trường đầu vào bị vô hiệu hóa khi gửi. Ít nhất trong kịch bản của tôi đó không phải là vấn đề!

$('form').bind('submit', function () {
  var $inputs = $(this).find(':input'),
      disabledInputs = [],
      $curInput;

  // remove attributes
  for (var i = 0; i < $inputs.length; i++) {
    $curInput = $($inputs[i]);

    if ($curInput.attr('disabled') !== undefined) {
      $curInput.removeAttr('disabled');
      disabledInputs.push(true);
    } else 
      disabledInputs.push(false);
  }

  // add attributes
  setTimeout(function() {
    for (var i = 0; i < $inputs.length; i++) {

      if (disabledInputs[i] === true)
        $($inputs[i]).attr('disabled', true);

    }
  }, 1);

});

3

Đừng vô hiệu hóa nó; thay vào đó, đặt nó thành chỉ đọc, mặc dù điều này không có tác dụng vì không cho phép người dùng thay đổi trạng thái. Nhưng bạn có thể sử dụng jQuery để thực thi điều này (ngăn người dùng thay đổi trạng thái của hộp kiểm:

$('input[type="checkbox"][readonly="readonly"]').click(function(e){
    e.preventDefault();
});

Điều này giả định rằng tất cả các hộp kiểm bạn không muốn sửa đổi đều có thuộc tính "chỉ đọc". ví dụ.

<input type="checkbox" readonly="readonly">

Cảm ơn vì điều này! Vì một số lý do, đầu vào "ẩn" không hoạt động đối với tôi. Điều này đã cứu tôi. Thực sự hack rất đẹp!
NewbieProgrammer

3

Từ:

  • thiết lập thuộc tính chỉ đọc thành hộp kiểm không hợp lệ theo đặc tả HTML,
  • sử dụng yếu tố ẩn để gửi giá trị không phải là cách rất hay và
  • cài đặt onclick JavaScript để ngăn thay đổi giá trị cũng không đẹp lắm

Tôi sẽ cung cấp cho bạn một khả năng khác:

Đặt hộp kiểm của bạn là vô hiệu hóa như bình thường. Và trước khi biểu mẫu được gửi bởi người dùng, hãy bật hộp kiểm này bằng JavaScript.

<script>
    function beforeSumbit() {
        var checkbox = document.getElementById('disabledCheckbox');
        checkbox.disabled = false;
    }
</script>
...
<form action="myAction.do" method="post" onSubmit="javascript: beforeSubmit();">
    <checkbox name="checkboxName" value="checkboxValue" disabled="disabled" id="disabledCheckbox" />
    <input type="submit />
</form>

Vì hộp kiểm được bật trước khi biểu mẫu được gửi, giá trị của nó được đăng theo cách phổ biến. Điều duy nhất không dễ chịu về giải pháp này là hộp kiểm này được bật trong một thời gian và người dùng có thể nhìn thấy. Nhưng đó chỉ là một chi tiết tôi có thể sống với.


1

Thật không may, không có giải pháp "đơn giản". Thuộc tính chỉ đọc không thể được áp dụng cho các hộp kiểm. Tôi đọc thông số W3 về hộp kiểm và tìm ra thủ phạm:

Nếu một điều khiển không có giá trị hiện tại khi biểu mẫu được gửi, tác nhân người dùng không bắt buộc phải coi đó là điều khiển thành công. ( http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2 )

Điều này làm cho trạng thái không được kiểm tra và trạng thái bị vô hiệu hóa dẫn đến cùng một giá trị được phân tích cú pháp.

  • readonly = "readonly" không phải là một thuộc tính hợp lệ cho các hộp kiểm.
  • onclick = "event.preventDefault ();" không phải lúc nào cũng là một giải pháp tốt vì nó được kích hoạt trên chính hộp kiểm. Nhưng nó có thể làm việc quyến rũ trong một số dịp.
  • Kích hoạt hộp kiểm trênSubmit không phải là một giải pháp vì điều khiển vẫn chưa được coi là điều khiển thành công nên giá trị sẽ không được phân tích cú pháp.
  • Thêm một đầu vào ẩn khác có cùng tên trong HTML của bạn không hoạt động vì giá trị điều khiển đầu tiên được ghi đè bằng giá trị điều khiển thứ hai vì nó có cùng tên.

Cách duy nhất đầy đủ để làm điều này là thêm một đầu vào ẩn có cùng tên với javascript khi gửi biểu mẫu .

Bạn có thể sử dụng đoạn trích nhỏ tôi đã thực hiện cho việc này:

function disabled_checkbox() {
  var theform = document.forms[0];
  var theinputs = theform.getElementsByTagName('input');
  var nrofinputs = theinputs.length;
  for(var inputnr=0;inputnr<nrofinputs;inputnr++) {
    if(theinputs[inputnr].disabled==true) {
      var thevalueis = theinputs[inputnr].checked==true?"on":"";
      var thehiddeninput = document.createElement("input");
      thehiddeninput.setAttribute("type","hidden");
      thehiddeninput.setAttribute("name",theinputs[inputnr].name);
      thehiddeninput.setAttribute("value",thevalueis);
      theinputs[inputnr].parentNode.appendChild(thehiddeninput);
    }
  }
}

Cái này tìm mẫu đầu tiên trong tài liệu, tập hợp tất cả các đầu vào và tìm kiếm các đầu vào bị vô hiệu hóa. Khi tìm thấy đầu vào bị vô hiệu hóa, đầu vào ẩn được tạo trong ngoặc đơn có cùng tên và giá trị 'bật' (nếu trạng thái của nó là 'được kiểm tra') và '' (nếu trạng thái đó là '' - không được kiểm tra).

Chức năng này phải được kích hoạt bởi sự kiện 'onsubmit' trong phần tử FORM như:

<form id='ID' action='ACTION' onsubmit='disabled_checkbox();'>


1

Không có tùy chọn nào khác ngoài một hiddentrường, vì vậy hãy thử sử dụng một hiddentrường như được trình bày trong mã dưới đây:

<input type="hidden" type="text" name="chk1[]" id="tasks" value="xyz" >
<input class="display_checkbox" type="checkbox" name="chk1[]" id="tasks" value="xyz" checked="check"  disabled="disabled" >Tasks

0
<html>
    <head>
    <script type="text/javascript">
    function some_name() {if (document.getElementById('first').checked)      document.getElementById('second').checked=false; else document.getElementById('second').checked=true;} 
    </script>
    </head>
    <body onload="some_name();">
    <form>
    <input type="checkbox" id="first" value="first" onclick="some_name();"/>first<br/>
    <input type="checkbox" id="second" value="second" onclick="some_name();" />second
    </form>
    </body>
</html>

Hàm some_name là một ví dụ về mệnh đề trước để quản lý hộp kiểm thứ hai được chọn (đăng giá trị của nó) hoặc không được chọn (không đăng giá trị của nó) theo mệnh đề và người dùng không thể sửa đổi trạng thái của nó; không cần quản lý việc vô hiệu hóa hộp kiểm thứ hai


0

Bạn có thể giữ nó bị vô hiệu hóa như mong muốn, và sau đó xóa thuộc tính bị vô hiệu hóa trước khi biểu mẫu được gửi.

$('#myForm').submit(function() {
    $('checkbox').removeAttr('disabled');
});

0

Thêm onclick="this.checked=true"Giải quyết vấn đề của tôi:
Ví dụ:

<input type="checkbox" id="scales" name="feature[]" value="scales" checked="checked" onclick="this.checked=true" />

0

Đây là một công việc khác xung quanh có thể được kiểm soát từ phụ trợ.

ASPX

<asp:CheckBox ID="Parts_Return_Yes" runat="server" AutoPostBack="false" />

Trong ASPX.CS

Parts_Return_Yes.InputAttributes["disabled"] = "disabled";
Parts_Return_Yes.InputAttributes["class"] = "disabled-checkbox";

Lớp chỉ được thêm vào cho mục đích phong cách.


0

Tôi chỉ kết hợp các đề xuất HTML, JS và CSS trong các câu trả lời ở đây

HTML:

<input type="checkbox" readonly>

jQuery:

(function(){
    // Raj: https://stackoverflow.com/a/14753503/260665
    $(document).on('click', 'input[type="checkbox"][readonly]', function(e){
        e.preventDefault();
    });
})();

CSS:

input[type="checkbox"][readonly] {
  cursor: not-allowed;
  opacity: 0.5;
}

Vì phần tử không bị 'vô hiệu hóa', nó vẫn đi qua POST.

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.