2012-01-30 3 views
0

모든 질문에 답변 여부를 확인하고 "답변 필요합니다"메시지를 표시하고 싶습니다. 각 질문에 YES 및 NO 라디오 버튼이 있습니다.대답이없는 질문 (라디오 버튼) JQuery

다음 코드 조각은 라디오 단추 중 하나가 선택되어 있어도 모든 질문에 대해 "답변이 필요합니다"를 배치합니다. 그러나 라디오 버튼이나 해당 질문에 대해 선택하지 않은 경우 메시지를 표시하려고합니다.

$('input:radio').not(':checked').closest('td').next().html("Answer is Required"); 

HTML :

<table border="0"> 
    <tr> 
     <td class="TextBold">1.</td> 
     <td class="TextBold" align="left" valign="middle">Content of Question 1 :</td> 
     <td class="TextBold" align="left" valign="middle"> 
      <table id="ctl00_DefaultContent_ctl01" border="0"> 
       <tr> 
        <td> 
         <input id="ctl00_DefaultContent_ctl01_0" type="radio" name="ctl00$DefaultContent$ctl01" value="Yes" /> 
         <label for="ctl00_DefaultContent_ctl01_0">Yes</label> 
        </td> 
        <td> 
         <input id="ctl00_DefaultContent_ctl01_1" type="radio" name="ctl00$DefaultContent$ctl01" value="No" /> 
         <label for="ctl00_DefaultContent_ctl01_1">No</label> 
        </td> 
       </tr> 
      </table> 
     </td> 
     <td class="TextBold" align="left" valign="middle"></td> 
    </tr> 
</table> 

제발 조언. 사전

BB

+1

HTML 구조를 게시하고 http://jsfiddle.net/ 데모를 만드는 것이 매우 유용 할 것입니다. –

+0

오 이런, 진지하게? jsFiddle에서 작동하는 솔루션이 있지만 미친 중첩 테이블에서는 제대로 작동하지 않습니다. –

+0

요르단은 해결책을 공유 할 수 있습니까? – BumbleBee

답변

1

오른쪽, 중첩 된 테이블 구조에 대한 몇 가지 수당 후, 중요한 비트가 :

$('table td:has(table)') 
    .has('input:radio:not(:checked)') // Contains unchecked radios 
    .not(':has(input:radio:checked)') // Doesn't contain checked radios 
    .next() 
    .html("Answer is required"); 
; 

데모 : http://jsfiddle.net/euN2Z/2/

(I 오래된 검증 메시지를 취소 할 수있는 데모 라인을 추가했습니다; 이것은 귀하의 요구 사항에 따라 유용 할 수 있습니다.)

이런 식으로 HTML을 사용하는 것에 대해 많은 동의을 표합니다. 당신이 할 수 있다면, 당신은 그것을 단순화하도록 준비해야합니다. 중첩 된 테이블은 특히 DOM을 사용하여 작업 할 때 매우 유감 스럽습니다. 그리고 사소한 변화로 인해 전체가 눈부시게 날아 갈 수 있습니다.

더 많은 테이블이있는 더 큰 페이지의 일부인 것으로 추측됩니다. 예를 들어 질문을 포함하는 테이블을 식별하는 것이 좋습니다. id 속성을 사용하고 그에 따라 선택기를 업데이트하십시오.

+0

Joradan $ ('table tr td.TextBold : last-child')의 목적은 무엇입니까? – BumbleBee

+0

@BumbleBee 링크 바로 뒤에있는 괄호 안의 참고 사항을 확인하십시오. 유효성 검사 메시지를 다시 확인하기 전에 지우는 데 사용되며,이 코드를 사용하는 방법에 따라 필요하지 않을 수도 있습니다. –

0

에서

덕분에 당신의 HTML의 구조를 모른 채

$('input[type=radio]') 
+0

이러한 종류의 선택기는 피해야하지만 둘 다 동일해야합니다. –

+0

사실, 약간의 차이가 있습니다 :': radio'는 jQuery 확장으로, 최신 브라우저에서는'querySelectorAll'을 이용할 수 없기 때문에'[type = "radio"]'보다 약간 성능이 떨어집니다. 이 선택기에 대한 설명서의 참고 사항을 참조하십시오. http://api.jquery.com/radio-selector/ –

1

으로

$('input:radio') 

를 교체 시도는, 명확한 대답을하기 어렵다 하지만이게 작동해야한다고 생각합니다 :

$('td').not(function() { 
    var $radios = $(this).find('input[type="radio"]'); 
    return $radios.length === 0 || $radios.filter(':checked').length > 0; 
}).next().html("Answer is Required"); 

업데이트 : 중첩 테이블을 사용하면 조금 더 까다로울 수 있습니다. 난 당신이 그들 중 하나를 제거 (스타일링을위한 테이블을 사용하여 어쨌든 이동입니다) 또는 선택할 수있는 옵션을 포함하는 테이블 셀 (전체 중첩 테이블)에 클래스를 추가하는 것이 좋습니다 쉽게 그들을 선택할 수 있습니다 .

+0

감사합니다. 모든 컨트롤이 동적으로 생성되고 있습니다. 컨트롤이 많지 않습니다. 게시 한 코드가 내 문제를 해결하지 못했습니다. – BumbleBee

+0

이것도 좋은 접근 방법이었습니다. 나는 함수와 함께'.not()'을 사용하는 것을 고려했다. 그러나': has' 선택자는 좀 더 깔끔하게 보였다. 그리고 네가 말했듯이, 중첩 된 테이블은 모든 것을 지옥에 버린다. : –

+0

@BumbleBee : 최악의 경우, 선택자로'td : has (table)'을 사용할 수 있습니다. –