POST các hộp kiểm HTML không được kiểm tra


303

Tôi đã có một tải các hộp kiểm tra được kiểm tra theo mặc định. Người dùng của tôi có thể sẽ bỏ chọn một vài (nếu có) các hộp kiểm và để lại phần còn lại được chọn.

Có cách nào để làm cho hình thức POST các hộp kiểm được không kiểm tra, chứ không phải là những người mà được kiểm tra?

Câu trả lời:


217

Thêm một đầu vào ẩn cho hộp kiểm với một ID khác:

<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden' type='hidden' value='No' name='testName'>

Trước khi gửi biểu mẫu, hãy tắt đầu vào ẩn dựa trên điều kiện đã chọn:

if(document.getElementById("testName").checked) {
    document.getElementById('testNameHidden').disabled = true;
}

58
Nếu bạn đang đi với một giải pháp dựa trên đánh dấu như thế này, có lẽ tốt hơn là đặt đầu vào ẩn trước, cho nhiều câu trả lời khác. Nếu bạn đang sử dụng PHP, thì bạn có thể loại bỏ phụ thuộc javascript, vì chỉ giá trị cuối cùng được sử dụng.
Ben

12
gamov, bạn nhầm, nhãn được gắn vào đầu vào dựa trên thuộc tính id, không phải thuộc tính tên đầu vào
Justin Emery

