2012-07-12 11 views
12

Estoy usando la siguiente secuencia de comandos para seleccionar todas las casillas con una clase dada.Jquery seleccionar todo si no está deshabilitado

$(document).ready(function(){ // 1 
    // 2 
    $(':checkbox.selectall').on('click', function(){ 
     // 3 
     $(':checkbox[class='+ $(this).data('checkbox-name') + ']').prop("checked", $(this).prop("checked")); 
     $(':checkbox[class='+ $(this).data('checkbox-name') + ']').trigger("change"); 
    }); 

}); 

Sin embargo estoy teniendo un problema como el de/seleccionar todo casilla es capaz de DE/seleccione las casillas de verificación que son discapacitados.

yo probamos este

$(document).ready(function(){ // 1 
    // 2 
    $(':checkbox.selectall').on('click', function(){ 
     // 3 
     $(':checkbox[class='+ $(this).data('checkbox-name') + !$(:disabled) + ']').prop("checked", $(this).prop("checked")); 
     $(':checkbox[class='+ $(this).data('checkbox-name') + !$(:disabled) + ']').trigger("change"); 
    }); 

}); 

Pero no funciona. He creado jsfiddle para mostrar el problema http://jsfiddle.net/e67Fv/

Respuesta

24

Hm ... intento interresting, pero no se puede utilizar un objeto jQuery dentro de un selector, ya que el selector es sólo una cadena sin formato .

El selector para excluir los elementos deshabilitados habría :not(:disabled), por lo que el código debe ser:

$(document).ready(function(){ 
    $(':checkbox.selectall').on('click', function(){ 
    $(':checkbox[class='+ $(this).data('checkbox-name') + ']:not(:disabled)').prop("checked", $(this).prop("checked")); 
    $(':checkbox[class='+ $(this).data('checkbox-name') + ']:not(:disabled)').trigger("change"); 
    }); 
}); 

Nota que pueda llamadas de cadena, por lo que no tiene que seleccionar los elementos en dos ocasiones:

$(document).ready(function(){ 
    $(':checkbox.selectall').on('click', function(){ 
    $(':checkbox[class='+ $(this).data('checkbox-name') + ']:not(:disabled)').prop("checked", $(this).prop("checked")).trigger("change"); 
    }); 
}); 
8

Utilice una combinación de las funciones .not() y :disabled para excluirlas.

$(':checkbox[class='+ $(this).data('checkbox-name') + ']').not(':disabled').prop("checked", $(this).prop("checked")); 
$(':checkbox[class='+ $(this).data('checkbox-name') + ']').not(':disabled').trigger("change"); 

.not() existe también como un selector como :not() y podría ser utilizado de la siguiente manera:

$(':checkbox[class='+ $(this).data('checkbox-name') + ']:not(:disabled)').prop("checked", $(this).prop("checked")); 
$(':checkbox[class='+ $(this).data('checkbox-name') + ']:not(:disabled)').trigger("change"); 
3

Esto es lo que suele hacer:

$(function(){ 
    $(".selectall").live('change', function(){ 
     if($(this).is(":checked")) 
     { 
      $("input:checkbox:not(:disabled)." + $(this).data('checkbox-name')).prop("checked", "true"); 
     } 
     else 
     { 
      $("input:checkbox:not(:disabled)." + $(this).data('checkbox-name')).prop("checked", "false"); 
     } 
    }); 
}); 

espero que ayude :)

+0

Hm ... ¿Has leído la pregunta? Esto solo hace parte de lo que hizo el código original. No hay nada allí para manejar las casillas de verificación desactivadas. – Guffa

+0

Lo siento, olvidé incluir eso en el código, solo edité mi respuesta agregando: no (: deshabilitado) ... – sergiocruz

0

Esto no hace lo mismo que su código original. Solo provocaría cambios para aquellos que no fueron cambiados. He assummed que deseaba para desencadenar el cambio de toda la vez que cambiaba

$(':checkbox.selectall').on('click', function(){ 
     $(':checkbox .'+ $(this).data('checkbox-name')).not(':disabled').prop("checked", $(this).prop("checked")).trigger("change"); 
    }); 
Cuestiones relacionadas