2011-04-10 2 views
3

먼저이 코드를 살펴보십시오. 예 필요한 클래스가있는 5 개의 입력 필드가 있습니다.jquery는 각각 경고 발생을 방지합니다.

var errMsg = "This is required!" 

$(function() { 
    $(".required").each(function() { 
     if($(this).val() == "" || $(this).val == errMsg) { 
     $(this).val(errMsg); 
     } 
     else { 
     alert("This should alert once"); 
     } 
    }); 
} 

필드에 값이 있으면 5 번 경고합니다. 어떻게 방지 할 수 있습니까? 한 번 경고 할 수있는 방법은 무엇입니까? 이미 사용 중입니다.

event.stopImmediatePropagation 
event.preventDefault 
+0

당신은 할 수 있습니다에'$ 빈 문자열로 비교하기 전에 값 .trim' :'$ .trim ($ (이) .val());'. – karim79

답변

4

당신이하려는 일이 완전히 명확하지 않습니다. 두 가지 옵션 :

  1. each 루프를 정지 :

    당신은 false를 반환하여 each 루프를 중지 할 수 있습니다

    var errMsg = "This is required!" 
    
    $(function() { 
        $(".required").each(function() { 
         if($(this).val() == "" || $(this).val == errMsg) { 
         $(this).val(errMsg); 
         } 
         else { 
         alert("This should alert once"); 
         return false; // <=== Stop `each` 
         } 
        }); 
    } 
    

    은 자세한 내용 the documentation를 참조하십시오. ,

    var errMsg = "This is required!" 
    
    $(function() { 
        var alerted = false; 
        $(".required").each(function() { 
         if($(this).val() == "" || $(this).val == errMsg) { 
         $(this).val(errMsg); 
         } 
         else { 
         if (!alerted) { 
          alerted = true; 
          alert("This should alert once"); 
         } 
         } 
        }); 
    } 
    

    (계속 루프를시키는)이 일을하는 경우 : 당신이 루프가 계속하려면

    만에 alert 한 번 일어날를 들어, 플래그를 사용 :

  2. 는 플래그를 설정 Guffa's answer을 참조하십시오. 그는 each 외부로 경고 메시지를 전송 했으므로 메시지를보다 유연하게 전달할 수 있으며 더 단순합니다.


오프 주제 : 때마다 당신이 $() 전화, 그것은 3-4 함수 호출을하고 메모리를 할당합니다. 함수에서 동일한 $()을 반복하는 경우, 을 한 번으로 다시 작성하고 다시 사용하는 것을 고려하십시오. 그래서 대신 :

if($(this).val() == "" || $(this).val == errMsg) { 
    $(this).val(errMsg); 
} 

할이

var $this = $(this); 
if($this.val() == "" || $this.val == errMsg) { 
    $this.val(errMsg); 
} 

은 문제가 많은 당신이 배의 일 수천을 수행하지 않습니다하지 않으므로 대부분의 시간,하지만 얻을 수있는 좋은 습관 으로. 분명히, ...

+0

그러면 첫 번째 빈 필드에만 메시지를 넣습니다. – Guffa

+0

@Guffa : 예, 루프를 계속하고 두 번째 옵션을 추가 할 수 있음을 알았 기 때문에 댓글을 달았습니다. –

1
$(function() { 
    $(".required").each(function() { 
     if($(this).val() == "" || $(this).val == errMsg) { 
     $(this).val(errMsg); 
     } 
     else { 
     alert("This should alert once"); 
     return false; // break the loop; 
     } 
    }); 
} 
+0

감사 ... 이것은 내가보고있는 것입니다 (y) – blinkTest

+1

그러면 첫 번째 빈 필드에만 메시지가 표시됩니다. – Guffa

1

사용 플래그를 사용하면 DOM 쿼리를 수행하는 경우 하지 캐시 결과를 수행하고, DOM은 하나의 호출과 다음 사이에 변경되었을 수 있습니다.
이 방법, 당신은 메시지를 경고 한 후 루프를 깰 실 거예요하지만, 한 번만 경고 :

var errMsg = "This is required!" 

$(function() { 
    var ok = true; 
    $(".required").each(function() { 
     if($(this).val() == "" || $(this).val == errMsg) { 
      $(this).val(errMsg); 
     } 
     else { 
      if(ok){ 
       alert("This should alert once"); 
       ok = false; 
      } 
     } 
    }); 
} 
2

당신은 루프 외부에 경고를 넣어해야하고 거기 여부를 추적하기 위해 가변적이고 필요 빈 필드 :

var errMsg = "This is required!" 

$(function() { 
    var showMsg = false; 
    $(".required").each(function() { 
     if($(this).val() == "" || $(this).val == errMsg) { 
     $(this).val(errMsg); 
     } else { 
     showMsg = true; 
     } 
    }); 
    if (showMsg) alert("This should alert once"); 
} 
+0

누군가가 이것이 어떻게 작동하는지 이해한다면, 이것이 올바른 해결책입니다. 다른 이들은 경고가 $. 루프 외부에 있어야한다는 사실을 놓치고있다. –

+0

@Bobby : 나는 Guffa의 솔루션이 훌륭하다고 동의한다. 그러나 OP의 질문에는 아무것도 없다. 경고가 루프 외부에 있습니다. (이것은 질문이 모두 명확하지 않기 때문일 수 있습니다.) 그래도 이것이 올바른 접근 방법입니다. OP는 무효 필드 계산 및 계산을 고려할 수도 있습니다. (그리고 '경고'를 사용하지는 않지만 완전히 다른 것입니다.) –

관련 문제