Lặp qua các hộp kiểm và đếm từng hộp được chọn hoặc bỏ chọn


82

Tôi gặp một chút vấn đề. Đây là một lời giải thích ngắn gọn.

Tôi có 12 hộp kiểm trên một mẫu chuẩn. Những gì tôi cần làm là lặp lại từng thứ và tìm hiểu xem cái nào được kiểm tra và cái nào chưa được kiểm tra.

Sử dụng điều này, sau đó tôi có thể xây dựng một chuỗi mà sau đó tôi nhập vào trường cơ sở dữ liệu. Đây là một ví dụ.

(Kiểm tra1 - đã kiểm tra)
(Kiểm tra2 - chưa kiểm tra)
(Kiểm tra3 - đã kiểm tra)

1,0,1

Cho đến nay, tôi đã có đoạn mã này.

$('input[type=checkbox]').each(function () {
           if (this.checked) {
               console.log($(this).val()); 
           }
});

Nó hoạt động hoàn hảo ngoại trừ việc nó chỉ trả lại những cái đã kiểm tra, không phải tất cả.

Xin lỗi vì câu hỏi mới. Tôi là người mới sử dụng jquery.


5
Bạn nên thiết kế lại lược đồ cơ sở dữ liệu của mình.
SLaks

Thiết kế lại như thế nào? Không phải lưu trữ một nhóm hộp kiểm trong một trường tốt hơn là có một trường cho mỗi hộp kiểm?
Richard M

4
Điều này rõ ràng phụ thuộc vào hộp kiểm là gì, nhưng bạn có thể nên sử dụng các trường riêng lẻ hoặc một bảng con (với một trường trên mỗi hàng trên mỗi hộp kiểm [đã chọn])
SLaks 27/12/09

"Không phải lưu trữ một nhóm hộp kiểm trong một trường tốt hơn là có một trường cho mỗi hộp kiểm?" Không, bởi vì những cái và số không của bạn không được lưu trữ dưới dạng bit, chúng được lưu trữ dưới dạng byte. Nếu lý do của bạn để lưu trữ danh sách bit-giá trị được phân tách bằng dấu phẩy trong một trường là vì hiệu quả, thì hãy mất dấu phẩy và sử dụng các thao tác bitwise và mặt nạ để thay thế. Mặc dù, mysql ngày nay đã triển khai kiểu dữ liệu bit, vì vậy bitwise và mask có thể không cần thiết, trừ khi bạn đang lập trình chip thẻ tín dụng hoặc bạn cần thứ gì đó cực kỳ nhanh.
Blue Water

Câu trả lời:


126

Để tạo chuỗi kết quả chính xác theo định dạng bạn hiển thị, bạn có thể sử dụng điều này:

var sList = "";
$('input[type=checkbox]').each(function () {
    sList += "(" + $(this).val() + "-" + (this.checked ? "checked" : "not checked") + ")";
});
console.log (sList);

Tuy nhiên, tôi đồng ý với @SLaks, tôi nghĩ bạn nên xem xét lại cấu trúc mà bạn sẽ lưu trữ nó trong cơ sở dữ liệu của mình.

CHỈNH SỬA : Xin lỗi, tôi đã đọc sai định dạng đầu ra mà bạn đang tìm kiếm. Đây là một bản cập nhật:

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);

1
Theo tôi hiểu, anh ấy muốn một chuỗi trên 1s và 0s.
SLaks

Cảm ơn. Tôi sẽ thử điều này và cho bạn biết.
Richard M

Hừ! Tôi đã thử điều này, nhưng nó hiển thị toàn bộ tệp js trong nhật ký bảng điều khiển.
Richard M

1
Tôi không thể sử dụng này nhưng nhu cầu sử dụng $ (this)
V-nhút nhát

1
@ Si8 - Tôi đã cập nhật fiddle, vì vậy mã bỏ qua các hộp kiểm chưa được chọn, điều này sẽ làm giảm bớt các dấu phẩy thừa: jsfiddle.net/m4k6vj8x
Ed Schembor

61

Sử dụng Bộ chọn

Bạn có thể nhận được tất cả các hộp kiểm đã chọn như sau:

var boxes = $(":checkbox:checked");

Và tất cả không được kiểm tra như thế này:

var nboxes = $(":checkbox:not(:checked)");

Bạn chỉ có thể lướt qua một trong hai bộ sưu tập này và lưu trữ những cái tên đó. Nếu bất kỳ điều gì không có, bạn biết nó đã được kiểm tra hoặc chưa được kiểm tra. Trong PHP, nếu bạn có một mảng tên đã được chọn, bạn có thể chỉ cần thực hiện một in_array()yêu cầu để biết liệu có nên chọn hộp cụ thể nào vào một ngày sau đó hay không.