14
Khó tin các tác giả đã thiết kế nó theo cách này. Tại sao không gửi tất cả các trường đầu vào với một số giá trị mặc định cho những trường không được kiểm tra :( Sẽ là giải pháp rõ ràng hơn sau đó phải thực hiện một số trường "hack" ẩn. Rõ ràng là nó sẽ cần thiết và chúng phải xem trước.
Srneczek 6/2/2015

34
Điều này cảm thấy rất hacky.
EralpB

65
Tôi có phải là người duy nhất nghĩ rằng thiết kế cơ bản của checkboxyếu tố này là khủng khiếp không? Chúng là một điều khiển nhị phân, chúng nên gửi các giá trị nhị phân.
alexw

474

Giải pháp tôi thích nhất từ ​​trước đến nay là đặt một đầu vào ẩn có cùng tên với hộp kiểm có thể không được chọn. Tôi nghĩ rằng nó hoạt động để nếu hộp kiểm không được chọn, đầu vào ẩn vẫn thành công và được gửi đến máy chủ nhưng nếu hộp kiểm được chọn, nó sẽ ghi đè đầu vào ẩn trước nó. Bằng cách này, bạn không phải theo dõi giá trị nào trong dữ liệu được đăng dự kiến ​​đến từ các hộp kiểm.

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

3
Bây giờ tôi đọc lại câu hỏi, có vẻ như đây không thực sự là điều bạn muốn. Tuy nhiên tôi đã nhận được câu hỏi này khi tôi đang cố gắng tìm ra câu trả lời này để có thể nó có ích cho người khác.
Sam

2
.NET thì khác, thay vào đó hãy xem stackoverflow.com/questions/7600817/ từ
KCD

121
Cần lưu ý rằng nếu bạn chọn hộp, trình duyệt sẽ gửi cả giá trị ẩn và hộp kiểm. Giải pháp này sau đó phụ thuộc vào việc máy chủ xử lý biến bài với 2 giá trị này. Nếu nó chỉ lấy giá trị cuối cùng (ví dụ PHP), mã của bạn sẽ hoạt động như mong đợi. Tuy nhiên, một số máy chủ xử lý việc này khác nhau, Một số chọn giá trị đầu tiên, trong khi một số khác đặt cả hai giá trị trong một danh sách / mảng.
Michael Ekoka

1
Câu trả lời này được xây dựng dựa trên giả định rằng bạn chỉ có thể chuyển tiếp trên một trong hai đầu vào có tên bằng nhau sẽ được gửi đến máy chủ - Tôi không hiểu tại sao điều này lại nhận được nhiều phiếu bầu như vậy?
Muleskinner

7
@sam không biết bạn lấy ý tưởng đó từ đâu? Khi hai hoặc nhiều điều khiển được đặt tên giống nhau thì cả hai sẽ được gửi đến máy chủ khi gửi (tuy nhiên đối với các hộp kiểm, chỉ khi được chọn) - cách chúng được xử lý trên máy chủ phụ thuộc vào việc thực hiện phía máy chủ. Nếu bạn không tin tôi, bạn có thể tự mình nhìn thấy bằng cách theo dõi lưu lượng truy cập bằng một công cụ như fiddler.
Muleskinner

75

Tôi đã giải quyết nó bằng cách sử dụng JavaScript vanilla:

<input type="hidden" name="checkboxName" value="0"><input type="checkbox" onclick="this.previousSibling.value=1-this.previousSibling.value">

Hãy cẩn thận để không có bất kỳ khoảng trắng hoặc ngắt dòng giữa hai yếu tố đầu vào này!

Bạn có thể sử dụng this.previousSibling.previousSiblingđể có được các yếu tố "trên".

Với PHP, bạn có thể kiểm tra trường ẩn có tên là 0 (không được đặt) hoặc 1 (đã đặt).


Tại sao bạn không thể có khoảng trắng hoặc ngắt dòng giữa hai yếu tố?
Michael Potter

@MichaelPotter: this.preinglySibling sẽ có khoảng trắng như anh chị em, vì vậy nó không hoạt động.
Marcel Ennix

4
Ôi đây là HOÀN HẢO! Nó giải quyết vấn đề đăng nhiều trường với các trường có tên trùng lặp ở đó. Không có giải pháp nào khác làm được. Sử dụng phương pháp của Marcel, các trường được đăng của bạn sẽ có các mảng có độ dài bằng nhau. Vì vậy, kịch bản này: <fieldset name='fs1'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset> <fieldset name='fs2'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset>* Giả sử có những dòng mới ở đó. Họ dường như không làm việc trong các khối mã đánh dấu nhỏ
Brian Layman

1
Đây phải là câu trả lời được chấp nhận. Nó hoạt động với mảng (ex / name = "soup []")
jdavid05

2
Bạn có thể sử dụng previousElementSiblingthay vì previousSibling. Nó được hỗ trợ gần như ở mọi nơi và nó bỏ qua các nút văn bản.
MarSoft

23

Sở thích cá nhân của tôi là thêm một trường ẩn có cùng tên sẽ được sử dụng nếu hộp kiểm được bỏ chọn. Nhưng giải pháp không dễ dàng như nó có vẻ.

Nếu bạn thêm mã này:

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

Trình duyệt sẽ không thực sự quan tâm đến những gì bạn làm ở đây. Trình duyệt sẽ gửi cả hai tham số đến máy chủ và máy chủ phải quyết định phải làm gì với chúng.

Ví dụ, PHP lấy giá trị cuối cùng làm giá trị sử dụng (xem: Vị trí có thẩm quyền của các khóa truy vấn HTTP GET trùng lặp )

Nhưng các hệ thống khác mà tôi đã làm việc với (dựa trên Java) thực hiện theo cách đó - chúng chỉ cung cấp cho bạn giá trị đầu tiên. Thay vào đó .NET sẽ cung cấp cho bạn một mảng với cả hai phần tử thay thế

Thỉnh thoảng tôi sẽ thử kiểm tra điều này với node.js, Python và Perl.


2
cả ruby ​​và node.js đều sẽ lấy giá trị cuối cùng của bất kỳ trường mẫu trùng lặp nào. Vì lý do này, các phương thức trợ giúp của Ruby on Rails xây dựng các hộp kiểm theo kiểu này.
nzifnab

7
Chỉ cần làm tròn điều đó - điều này dựa trên một cuộc tấn công có tên là Ô nhiễm tham số HTTP và đã được phân tích bởi OWASP: owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf (trang 9) nơi bạn có thể tìm thấy danh sách 20 hệ thống hệ thống và xem cách họ xử lý đó.
SimonSimCity

1
Java Servlets cung cấp cho bạn tất cả, miễn là bạn gọirequest.getParameterValues
mauhiz

20

Một kỹ thuật phổ biến xung quanh điều này là mang một biến ẩn cùng với mỗi hộp kiểm.

<input type="checkbox" name="mycheckbox" />
<input type="hidden" name="mycheckbox.hidden"/>

Về phía máy chủ, trước tiên chúng tôi phát hiện danh sách các biến ẩn và đối với từng biến ẩn, chúng tôi thử xem liệu mục nhập hộp kiểm tương ứng có được gửi trong dữ liệu biểu mẫu hay không.

Thuật toán phía máy chủ có thể sẽ trông giống như:

for input in form data such that input.name endswith .hidden
  checkboxName = input.name.rstrip('.hidden')
  if chceckbName is not in form, user has unchecked this checkbox

Ở trên không trả lời chính xác câu hỏi, nhưng cung cấp một phương tiện thay thế để đạt được chức năng tương tự.


20

bạn không cần tạo trường ẩn cho tất cả các hộp kiểm chỉ cần sao chép mã của tôi. nó sẽ thay đổi giá trị của hộp kiểm nếu không được chọn thì hộp kiểm valuesẽ gán 0và nếu hộp kiểm được chọn thì gán valuevào1

$("form").submit(function () {

    var this_master = $(this);

    this_master.find('input[type="checkbox"]').each( function () {
        var checkbox_this = $(this);


        if( checkbox_this.is(":checked") == true ) {
            checkbox_this.attr('value','1');
        } else {
            checkbox_this.prop('checked',true);
            //DONT' ITS JUST CHECK THE CHECKBOX TO SUBMIT FORM DATA    
            checkbox_this.attr('value','0');
        }
    })
})

1
Giải pháp này hoạt động tốt và thanh lịch hơn so với việc gây ô nhiễm Dom với các trường ẩn.
Prasad Paranjape

9
Điều này khiến hộp được kiểm tra tạm thời trong khi biểu mẫu được gửi. Điều này gây nhầm lẫn (tốt nhất) cho người dùng.
Đánh dấu Fraser

12
$('input[type=checkbox]').on("change",function(){
    var target = $(this).parent().find('input[type=hidden]').val();
    if(target == 0)
    {
        target = 1;
    }
    else
    {
        target = 0;
    }
    $(this).parent().find('input[type=hidden]').val(target);
});

<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>

Nếu bạn để lại tên của hộp kiểm thì nó sẽ không được thông qua. Chỉ mảng test_checkbox.


1
Giải pháp rất tuyệt vời, nhưng trong trường hợp của tôi, live () không hoạt động, vì vậy tôi đã sử dụng phương thức (): $ ('input [type = hộp]'). On ("change", function () {...}) ;
Thánh lễ

4
TRỰC TIẾP đã lỗi thời. Không sử dụng nó cho câu trả lời trong stackoverflow nữa. Amem.
Ismael

Câu trả lời này thực sự là tốt nhất .. Nó hoạt động như mong đợi. Ngay cả đối với hộp kiểm nhóm.
Alemoh Rapheal Baja

11

Bạn có thể thực hiện một số Javascript trong sự kiện gửi biểu mẫu. Đó là tất cả những gì bạn có thể làm, mặc dù vậy, không có cách nào để các trình duyệt tự làm điều này. Nó cũng có nghĩa là hình thức của bạn sẽ phá vỡ cho người dùng mà không cần Javascript. Tốt hơn là nên biết trên máy chủ có các hộp kiểm nào, vì vậy bạn có thể suy luận rằng những người vắng mặt trong các giá trị biểu mẫu đã đăng ( $_POSTtrong PHP) không được chọn.


2
kể từ php 4.1, bạn cũng có thể sử dụng $ _REQUEST php.net/manual/en/reserved.variabled.request.php
Karl Adler

$_REQUESTlà một cách thực hành tốt vì nó cho phép một số mã sử dụng lại nếu tập lệnh của bạn hỗ trợ cả hai phương thức.
nullability

9

Tôi thực sự sẽ làm như sau.

Có trường nhập ẩn của tôi có cùng tên với đầu vào hộp kiểm

<input type="hidden" name="checkbox_name[]" value="0" />
<input type="checkbox" name="checkbox_name[]" value="1" />

và sau đó khi tôi đăng bài, trước hết tôi loại bỏ các giá trị trùng lặp được chọn trong mảng $ _POST, suy ra hiển thị từng giá trị duy nhất.

  $posted = array_unique($_POST['checkbox_name']);
  foreach($posted as $value){
    print $value;
  }

Tôi đã nhận được điều này từ một bài đăng loại bỏ các giá trị trùng lặp từ mảng


Mục đích của [] trên giá trị trường tên là gì?
Michael Potter

@MichaelPotter Chính vì vậy, khi bài đăng được gửi tới PHP, nó sẽ đọc tên `hộp
kiểm_bảng

@ Twister1002, tôi nghĩ bạn đã mô tả mục đích của thuộc tính name, không phải mục đích thêm [] vào tên. Tôi đã thực hiện tìm kiếm trên web và có vẻ như một số người thực hiện việc này với các tên: tên nhóm [tên phần tử] để nhóm các trường với nhau, nhưng tôi không tìm thấy lời giải thích cho trống [].
Michael Potter

1
@MichaelPotter Xin lỗi, tôi nghĩ rằng tôi đã hoàn thành tuyên bố đó. Nhưng hình như không phải. Hãy để tôi làm lại điều đó. Khi nó được gửi tới php, bộ xử lý PHP sẽ đọc nó dưới dạng một mảng. Vì vậy, với mỗi tên, checkbox_name[]mỗi giá trị sẽ được nhập vào một mảng, sau đó bạn có thể kéo. Ví dụ: $_POST['checkbox_name'][0]v.v ... với sự gia tăng của bao nhiêu trường có cùng tên đó. Một ví dụ khác là nếu bạn có ba trường được đặt tên, field_name[]bạn có thể nhận được giá trị thứ hai của lượt field_namethích $_POST['field_name'][1]. Mục đích của nó có thể tuyệt vời nếu bạn có một số lĩnh vực cùng tên.
Twister1002

8

"Tôi đã thực hiện theo cách tiếp cận máy chủ. Có vẻ như hoạt động tốt - cảm ơn. - Reach4thelasers ngày 1 tháng 12 lúc 15:19" Tôi muốn giới thiệu nó từ chủ sở hữu. Như đã trích dẫn: giải pháp javascript phụ thuộc vào cách xử lý máy chủ (tôi không kiểm tra nó)

nhu la

if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something";

8

Tôi biết câu hỏi này đã 3 tuổi nhưng tôi đã tìm thấy một giải pháp mà tôi nghĩ là hoạt động khá tốt.

Bạn có thể thực hiện kiểm tra nếu biến $ _POST được gán và lưu nó trong một biến.

$value = isset($_POST['checkboxname'] ? 'YES' : 'NO';

hàm isset () kiểm tra nếu biến $ _POST được gán. Theo logic nếu nó không được chỉ định thì hộp kiểm không được chọn.


Điều này tốt hơn nhiều, vì phản ứng phổ biến nhất là một giải pháp khủng khiếp cho trình đọc màn hình.
Kevin Waterson

7

Hầu hết các câu trả lời ở đây yêu cầu sử dụng JavaScript hoặc các điều khiển đầu vào trùng lặp. Đôi khi điều này cần phải được xử lý hoàn toàn ở phía máy chủ.

Tôi tin rằng chìa khóa (dự định) để giải quyết vấn đề phổ biến này là kiểm soát đầu vào đệ trình của biểu mẫu.

Để diễn giải và xử lý các giá trị không được kiểm tra cho các hộp kiểm thành công, bạn cần có kiến ​​thức về những điều sau đây:

  1. Tên của các hộp kiểm
  2. Tên của yếu tố đầu vào đệ trình của biểu mẫu

Bằng cách kiểm tra xem biểu mẫu đã được gửi chưa (một giá trị được gán cho thành phần đầu vào gửi), mọi giá trị hộp kiểm không được kiểm tra có thể được giả sử .

Ví dụ:

<form name="form" method="post">
  <input name="value1" type="checkbox" value="1">Checkbox One<br/>
  <input name="value2" type="checkbox" value="1" checked="checked">Checkbox Two<br/>
  <input name="value3" type="checkbox" value="1">Checkbox Three<br/>
  <input name="submit" type="submit" value="Submit">
</form>

Khi sử dụng PHP, việc phát hiện hộp kiểm nào đã được đánh dấu khá đơn giản.

<?php

$checkboxNames = array('value1', 'value2', 'value3');

// Persisted (previous) checkbox state may be loaded 
// from storage, such as the user's session or a database.
$checkboxesThatAreChecked = array(); 

// Only process if the form was actually submitted.
// This provides an opportunity to update the user's 
// session data, or to persist the new state of the data.

if (!empty($_POST['submit'])) {
    foreach ($checkboxNames as $checkboxName) {
        if (!empty($_POST[$checkboxName])) {
            $checkboxesThatAreChecked[] = $checkboxName;
        }
    }
    // The new state of the checkboxes can be persisted 
    // in session or database by inspecting the values 
    // in $checkboxesThatAreChecked.
    print_r($checkboxesThatAreChecked);
}

?>

Dữ liệu ban đầu có thể được tải trên mỗi lần tải trang, nhưng chỉ nên được sửa đổi nếu biểu mẫu được gửi. Vì tên của các hộp kiểm tra đã được biết trước, chúng có thể được duyệt và kiểm tra riêng lẻ, do đó sự vắng mặt của các giá trị riêng lẻ cho thấy chúng không được kiểm tra.


6

Tôi đã thử phiên bản của Sam trước. Ý tưởng tốt, nhưng nó gây ra có nhiều yếu tố trong biểu mẫu có cùng tên. Nếu bạn sử dụng bất kỳ javascript nào tìm thấy các phần tử dựa trên tên, thì bây giờ nó sẽ trả về một mảng các phần tử.

Tôi đã tìm ra ý tưởng của Shailesh trong PHP, nó hoạt động với tôi. Đây là mã của tôi:

/ * Xóa các trường '.hidden' nếu có bản gốc, sử dụng giá trị '.hidden' nếu không. * /
foreach ($ _POST ['frmmain'] dưới dạng $ field_name => $ value)
{
    // Chỉ nhìn vào các phần tử kết thúc bằng '.hidden'
    if (! đế ($ field_name, -strlen ('. hidden'))) {
        phá vỡ;
    }

    // lấy tên mà không có '.hidden'
    $ real_name = đế ($ key, strlen ($ field_name) - strlen ('. hidden'));

    // Tạo trường gốc 'giả' với giá trị trong '.hidden' nếu không có bản gốc
    if (! Array_key_exists ($ real_name, $ POST_copy)) {
        $ _POST [$ real_name] = $ value;
    }

    // Xóa phần tử '.hidden'
    bỏ đặt ($ _ POST [$ field_name]);
}

6

Tôi cũng thích giải pháp mà bạn chỉ cần đăng thêm một trường nhập liệu, sử dụng JavaScript có vẻ hơi khó hiểu đối với tôi.

Tùy thuộc vào những gì bạn sử dụng cho bạn phụ trợ sẽ phụ thuộc vào đầu vào nào đi trước.

Đối với một phụ trợ máy chủ trong đó lần xuất hiện đầu tiên được sử dụng (JSP), bạn nên làm như sau.

  <input type="checkbox" value="1" name="checkbox_1"/>
  <input type="hidden" value="0" name="checkbox_1"/>


Đối với một phụ trợ máy chủ nơi sử dụng lần xuất hiện cuối cùng (PHP, Rails), bạn nên làm như sau.

  <input type="hidden" value="0" name="checkbox_1"/>
  <input type="checkbox" value="1" name="checkbox_1"/>


Đối với một phụ trợ máy chủ nơi tất cả các lần xuất hiện được lưu trữ trong một kiểu dữ liệu danh sách ( [], array). (Python / Zope)

Bạn có thể đăng bài theo thứ tự bạn thích, bạn chỉ cần cố gắng lấy giá trị từ đầu vào với checkboxthuộc tính type. Vì vậy, chỉ mục đầu tiên của danh sách nếu hộp kiểm nằm trước phần tử ẩn và chỉ mục cuối cùng nếu hộp kiểm nằm sau phần tử ẩn.


Đối với một phụ trợ máy chủ trong đó tất cả các lần xuất hiện được nối với dấu phẩy (ASP.NET / IIS) Bạn sẽ cần (phân tách / phát nổ) chuỗi bằng cách sử dụng dấu phẩy làm dấu phân cách để tạo kiểu dữ liệu danh sách. ( [])

Bây giờ bạn có thể cố lấy chỉ mục đầu tiên của danh sách nếu hộp kiểm nằm trước phần tử ẩn và lấy chỉ mục cuối cùng nếu hộp kiểm nằm sau phần tử ẩn.

Xử lý tham số cuối cùng

nguồn hình ảnh


6

Tôi sử dụng khối jQuery này, nó sẽ thêm một đầu vào ẩn vào lúc gửi đến mỗi hộp kiểm không được kiểm tra. Nó sẽ đảm bảo bạn luôn nhận được một giá trị được gửi cho mỗi hộp kiểm, mọi lúc, mà không làm lộn xộn đánh dấu của bạn và có nguy cơ quên làm điều đó trên hộp kiểm bạn thêm sau. Nó cũng không biết đến bất kỳ ngăn xếp phụ trợ nào (PHP, Ruby, v.v.) bạn đang sử dụng.

// Add an event listener on #form's submit action...
$("#form").submit(
    function() {

        // For each unchecked checkbox on the form...
        $(this).find($("input:checkbox:not(:checked)")).each(

            // Create a hidden field with the same name as the checkbox and a value of 0
            // You could just as easily use "off", "false", or whatever you want to get
            // when the checkbox is empty.
            function(index) {
                var input = $('<input />');
                input.attr('type', 'hidden');
                input.attr('name', $(this).attr("name")); // Same name as the checkbox
                input.attr('value', "0"); // or 'off', 'false', 'no', whatever

                // append it to the form the checkbox is in just as it's being submitted
                var form = $(this)[0].form;
                $(form).append(input);

            }   // end function inside each()
        );      // end each() argument list

        return true;    // Don't abort the form submit

    }   // end function inside submit()
);      // end submit() argument list

5

Bạn cũng có thể chặn sự kiện form.submit và kiểm tra ngược lại trước khi gửi

$('form').submit(function(event){
    $('input[type=checkbox]').prop('checked', function(index, value){
        return !value;
    });
});

4

Tôi thấy câu hỏi này đã cũ và có rất nhiều câu trả lời, nhưng dù sao tôi cũng sẽ đưa đồng xu của mình. Phiếu bầu của tôi là cho giải pháp javascript về sự kiện 'gửi' của biểu mẫu, như một số người đã chỉ ra. Không nhân đôi đầu vào (đặc biệt nếu bạn có tên dài và thuộc tính có mã php trộn với html), không làm phiền phía máy chủ (điều đó đòi hỏi phải biết tất cả tên trường và kiểm tra từng cái một), chỉ cần tìm nạp tất cả các mục không được kiểm tra , gán cho chúng một giá trị 0 (hoặc bất cứ điều gì bạn cần để chỉ ra trạng thái 'chưa được kiểm tra') và sau đó thay đổi thuộc tính 'được kiểm tra' thành đúng

    $('form').submit(function(e){
    var b = $("input:checkbox:not(:checked)");
    $(b).each(function () {
        $(this).val(0); //Set whatever value you need for 'not checked'
        $(this).attr("checked", true);
    });
    return true;
});

bằng cách này, bạn sẽ có một mảng $ _POST như thế này:

Array
(
            [field1] => 1
            [field2] => 0
)

Không làm việc ở bên tôi. Cố gắng làm điều này nhưng vẫn không đăng tất cả các hộp kiểm. [code] $ ("# bộ lọc đầu vào"). change (function (e) {console.log ('sublmit'); var b = $ ("input: hộp kiểm: không (: đã kiểm tra)"); $ (b) .each (function () {$ (this) .val (2); $ (this) .attr ("đã kiểm tra", true);}); $ ("# filter"). submit ();}); [/ code]
Lio

Đã lừa tôi. Hạn chế duy nhất - trên biểu mẫu gửi mọi hộp kiểm tra đã được kiểm tra. Điều này có thể gây nhầm lẫn cho người dùng, nhưng vì trang đang tải lại sau khi gửi biểu mẫu, tôi nghĩ đó là một vấn đề nhỏ.
Oksana Romaniv

Như Oksana đã nói, nó kiểm tra tất cả các hộp kiểm, bao gồm mọi hộp kiểm bắt buộc mà người dùng không tự chọn cho phép biểu mẫu được gửi mà không cần người dùng đồng ý với một số điều kiện.
bskool

4
$('form').submit(function () {
    $(this).find('input[type="checkbox"]').each( function () {
        var checkbox = $(this);
        if( checkbox.is(':checked')) {
            checkbox.attr('value','1');
        } else {
            checkbox.after().append(checkbox.clone().attr({type:'hidden', value:0}));
            checkbox.prop('disabled', true);
        }
    })
});

1
Điều này làm việc cho tôi. Thay vì sử dụng .submit bạn sẽ sử dụng .click. Sau đó loại bỏ các bit mà vô hiệu hóa các hộp kiểm. Sau đó nó hoạt động hoàn hảo.
cgrouge

1
Câu trả lời tốt nhất không cần thêm đầu vào ẩn khác cho mỗi người
Sky

3

Những gì tôi đã làm là một chút khác nhau. Đầu tiên tôi thay đổi giá trị của tất cả các hộp kiểm không được kiểm tra. Đến "0", sau đó chọn tất cả, vì vậy giá trị sẽ được gửi.

function checkboxvalues(){
  $("#checkbox-container input:checkbox").each(function({ 
    if($(this).prop("checked")!=true){
      $(this).val("0");
      $(this).prop("checked", true);
    }
  });
}


Câu trả lời là tốt, nhưng tôi muốn biết nó có khác với câu trả lời của @Rameez SOOMRO không?
Imran Qamer

Kết quả cuối cùng tương tự, chỉ có cách này bạn không thay đổi giá trị của các hộp kiểm tra.
Saborreia

2

Tôi muốn đối chiếu $ _POST

if (!$_POST['checkboxname']) !$_POST['checkboxname'] = 0;

lưu ý rằng, nếu POST không có 'hộp kiểm' giá trị, thì nó không được xác định, vì vậy, gán một giá trị.

bạn có thể tạo một mảng các giá trị ckeckbox của mình và tạo một hàm kiểm tra xem các giá trị có tồn tại hay không, nếu không, nó sẽ không được kiểm tra và bạn có thể căn chỉnh một giá trị


1

Ví dụ về các hành động Ajax là (': đã kiểm tra') được sử dụng jQuery thay vì .val ();

            var params = {
                books: $('input#users').is(':checked'),
                news : $('input#news').is(':checked'),
                magazine : $('input#magazine').is(':checked')
            };

params sẽ nhận được giá trị trong TRUE HOẶC FALSE ..


1

Các hộp kiểm thường đại diện cho dữ liệu nhị phân được lưu trữ trong cơ sở dữ liệu dưới dạng các giá trị Có / Không, Y / N hoặc 1/0. Các hộp kiểm HTML có bản chất xấu chỉ gửi giá trị đến máy chủ nếu hộp kiểm được chọn! Điều đó có nghĩa là tập lệnh máy chủ trên trang web khác phải biết trước tất cả các hộp kiểm có thể có trên trang web để có thể lưu trữ các giá trị dương (đã chọn) hoặc âm (không được kiểm tra). Trên thực tế chỉ có các giá trị âm là có vấn đề (khi người dùng bỏ chọn giá trị đã kiểm tra trước (trước) - làm thế nào máy chủ có thể biết điều này khi không có gì được gửi nếu không biết trước rằng tên này sẽ được gửi). Nếu bạn có tập lệnh phía máy chủ tự động tạo tập lệnh CẬP NHẬT thì có một vấn đề vì bạn không biết tất cả các hộp kiểm sẽ được nhận để đặt giá trị Y cho giá trị đã chọn và giá trị N cho các tập tin không được chọn (không nhận được).

Vì tôi lưu trữ các giá trị 'Y' và 'N' trong cơ sở dữ liệu của mình và thể hiện chúng thông qua các hộp kiểm được chọn và không được kiểm tra trên trang, tôi đã thêm trường ẩn cho mỗi giá trị (hộp kiểm) với các giá trị 'Y' và 'N' sau đó sử dụng các hộp kiểm chỉ để trực quan biểu diễn và sử dụng hàm JavaScript đơn giản kiểm tra () để đặt giá trị nếu theo lựa chọn.

<input type="hidden" id="N1" name="N1" value="Y" />
<input type="checkbox"<?php if($N1==='Y') echo ' checked="checked"'; ?> onclick="check(this);" />
<label for="N1">Checkbox #1</label>

sử dụng một trình nghe onclick JavaScript và kiểm tra chức năng gọi () cho mỗi hộp kiểm trên trang web của tôi:

function check(me)
{
  if(me.checked)
  {
    me.previousSibling.previousSibling.value='Y';
  }
  else
  {
    me.previousSibling.previousSibling.value='N';
  }
}

Bằng cách này, các giá trị 'Y' hoặc 'N' luôn được gửi đến tập lệnh phía máy chủ, nó biết các trường nào cần được cập nhật và không cần chuyển đổi giá trị checbox "on" thành 'Y' hoặc không nhận được hộp kiểm thành 'N' '.

LƯU Ý: khoảng trắng hoặc dòng mới cũng là anh chị em nên ở đây tôi cần .preinglySibling.preinglySibling.value. Nếu không có khoảng cách giữa thì chỉ có .preinglySibling.value


Bạn không cần phải thêm rõ ràng trình nghe onclick như trước đây, bạn có thể sử dụng thư viện jQuery để tự động thêm trình nghe nhấp chuột với chức năng để thay đổi giá trị cho tất cả các hộp kiểm trong trang của bạn:

$('input[type=checkbox]').click(function()
{
  if(this.checked)
  {
    $(this).prev().val('Y');
  }
  else
  {
    $(this).prev().val('N');
  }
});

1

Tất cả các câu trả lời đều tuyệt vời, nhưng nếu bạn có nhiều hộp kiểm trong một biểu mẫu có cùng tên và bạn muốn đăng trạng thái của mỗi hộp kiểm. Sau đó, tôi đã giải quyết vấn đề này bằng cách đặt một trường ẩn với hộp kiểm (tên liên quan đến những gì tôi muốn).

<input type="hidden" class="checkbox_handler" name="is_admin[]" value="0" />
<input type="checkbox" name="is_admin_ck[]" value="1" />

sau đó kiểm soát trạng thái thay đổi của hộp kiểm bằng mã jquery bên dưới:

$(documen).on("change", "input[type='checkbox']", function() {
    var checkbox_val = ( this.checked ) ? 1 : 0;
    $(this).siblings('input.checkbox_handler').val(checkbox_val);
});

bây giờ khi thay đổi bất kỳ hộp kiểm nào, nó sẽ thay đổi giá trị của trường ẩn liên quan. Và trên máy chủ, bạn chỉ có thể nhìn vào các trường ẩn thay vì các hộp kiểm.

Hy vọng điều này sẽ giúp ai đó có loại vấn đề này. vui lên :)


1

Vấn đề với các hộp kiểm là nếu chúng không được kiểm tra thì chúng không được đăng cùng với mẫu của bạn. Nếu bạn chọn hộp kiểm và đăng một biểu mẫu, bạn sẽ nhận được giá trị của hộp kiểm trong biến $ _POST mà bạn có thể sử dụng để xử lý biểu mẫu, nếu không được chọn, sẽ không có giá trị nào được thêm vào biến $ _POST.

Trong PHP, thông thường bạn sẽ khắc phục được vấn đề này bằng cách thực hiện kiểm tra hiện tại () trên phần tử hộp kiểm của bạn. Nếu phần tử mà bạn mong đợi không được đặt trong biến $ _POST thì chúng tôi biết rằng hộp kiểm không được chọn và giá trị có thể sai.

if(!isset($_POST['checkbox1']))
{
     $checkboxValue = false;
} else {
     $checkboxValue = $_POST['checkbox1'];
}

Nhưng nếu bạn đã tạo một hình thức động thì bạn sẽ không biết thuộc tính tên của các hộp kiểm của mình, nếu bạn không biết tên của hộp kiểm thì bạn không thể sử dụng chức nănget để kiểm tra xem cái này có được gửi không biến $ _POST.


1
function SubmitCheckBox(obj) {
     obj.value   = obj.checked ? "on" : "off";
     obj.checked = true;
     return obj.form.submit();
}

<input type=checkbox name="foo" onChange="return SubmitCheckBox(this);">

0

Có một cách giải quyết tốt hơn. Trước hết chỉ cung cấp thuộc tính tên cho những hộp kiểm tra được chọn. Sau đó, khi nhấp submit, thông qua JavaScript, functionbạn kiểm tra tất cả các hộp không được chọn. Vì vậy, khi bạn submitchỉ những người sẽ được lấy trong form collectionnhững người có nametài sản.

  //removing name attribute from all checked checkboxes
                  var a = $('input:checkbox:checked');
                   $(a).each(function () {
                       $(this).removeAttr("name");        
                   });

   // checking all unchecked checkboxes
                   var b = $("input:checkbox:not(:checked)");
                   $(b).each(function () {
                       $(this).attr("checked", true);
                   });

Ưu điểm: Không cần tạo thêm các hộp ẩn và thao tác với chúng.


0

@cpburnz hiểu đúng nhưng với nhiều mã, đây là ý tưởng tương tự sử dụng ít mã hơn:

JS:

// jQuery OnLoad
$(function(){
    // Listen to input type checkbox on change event
    $("input[type=checkbox]").change(function(){
        $(this).parent().find('input[type=hidden]').val((this.checked)?1:0);
    });
});

HTML (lưu ý tên trường bằng tên mảng):

<div>
    <input type="checkbox" checked="checked">
    <input type="hidden" name="field_name[34]" value="1"/>
</div>
<div>
    <input type="checkbox">
    <input type="hidden" name="field_name[35]" value="0"/>
</div>
<div>

Và đối với PHP:

<div>
    <input type="checkbox"<?=($boolean)?' checked="checked"':''?>>
    <input type="hidden" name="field_name[<?=$item_id?>]" value="<?=($boolean)?1:0?>"/>
</div>

0

Phiên bản jQuery của câu trả lời của @ vishnu.

if($('#testName').is(":checked")){
    $('#testNameHidden').prop('disabled', true);
}

Nếu bạn đang sử dụng jQuery 1.5 trở xuống, vui lòng sử dụng hàm .attr () thay vì .prop ()


0

Giải pháp này được lấy cảm hứng từ một @ desw's.

Nếu tên đầu vào của bạn theo "kiểu biểu mẫu", bạn sẽ mất liên kết chỉ mục mảng với các giá trị chekbox ngay khi một chekbox được chọn, tăng "phân ly" này thêm một đơn vị mỗi khi kiểm tra chekbox. Đây có thể là trường hợp của một hình thức để chèn một cái gì đó như nhân viên được sáng tác bởi một số trường, ví dụ:

<input type="text" name="employee[]" />
<input type="hidden" name="isSingle[] value="no" />
<input type="checkbox" name="isSingle[] value="yes" />

Trong trường hợp bạn chèn ba nhân viên cùng một lúc và người thứ nhất và người thứ hai là độc thân, bạn sẽ kết thúc với một isSinglemảng 5 phần tử , do đó, bạn sẽ không thể lặp lại cùng một lúc thông qua ba mảng để, ví dụ , chèn nhân viên vào cơ sở dữ liệu.

Bạn có thể khắc phục điều này với một số xử lý hậu kỳ mảng dễ dàng. Tôi đang sử dụng PHP ở phía máy chủ và tôi đã làm điều này:

$j = 0;
$areSingles = $_POST['isSingle'];
foreach($areSingles as $isSingle){
  if($isSingle=='yes'){
    unset($areSingles[$j-1]);
  }
  $j++;
}
$areSingles = array_values($areSingles);

0

Vì vậy, giải pháp này là quá mức cần thiết cho câu hỏi này, nhưng nó đã giúp tôi khi tôi có cùng một hộp kiểm xảy ra nhiều lần cho các hàng khác nhau trong một bảng. Tôi cần biết hàng hộp kiểm được đại diện và cũng biết trạng thái của hộp kiểm (được chọn / không được chọn).

Những gì tôi đã làm là loại bỏ thuộc tính name khỏi các đầu vào hộp kiểm của tôi, cung cấp cho chúng tất cả cùng một lớp và tạo một đầu vào ẩn có thể chứa tương đương JSON của dữ liệu.

HTML

 <table id="permissions-table">
    <tr>
	<td>
	    <input type="checkbox" class="has-permission-cb" value="Jim">
	    <input type="checkbox" class="has-permission-cb" value="Bob">
	    <input type="checkbox" class="has-permission-cb" value="Suzy">
	</td>
    </tr>
 </table>
 <input type="hidden" id="has-permissions-values" name="has-permissions-values" value="">

Javascript để chạy trên biểu mẫu gửi

var perms = {};
$(".has-permission-checkbox").each(function(){
  var userName = this.value;
  var val = ($(this).prop("checked")) ? 1 : 0
  perms[userName] = {"hasPermission" : val};
});
$("#has-permissions-values").val(JSON.stringify(perms));

Chuỗi json sẽ được truyền với biểu mẫu là $ _POST ["has-allow-results"]. Trong PHP, giải mã chuỗi thành một mảng và bạn sẽ có một mảng kết hợp có mỗi hàng và giá trị đúng / sai cho mỗi hộp kiểm tương ứng. Sau đó, rất dễ dàng để đi qua và so sánh với các giá trị cơ sở dữ liệu hiện tại.

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.