2010-10-13 15 views
7

Para tener un poco de fondo, tengo varias casillas de verificación, cada una ponderada con un "puntaje" diferente. Cuando se cambia la casilla de verificación, necesito calcular el puntaje. Pensé que algo así podría funcionar, pero no parece que el evento .change se vincule correctamente.Jquery: Enlace cambiar a casillas de verificación múltiples

$(document).ready(function() { 
    bindSomeCheckboxes(); 
}); 

function bindSomeCheckboxes() { 
    var score=0; 
    var checkboxes = { 
     "id_1" : 3, 
     "id_2" : 1, 
     "id_3" : 2, 
     "id_4" : 5 
    }; 

    $.each(checkboxes, function(key, value) { 
     $("#"+key).change(function(key,value) { 
      if ($("#"+key).is(':checked')) { 
       //add this ids value to score 
      } else { 
       //subtract value from score 
      } 
     }); 
    }); 
} 

Sé que es un bucle a través de la matriz correctamente, pero nunca se ve una alerta en .Cambiar.

+0

Cabe ': checked' en lugar de': clicked', ver mi respuesta para más información. – BrunoLM

+0

Parece que a todas las respuestas les falta el hecho de que cada identificación tiene un "puntaje" único. Por eso tengo el mapeo de id -> puntaje. Hice la corrección pulsada -> marcada arriba y cambié los comentarios para mostrar lo que estoy tratando de lograr. Admitiré que podría estar haciendo esto mal. ;) –

+0

Agregué una respuesta que mantiene la estructura básica con la que estaba trabajando. Creo que estabas tratando de hacer referencia a 'clave' dentro del controlador pensando que tendría la ID. El problema fue que le diste a tu controlador su propio parámetro 'key', que en realidad se refiere al objeto' event'. Elimine (o renombre) eso, y tendría la 'clave'. Pero no lo necesita, porque tiene una referencia directa a la ID que necesita porque 'this' hace referencia a la que recibió el evento, por lo que' this.id' es la ID de esa. – user113716

Respuesta

4

Si realmente quería tomar ese enfoque de utilizar identificaciones, me gustaría hacer una matriz separada de las identificaciones, y hacer un .join() para crear el selector.

Algunas cosas a tener en cuenta:

  • En lugar de .is(':clicked') o .is(':checked'), utilice this.checked. Mucho más eficiente.
  • Los controladores de eventos en jQuery tienen un parámetro que hace referencia al event. Tienes 2 para key,value. Esto hace que key en el controlador se refiera a ese objeto event en lugar del key del $.each().
  • Dentro de un controlador, this se refiere al que se hizo clic.
  • Como tiene this referencia al elemento, no necesita la referencia a key en el $.each().Puedes hacer this.id.

function bindSomeCheckboxes() { 
    var score=0; 
    var checkboxes = { 
     "id_1" : 3, 
     "id_2" : 1, 
     "id_3" : 2, 
     "id_4" : 5 
    }; 

    var arrayOfIds = []; // to store array of ids 

    $.each(checkboxes,function(key, val) { // populate array with ids 
     arrayOfIds.push(key); 
    }); 

     // create a selector of the IDs 
    $("#" + arrayOfIds.join(',#')).change(function() { 
      // alert the score 
     alert(checkboxes[ this.id ]); 
     if (this.checked) { 
      //do something when it is checked 
     } else { 
      //do something else 
     } 
    }); 
} 
+0

Gracias. Esto es lo que estaba buscando. Una explicación de mi malentendido de lo que estaba pasando y una posible solución. +1 :) –

+0

@Magic - De nada. Avíseme si tiene alguna pregunta.: o) – user113716

+0

Heh después de todo esto me acabo de dar cuenta de que esto no está funcionando en parte porque el div que contiene estas casillas de verificación no está disponible en $ (documento). listo ... Buenos tiempos para depurar las cosas incorrectas. –

0

uso try 'bind' y ': marcado'

$.each(checkboxes, function(key, value) { 
    $(this).bind('change', function() { 
     if ($(this).is(':checked')) { 
     //do something when it is checked 
     } else { 
     //do something else 
     } 
    }); 
}); 
+0

En jQuery $ (this) .change (... es una abreviatura de $ (this) .bind ("change", ... – Fenton

2

Yo recomendaría la obtención de las casillas de verificación de una manera más natural ...

$("input[type='checkbox']").change(function() { 
    alert("Event is bound"); 
}); 

Si desea restringir el cual casillas de verificación para use, podría agregar una clase, aunque si puede evitar agregar clases innecesarias, su html estará más limpio.

7

Le recomiendo que agregue un contenedor y seleccione todas las casillas de verificación a la vez.

Y en cuanto a su pregunta, la firma del evento es incorrecta, la correcta es function(e){}. Además, debe verificar si el elemento está marcado y no ha hecho clic.

$("#chk").change(function(e){ 
    if ($(this).is(":checked")) 
     alert("checked"); 
    else 
     alert("not checked"); 
}); 

Para hacerlo más fácil, utilizar un recipiente

HTML de ejemplo

<div id="checks"> 
    <input type="checkbox" id="chk1" /> 
    <input type="checkbox" id="chk2" /> 
    <input type="checkbox" id="chk3" /> 
    <input type="checkbox" id="chk4" /> 
</div> 

Y para las puntuaciones, prefiero establecer datos en los elementos, ejemplo:

$("#chk1").data("Score", 3); 
$("#chk2").data("Score", 1); 
$("#chk3").data("Score", 2); 
$("#chk4").data("Score", 5); 

$("#checks :checkbox").change(function(e){ 
    if ($(this).is(":checked")) 
     alert("checked Score: " + $(this).data("Score")); 
    else 
     alert("not checked Score: " + $(this).data("Score")); 
}); 
+0

Me gusta este enfoque también. Gracias por algo diferente Bruno. –

Cuestiones relacionadas