Serialize

jQuery cũng có một phương thức tuần tự hóa sẽ duy trì trạng thái của các điều khiển biểu mẫu của bạn. Ví dụ, ví dụ được cung cấp trên trang web của jQuery như sau:

single=Single2&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio2

Điều này sẽ cho phép bạn giữ thông tin về những yếu tố đã được kiểm tra.


16

Bạn có thể lặp lại tất cả các hộp kiểm bằng cách viết $(':checkbox').each(...).

Nếu tôi hiểu đúng câu hỏi của bạn, bạn đang tìm mã sau:

var str = "";

$(':checkbox').each(function() {
    str += this.checked ? "1," : "0,";
});

str = str.substr(0, str.length - 1);    //Remove the trailing comma

Mã này sẽ lặp qua tất cả các hộp kiểm và thêm một trong hai 1,hoặc 0,vào một chuỗi.


Cảm ơn. Sẽ thử cái này.
Richard M

Bạn cũng có thể sử dụng thuộc tính giá trị. Nếu bạn đang cố gắng tạo một giá trị nhị phân, thì hãy cung cấp cho mỗi hộp kiểm một lũy thừa là 2 và chỉ cần thêm các giá trị đã chọn lên, tổng trong hệ nhị phân sẽ giống như thêm các giá trị và số không. Bạn sẽ bị giới hạn ở 32 hộp kiểm (giá trị số lớn nhất là 2 ^ 32 trong JavaScript [tôi nghĩ, có thể là 64]. Một thiết kế cơ sở dữ liệu tốt hơn sẽ linh hoạt hơn)
Jason Sperske

0

Tôi không nghĩ rằng có đủ thời gian để chú ý đến các cân nhắc về lược đồ được đưa ra trong bài đăng gốc. Vì vậy, đây là một cái gì đó để xem xét cho bất kỳ người mới.

Giả sử bạn đã đi trước và xây dựng giải pháp này. Tất cả các giá trị menial của bạn được quy ước thành một giá trị duy nhất và được lưu trữ trong cơ sở dữ liệu. Bạn thực sự đang tiết kiệm [một chút] không gian trong cơ sở dữ liệu của mình và một chút thời gian viết mã.

Bây giờ chúng ta hãy xem xét rằng bạn phải thực hiện nhiệm vụ thường xuyên và dễ dàng là thêm một hộp kiểm mới vào giữa các hộp kiểm hiện tại 3 và 4. Người quản lý phát triển của bạn, khách hàng, bất cứ điều gì mong đợi đây là một thay đổi đơn giản.

Vì vậy, bạn thêm hộp kiểm vào giao diện người dùng (phần dễ dàng). Mã lặp của bạn sẽ nối các giá trị bất kể có bao nhiêu hộp kiểm. Bạn cũng nghĩ rằng trường cơ sở dữ liệu của bạn chỉ là một varchar hoặc kiểu chuỗi khác, vì vậy nó cũng sẽ ổn.

Điều gì xảy ra khi khách hàng hoặc bạn cố gắng xem dữ liệu từ trước khi thay đổi? Về cơ bản, bạn đang tuần tự từ trái sang phải. Tuy nhiên, bây giờ các giá trị sau 3 đều bị tắt bởi 1 ký tự. Bạn sẽ làm gì với tất cả dữ liệu hiện có của mình? Bạn có định viết một ứng dụng, kéo tất cả ra khỏi cơ sở dữ liệu, xử lý nó để thêm giá trị mặc định cho vị trí câu hỏi mới và sau đó lưu trữ tất cả lại trong cơ sở dữ liệu? Điều gì xảy ra khi bạn có nhiều giá trị mới cách nhau một tuần hoặc một tháng? Điều gì sẽ xảy ra nếu bạn di chuyển các vị trí và jQuery xử lý chúng theo một thứ tự khác? Tất cả dữ liệu của bạn đã được xử lý và phải được xử lý lại để sắp xếp lại.

Toàn bộ khái niệm KHÔNG cung cấp một mối quan hệ giá trị-khóa chặt chẽ là ludacris và sẽ khiến bạn gặp rắc rối không sớm thì muộn. Đối với những người bạn đang xem xét điều này, xin vui lòng không. Các đề xuất khác cho các thay đổi lược đồ là tốt. Sử dụng bảng con, nhiều trường hơn trong bảng chính, bảng câu hỏi-câu trả lời, v.v. Chỉ cần không lưu trữ dữ liệu không có nhãn khi cấu trúc của dữ liệu đó có thể thay đổi.


-1
$.extend($.expr[':'], {
        unchecked: function (obj) {
            return ((obj.type == 'checkbox' || obj.type == 'radio') && !$(obj).is(':checked'));
        }
    });

$("input:checked")
$("input:unchecked")
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.