확인란을 반복하고 선택하거나 선택하지 않은 각 확인란을 계산합니다.


82

나는 약간의 문제에 부딪쳤다. 다음은 간단한 설명입니다.

표준 양식에 12 개의 확인란이 있습니다. 내가해야 할 일은 그들 각각을 반복하고 어떤 것이 확인되고 어떤 것이 선택되지 않았는지 배우는 것입니다.

이것을 사용하여 데이터베이스 필드에 입력 할 문자열을 작성할 수 있습니다. 여기에 예가 있습니다.

(Check1-선택됨)
(Check2-선택되지 않음)
(Check3-선택됨)

1,0,1

지금까지이 코드가 있습니다.

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

모두가 아닌 확인 된 항목 만 다시 가져 오는 것을 제외하고는 완벽하게 작동합니다.

새로운 질문에 대해 죄송합니다. 나는 jquery를 처음 사용합니다.


5
데이터베이스 스키마를 다시 디자인해야합니다.
SLaks

어떻게 재 설계할까요? 확인란 그룹을 하나의 필드에 저장하는 것이 각 확인란에 대해 하나의 필드를 갖는 것보다 낫지 않습니까?
Richard M

4
이것은 분명히 확인란이 무엇인지에 따라 다르지만 개별 필드 또는 하위 테이블 ([선택된] 확인란 당 행당 하나의 필드 포함)을 사용해야합니다.
SLaks

"한 필드에 확인란 그룹을 저장하는 것이 각 확인란에 대해 하나의 필드를 갖는 것보다 낫지 않습니까?" 아니요, 1과 0은 비트로 저장되지 않기 때문에 바이트로 저장됩니다. 한 필드에 쉼표로 구분 된 값 비트 목록을 저장하는 이유가 효율성 때문이라면 쉼표를 잃고 대신 비트 및 마스크 연산을 사용하십시오. 요즘 mysql은 비트 데이터 유형을 구현했기 때문에 신용 카드 칩을 프로그래밍하거나 절대적으로 빠른 속도가 필요한 경우가 아니면 비트 및 마스크가 필요하지 않을 수 있습니다.
Blue Water

답변:


126

표시 한 형식으로 정확하게 결과 문자열을 작성하려면 다음을 사용할 수 있습니다.

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

그러나 나는 @SLaks에 동의 할 것이며, 이것을 데이터베이스에 저장할 구조를 재고해야한다고 생각합니다.

편집 : 죄송합니다, 찾고 있던 출력 형식을 잘못 읽었습니다. 다음은 업데이트입니다.

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

1
내가 이해했듯이 그는 1s와 0s 에 문자열을 원합니다 .
SLaks

감사. 나는 이것을 시도하고 알려줄 것이다.
Richard M

흠. 나는 이것을 시도했지만 콘솔 로그에 전체 js 파일을 표시했습니다.
Richard M

1
내가 사용할 수 없습니다 필요하지만 사용하기 (이) $를
V-수줍어

1
- SI8 @ 코드가 선택되지 않은 체크 박스, 여분의 쉼표를 완화해야 무시 그래서 나는 바이올린을 업데이트 jsfiddle.net/m4k6vj8x
에드 Schembor

61

선택기 사용

다음과 같이 선택된 모든 확인란을 얻을 수 있습니다.

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

그리고 모두 다음과 같이 확인되지 않았습니다.

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

이러한 컬렉션 중 하나를 순환하고 해당 이름을 저장할 수 있습니다. 아무것도없는 경우 확인되었거나 확인되지 않은 것입니다. PHP에서 확인 된 이름 배열이있는 경우 in_array()나중에 특정 상자를 확인해야하는지 여부를 알기 위해 간단히 요청할 수 있습니다.

직렬화

jQuery에는 양식 컨트롤의 상태를 유지 하는 직렬화 메서드 도 있습니다 . 예를 들어, jQuery 웹 사이트에 제공된 예제는 다음과 같습니다.

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

이렇게하면 확인 된 요소에 대한 정보도 유지할 수 있습니다.


16

을 작성하여 모든 확인란을 반복 할 수 있습니다 $(':checkbox').each(...).

귀하의 질문을 올바르게 이해하면 다음 코드를 찾고 있습니다.

var str = "";

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

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

이 코드는 모든 확인란을 반복하고 1,또는 하나 0,를 문자열에 추가 합니다.


감사. 이것도 시도해 볼 것입니다.
Richard M

value 속성을 사용할 수도 있습니다. 이진 값을 만들려는 경우 각 확인란에 2의 증분 거듭 제곱을 부여하고 확인 된 값을 더하면 이진수의 합은 1과 0을 추가하는 것과 같습니다. 확인란은 32 개로 제한됩니다 (자바 스크립트에서 가장 큰 숫자 값은 2 ^ 32입니다 [제 생각에는 64 일 수 있습니다]. 더 나은 데이터베이스 디자인이 더 유연 할 것입니다.)
Jason Sperske

0

나는 원래 포스트에서 제기 된 스키마 고려 사항에 충분한 시간을 기울이지 않았다고 생각한다. 따라서 여기에 초보자를 위해 고려해야 할 사항이 있습니다.

이 솔루션을 구축했다고 가정 해 보겠습니다. 모든 정신적 가치는 단일 값으로 요약되고 데이터베이스에 저장됩니다. 실제로 데이터베이스 공간을 [약간] 절약하고 코딩 시간을 절약하고 있습니다.

이제 현재 체크 박스 3과 4 사이에 새 체크 박스를 추가하는 빈번하고 쉬운 작업을 수행해야한다고 생각해 봅시다. 개발 관리자, 고객, 어떤 것이 든 간단한 변경이 될 것으로 예상합니다.

따라서 UI에 확인란을 추가합니다 (쉬운 부분). 당신의 루핑 코드는 체크 박스의 수에 상관없이 이미 값을 연결했을 것입니다. 또한 데이터베이스 필드가 varchar 또는 기타 문자열 유형이므로 괜찮을 것입니다.

고객이나 귀하가 변경 전의 데이터를 보려고하면 어떻게됩니까? 기본적으로 왼쪽에서 오른쪽으로 직렬화합니다. 그러나 이제 3 이후의 값은 모두 1 문자만큼 떨어져 있습니다. 모든 기존 데이터로 무엇을 하시겠습니까? 응용 프로그램을 작성하고 데이터베이스에서 모두 꺼내고 새 질문 위치에 대한 기본값을 추가하도록 처리 한 다음 데이터베이스에 모두 저장 하시겠습니까? 한 주 또는 한 달 간격으로 새로운 값이 여러 개 있으면 어떻게됩니까? 위치를 이동하고 jQuery가 다른 순서로 처리하면 어떻게 될까요? 모든 데이터는 호스로 처리되며 다시 정렬하려면 다시 처리해야합니다.

긴밀한 키-값 관계를 제공하지 않는다는 전체 개념은 ludacris이며 조만간 문제에 빠질 것입니다. 이것을 고려하시는 분들은하지 마십시오. 스키마 변경에 대한 다른 제안은 괜찮습니다. 하위 테이블, 기본 테이블의 더 많은 필드, 질문-답변 테이블 등을 사용하십시오. 해당 데이터의 구조가 변경 될 수있는 경우 레이블이없는 데이터를 저장하지 마십시오.


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

$("input:checked")
$("input:unchecked")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.