Cuando vinculo una función a un elemento de casilla de verificación como:
$("#myCheckbox").click( function() {
alert($(this).is(":checked"));
});
La casilla de verificación cambia su atributo marcado antes de que se active el evento, este es el comportamiento normal y da un resultado inverso.
Sin embargo, cuando lo hago:
$("#myCheckbox").click();
La casilla de verificación cambia el atributo marcado después de que se activa el evento.
Mi pregunta es, ¿hay alguna manera de activar el evento de clic de jQuery como lo haría un clic normal (primer escenario)?
PD: ya lo he probado trigger('click')
;
Respuestas:
$('#myCheckbox').change(function () { if ($(this).prop("checked")) { // checked return; } // not checked });
Nota: en versiones anteriores de jquery estaba bien usarlo
attr
. Ahora se sugiere usarloprop
para leer el estado.fuente
Hay una solución alternativa que funciona en jQuery 1.3.2 y 1.4.2 :
$("#myCheckbox").change( function() { alert($(this).is(":checked")); }); //Trigger by: $("#myCheckbox").trigger('click').trigger('change');
Pero estoy de acuerdo, este comportamiento parece defectuoso en comparación con el evento nativo.
fuente
En junio de 2016 (usando jquery 2.1.4) ninguna de las otras soluciones sugeridas funciona. La comprobación
attr('checked')
siempre vuelveundefined
yis('checked)
siempre vuelvefalse
.Solo usa el método prop:
$("#checkbox").change(function(e) { if ($(this).prop('checked')){ console.log('checked'); } });
fuente
is('checked)
devolverá falso porque "comprobado" no es un pseudo selector de CSS. El correcto debería seris(':checked')
para que busque ": comprobado" en su lugar.Sigo experimentando este comportamiento con jQuery 1.7.2. Una solución alternativa sencilla es aplazar la ejecución del controlador de clics con setTimeout y dejar que el navegador haga su magia mientras tanto:
$("#myCheckbox").click( function() { var that = this; setTimeout(function(){ alert($(that).is(":checked")); }); });
fuente
.click()
, a continuación, establecer.attr('value', 'true')
, a continuación.change()
, a continuación,.blur()
antes de que se establecería mediante programación la caja cuando hice clic en el botón "Actualizar" mediante programación ....Si anticipa este comportamiento bastante no deseado, entonces una alternativa sería pasar un parámetro adicional de jQuery.trigger () al controlador de clic de la casilla de verificación. Este parámetro adicional es para notificar al controlador de clics que el clic se ha activado mediante programación, en lugar de que el usuario haga clic directamente en la casilla de verificación. El controlador de clic de la casilla de verificación puede invertir el estado de verificación informado.
Así que así es como activaría el evento de clic en una casilla de verificación con el ID "myCheckBox". Tenga en cuenta que también estoy pasando un parámetro de objeto con un solo miembro, nonUI, que se establece en verdadero:
$("#myCheckbox").trigger('click', {nonUI : true})
Y así es como lo manejo en el controlador de eventos de clic de la casilla de verificación. La función de controlador comprueba la presencia del objeto que no es de interfaz de usuario como segundo parámetro. (El primer parámetro es siempre el evento en sí). Si el parámetro está presente y se establece en verdadero, invierto el estado .checked informado. Si no se pasa tal parámetro, lo cual no ocurrirá si el usuario simplemente hace clic en la casilla de verificación en la interfaz de usuario, entonces informo el estado real .checked:
$("#myCheckbox").click(function(e, parameters) { var nonUI = false; try { nonUI = parameters.nonUI; } catch (e) {} var checked = nonUI ? !this.checked : this.checked; alert('Checked = ' + checked); });
Versión de JSFiddle en http://jsfiddle.net/BrownieBoy/h5mDZ/
Lo he probado con Chrome, Firefox e IE 8.
fuente
<input id="widget-wpb_widget-3-custom_date" class="mycheck" type="checkbox" value="d/M/y" name="widget-wpb_widget[3][custom_date]" unchecked="true"> var atrib = $('.mycheck').attr("unchecked",true); $('.mycheck').click(function(){ if ($(this).is(":checked")) { $('.mycheck').attr("unchecked",false); alert("checkbox checked"); } else { $('.mycheck').attr("unchecked",true); alert("checkbox unchecked"); } });
fuente
$("#checkbox").change(function(e) { if ($(this).prop('checked')){ console.log('checked'); } });
fuente
$("#personal").click(function() { if ($(this).is(":checked")) { alert('Personal'); /* var validator = $("#register_france").validate(); validator.resetForm(); */ } } );
JSFIDDLE
fuente
Bueno, para que coincida con el primer escenario, esto es algo que se me ocurrió.
http://jsbin.com/uwupa/edit
Esencialmente, en lugar de vincular el evento "clic", vincula el evento "cambiar" con la alerta.
Luego, cuando activa el evento, primero activa el clic y luego activa el cambio.
fuente
Además de la respuesta de Nick Craver, para que esto funcione correctamente
IE 8
, debe agregar un controlador de clic adicional a la casilla de verificación:// needed for IE 8 compatibility if ($.browser.msie) $("#myCheckbox").click(function() { $(this).trigger('change'); }); $("#myCheckbox").change( function() { alert($(this).is(":checked")); }); //Trigger by: $("#myCheckbox").trigger('click').trigger('change');
De lo contrario, la devolución de llamada solo se activará cuando la casilla de verificación pierda el foco, ya que
IE 8
mantiene el foco en las casillas de verificación y radios cuando se hace clic en ellas.IE 9
Aunque no lo he probado .fuente
$( "#checkbox" ).change(function() { if($(this).is(":checked")){ alert('hi'); } });
fuente
change
lugar de los OPclick
, y solo usa unaif
declaración como una forma diferente de probar:checked
.La forma más rápida y sencilla :
$('#myCheckbox').change(function(){ alert(this.checked); });
$el[0].checked;
$ el - es el elemento jquery de selección.
¡Disfrutar!
fuente
if ($.browser.msie) { $("#myCheckbox").click(function() { $(this).trigger('change'); }); } $("#myCheckbox").change(function() { alert($(this).is(":checked")); });
fuente