2014-01-14 3 views
0

용건이 질문에 용의. 나는 꽤 많은 해결책을 겪어 왔지만 아직 나를 위해 일하지 않는다.각 루프 끊기

약 5 개의 입력란이 있는데 입력란에 임의의 문자가 있으면 (누군가 입력하고 저장하려고 시도하는 경우) 메시지에 경고가 표시됩니다.

지금까지 하나를 발견하면 경고하지만 그 다음에 가서 저장합니다.

each() 루프를 벗어나려고 할 때 false가 반환되지 않습니다.

더 나은 해결책은 또한 평가 될 것이다.

Fiddle here

// Illegal Character Check 
$('.illegal-check').click(function() { 
    var illegal = /[&<>]/; 
    $(".scoring input:text").each(function() { 
     var inptStr =$(this).val(); 
     if (illegal.test(inptStr)===true) { 
      alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
      return false; 
     } 
    });//each 
});//click 
+1

'$ ('#의 answer16') click' '$ ('. illegal-check') 대신에 ' – Abhitalks

+0

'을 클릭하십시오. 이것은 양식으로서 의미가있는 경우'

'을 감싸고 제출시 처리기를 적용해야합니다. –

+2

잘 작동합니다. 여기에 콘솔 로그를 추가했습니다 - http : // jsfiddle.net/infernalbadger/T2vT9/4 /와 첫 번째 유효하지 않은 레코드 이후에 각 루프가 중지됩니다. –

답변

