2012-04-03 2 views
0

적어도 하나의 체크 박스가 있는지 확인하기 위해이 간단한 스크립트를 사용하고 싶습니다만, getElementsByName 태그에서 뭔가 잘못되었다는 느낌이 들었습니다. 항목을 체크했는지 여부와 관계없이 항상 팝업 상자가 나타납니다.javascript multiple checkbox 유효성 확인

<script language="javascript"> 
function validate() { 
    var chks = document.getElementsByName('id[][]'); 
    var hasChecked = false; 
    for (var i = 0; i < chks.length; i++) { 
     if (chks[i].checked) { 
      hasChecked = true; 
      break; 
     } 
    } 
    if (hasChecked == false) { 
     alert("Please select at least one."); 
     return false; 
    } 
    return true; 
} 
</script> 

및 이상 결국 체크 박스와 끝까지하지 않을 수도 있습니다 형태 : 코멘트, 당신은 수도 말처럼 어쩌면 getElementsByTagName

var chks = document.getElementsByTagName('input'); 
for (var i in chks) 
{ 
    if (chks[i].getAttribute('type') == "checkbox") 
    { 
     if (chks[i].checked) 
     hasChecked = true; 
    } 
} 

를 사용

<form 
enctype="multipart/form-data" 
method="post" 
action="formsubmission.php" 
name="form_type" onSubmit="return validate()"> 

<input id="attrib-8-10" type="checkbox" value="10" name="id[8][10]"> 
<label class="Checkbox" for="attrib-8-10">thick</label> 
<input id="attrib-8-11" type="checkbox" value="11" name="id[8][11]"> 
<label class="Checkbox" for="attrib-8-11">medium</label> 
<input id="attrib-8-12" type="checkbox" value="12" name="id[8][12]"> 
<label class="Checkbox" for="attrib-8-12">thin</label> 
+0

선택기를'document.getElementsByName ("id")'로 변경하고 모든 입력 이름을 "id"로 변경하면 작동하는 것 같습니다. 왜 문제가 원래 발생 했습니까? 나는 잘 모르겠다. 나는 그것이 작동한다는 것을 알고있다. 다른 누군가가 이유를 설명하는 답변을 게시 해 주시길 바랍니다. – rcplusplus

+0

'name' 속성을 이렇게 지정하는 특별한 이유가 있습니까? 대부분의 서버 측 언어는 당신이 배열을 다루는 양식 요소를 원한다는 사실을 인덱스를 지정할 필요가 없습니다 (이 경우'id []'를 사용합니다) –

+0

아래의 mamadrood의 게시물에 대한 내 답변을 참조하십시오 . – skylab

답변

0

웹 사이트에 다른 확인란을 추가하면 코드가 손상 될 수 있으므로 속성 유형을 확인하지 마십시오. 이

<input id="attrib-8-10" type="checkbox" value="10" name="id[8][10]"> 

<input id="attrib-8-10" type="checkbox" value="10" class="checkable" name="id[8][10]"> 

함으로써 그런 다음 "유효성 검사"코드는 다음과 같이한다

변경합니다.

var chks = document.getElementsByName('id[][]'); 

HTML 요소의 id 속성이 고유하기위한 것입니다, 당신은 다음과 같습니다

var chks = document.getElementsByTagName('input'); 
for (var i in chks) 
{ 
    if (chks[i].getAttribute('type') == "checkbox" && chks[i].className == "checkable") 
    { 
     if (chks[i].checked) 
     hasChecked = true; 
    } 
} 
+0

이것은 그의 간단한 예제에서 작동하지만, 페이지에 다른'input' 엘리먼트가 있다면 (다른 비 관련 체크 박스를 포함해서) 이것은 나쁜 행동을 일으킬 것입니다. 'name' 속성을 모든 관련 체크 박스와 일치하도록 변경하는 것이 이것을 해결하는 유일한 방법입니다. –

+0

네, 물론,이 확인란에 클래스를 추가하고 타입 속성 대신이 클래스를 확인하면 트릭을 할 수 있습니다. 자신의 게시물 요청에 특별한 이름 값이 필요한 경우 가능합니다. – mamadrood

+0

다시 간단한 예제로도 효과가있을 수 있지만, 디자이너 (또는 디자이너 일 수도 있음)가 다른 클래스를 추가하면 코드가 나쁜 동작을 일으킬 수 있습니다. 이름에 따라 name 속성을 지정해야 할 수도 있지만, 그런 요구 사항은 매우 드뭅니다. 아마 skylab이 chime을 할 경우 ... –

1

이 줄은 범인이다. name 속성은 요소를 논리적으로 그룹화하기위한 것입니다 (특히 확인란 및 라디오 버튼의 경우).

함께 그룹화하려면 이름이 동일해야합니다. id[8][10]id[8][11]과 같지 않으며 document.getElementsByName('id[][]')을 호출하면 말 그대로 "id [] []"라는 요소가 필요합니다.

당신은 일치 무언가, 즉 "checkboxGroup을"로 요소의 이름을 변경 한 다음 요소의 모든 인덱스를 specied대로

0
var chks = document.getElementsByName('id[][]'); 

document.getElementsByName('checkboxGroup')는, 모든 요소를 ​​선택하지 않습니다 사용해야합니다.

어떻게 할 수 있습니까?

var chks= document.getElementsByTagName('input'); 
for (var x=0; x < chks.length; x++) { 
    if (chks[x].type.toUpperCase()=='CHECKBOX' && chks[x].checked == true) { 
     hasChecked = true; 
     break; 
    } 
} 
+0

mamadrood의 게시물에서 말했듯이, "이것은 그의 간단한 예제에서 작동하지만, 페이지에 다른 입력 요소가 있다면 (관련없는 다른 확인란 포함) 나쁜 행동을 일으킬 것입니다. 관련된 모든 확인란에서 일치하도록 name 속성을 변경하면 이 문제를 해결할 수있는 유일한 방법. " –