2011-01-25 27 views
9

Tengo este código, pero parece que no es verdadero. La alerta siempre aparece. Cualquier idea (sin necesidad de crear una var en la que almacenar esa casilla de verificación ha sido seleccionada ya que parece un poco hacky).Jquery detener el envío de formulario a menos que haya seleccionado la casilla

Gracias.

$("#form").submit(function(e) { 
    $('input[type=checkbox]').each(function() { 
     if(this.checked){ 
      return true; 
     } 
    }); 
    alert("Please select at least one to upgrade."); 
    return false; 
}); 

Respuesta

17

No necesita hacer el ciclo para determinar si una casilla de verificación está marcada. El selector :checked filtra todo lo que no está marcado. Luego puede usar $.length para obtener un conteo de las entradas marcadas.

$("#form").submit(function(e) { 
    if(!$('input[type=checkbox]:checked').length) { 
     alert("Please select at least one to upgrade."); 

     //stop the form from submitting 
     return false; 
    } 

    return true; 
}); 

Además, la utilización de su enfoque, un pequeño cambio debería hacer este trabajo

$("#form").submit(function(e) { 
    $('input[type=checkbox]').each(function() { 
     if($(this).is(':checked')){ 
      return true; 
     } 
    }); 
    alert("Please select at least one to upgrade."); 
    return false; 
}); 

Creo que es posible que simplemente echa en falta la $() alrededor this

+0

Gracias. Una buena solución limpia. Busqué tu propia versión, ya que parece más legible. – edwardmlyte

+0

Me encontré con un problema recientemente donde e.preventDefault() no funciona con Firefox. Con algunas investigaciones, encontré que devolver verdadero o falso hará lo mismo y es más ampliamente aceptado. He alterado mi respuesta para reflejar este enfoque. – Josh

0

Ejemplo de comprobar el número de checboxes controladas ...

<script> 

    function countChecked() { 
     var n = $("input:checked").length; 
     $("div").text(n + (n <= 1 ? " is" : " are") + " checked!"); 
    } 
    countChecked(); 
    $(":checkbox").click(countChecked); 

</script> 

Por encima de "$ (" Entrada: marcado ")" devuelve el conjunto de elementos seleccionados ... Usted puede marcar la casilla " length "de esta matriz por ser> 0.

+0

Me parece un poco redundante hacer esto si ya estoy bucleando la matriz con jquery. Pero entiendo tu punto, esperaba poder continuar enviando si al menos uno está marcado. – edwardmlyte

3

Solo para señalar, está utilizando la referencia de id #form. ¿Quiso referirse simplemente a todos los formularios, o tiene el formulario el ID form?

+0

Tiene una identificación diferente, que es a lo que realmente me refiero. Lo acabo de cambiar para simplificar. – edwardmlyte

0

Código de clic y entrar en el botón de envío :

$(":input").bind("click keypress", function(evt) { 
    var keyCode = evt.which || evt.keyCode; 
    var sender = evt.target;     
    if (keyCode == 13 || sender.type == "submit") {       
     evt.preventDefault(); 
     // add your validations 
    } 
    // and submit the form 
} 
-1
var atleast = 1; 
function validate() { 
    debugger; 
    var CHK = document.getElementById("<%=chk1"); 
    var checkbox = document.getElementsByTagName("input"); 
    var counter = 0; 
    for (var i = 0; i < checkbox.length; i++) { 
     if (checkbox[i].checked) { 
      counter++; 
     } 
    } 
    if (atleast > counter) { 
     alert("Please select atleast " + atleast + " employee "); 
     return false; 
    } 
    return true; 
} 

<button type="submit" name="Initiate" value="Initiate" on click="return validate()" id=" initiate"></button> 
+0

Revise [cómo escribir una buena respuesta] (http://stackoverflow.com/help/how-to-answer). Agregue algunas referencias y explique por qué su respuesta es la que la gente debería escuchar. –

Cuestiones relacionadas