3
$('.illegal-check').click(function (e) { 
    ... 
    if (illegal.test(inptStr)===true) { 
     ... 
     e.preventDefault(); 
     return; 
    } 
} 

편집 : 데이터가 여전히 저장하기 이유 이유는 사용하여 루프에서 깨는거야에도 불구하고 있다는 것입니다 "false를 반환;" 데이터 제출이 아직 진행 중입니다. 당신도 그것을 취소해야합니다. 이를 위해 "preventDefault"함수를 호출하여 이벤트 처리기에 전달 된 이벤트 인수 "e"를 사용합니다.

+0

답변을 확대하고 이것이 어떻게 문제를 해결하는지 설명하면 좋을 것입니다. 코드 덤프를 제공해도 OP가 문제의 원인을 이해하는 데 도움이되지 않습니다. – musefan

+0

@musefan이 (가) 댓글을 추가했습니다. 그것은 하나의 라이너이며 코드는 자명하지만 어쨌든 그렇습니다. 뮤즈는 대단해. btw : – m1kael

0

또한 불법 값이 like this을 발견되었는지 여부를 확인하기 위해 변수를 추가 할 수 있습니다

// Illegal Character Check 
$('.illegal-check').click(function() { 
    var illegal = /[&<>]/; 
    var found = false; 
    $(".scoring input:text").each(function() { 
    var inptStr =$(this).val(); 
    if (illegal.test(inptStr)===true) { 
     alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
     found = true; 
    } 
    }); 
    if(!found){ 
    alert("Nothing has been found") 
    }else{ 
    alert("Illegal char has been found"); 
    } 
}); 
+0

-1 : 당신은 루프를 깰 유일한 것을 제거했다. 해결책이없는 제안은 답변으로 인정되지 않습니다. – musefan

0

가 개인적으로 나는이 양식 대신 테이블 셀에 클릭 이벤트에 핸들러를 제출 추가합니다.

$('form').on('submit', function(e) { 
    // ... 
    if (illegal.test(inptStr)===true) { 
     alert('...'); 
     e.preventDefault(); 
     return false; 
    } 
    // ... 

여기에서 이벤트가 함수로 전달되고 오류가 발생하면이 이벤트로 인해 실제 제출이 시작되지 않습니다.

+0

양식에 사용하지 않는 이유는 양식이 더 있고 자동으로 만들어지기 때문에 코드 측에 액세스 할 필요가 없기 때문입니다. false 또는 e.preventDefault()를 반환합니다. 그것이 의미하는 것인데도 작동하지 않습니다 ...; ( – 19eggs

+0

@ 19eggs '$ ('# answer16 '). closest ('form '). on ('submit ', ...)'을 사용할 수 있습니다. –

+0

다시 로그인 한 사용자에 따라 .. 입력이 더 많고 ID가 계속 변경 될 수 있습니다 ... – 19eggs

0

jQuery의 $.fn.each, $.each 유사은 return false와 루프의 탈옥과 비 falsy return와 다음 반복을 계속합니다. It's documented on the API site.

모든 권리는 귀하의 코드 부분에서 정상적으로 처리되어야합니다.

+0

클릭 처리기 자체가 'false를 반환해야'하므로 클릭이 전파되지 않습니다. 전달 된 이벤트에서 비슷한 메서드를 수행하십시오 –

+0

@Jack *이 코드 부분은 각 루프를 벗어나는 것과 관련이 있습니다 * 귀하의 주장은 jQuery 루프보다 이벤트 해결과 관련이 있습니다. 이것은 OP가 실제로 의미했던 것입니다. 그러나 여러분이 옳을 수도 있습니다 - 아마도 이것은 질문을 편집하여 (특히 제목) 루프를 깨는 것이 아니라는 것을 분명히합니다. – Barney

0

다음은 업데이트 된 바이올린입니다.

$('.illegal-check').click(function() { 
    if(checkIllegal()) evt.preventDefault(); 
}); 

function checkIllegal(){ 
    var illegal = /[&<>]/; 
    var isIllegal = false; 
    $(".scoring input:text").each(function() { 
     if (illegal.test($(this).val()) && !isIllegal) { 
     alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
     isIllegal = true; 
     return false; 
     } 
    }); 
    return isIllegal; 
} 

http://jsfiddle.net/T2vT9/7/

+0

바이올린에서도 작동하지만 여전히 작동하지 않습니다. .. 혼란 스럽네요. – 19eggs

+0

이벤트를 .illegal- 제출 버튼 선택자를 확인하십시오. .illegal-check 컨테이너에는 기본 동작이 없으므로 evt.preventDefault는 실제로 의미가 없습니다. 그 버튼을 제출 버튼으로 변경하면 작동 할 것입니다. – Ankur

0

return false 문은 $(...).each(...) 루프에서 벗어나 않는 별도의 함수에서 오류를 확인합니다. 문제는 그것이 계속 진행되고 저장된다는 것입니다. e.preventDefault()을 사용하여 이벤트가 기본 조치를 실행하는 것을 중지해야합니다. (참고 :이 또한 설명을 추가하지 않은 m1kael하여 코드 덤프에 언급 한)

이 코드에 그 금액 :.

// Illegal Character Check 
$('.illegal-check').click(function (e) { 
    var illegal = /[&<>]/; 
    $(".scoring input:text").each(function() { // loop over elements in form 
     var inptStr = $(this).val(); 
     if (illegal.test(inptStr)===true) { 
      alert('...'); // show alert 
      e.preventDefault(); // prevent default action on click (stop submit) 
      return false; // break out of elements loop, no more alerts needed 
     } 
    });//each 
});//click 
+0

나는 그의 대답에 대해 논평해야할지 아니면 제 자신을 추가해야하는지 의심 스러웠습니다. 그의 대답으로 전혀 설명이 없었기 때문에, 나는 실제 답변이었던 새로운 것을 만들기로 결정했다. 나는 그의 대답에 따라 코드 덤프를 추가했다. –

+0

그래서 나는 기존의 일을 언급하면서 벌을 받고있는 중입니까? 편집 : M1kael의 언급을 약간 수정했습니다 –

+0

다른 답변을 참조해서는 안됩니다. 답변을 제거하면 불완전 해집니다. 좋은 대답은 의존성없이 거기에서야합니다. – musefan