Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does dynamically changing a checkbox not trigger a form change event?

Tags:

I wrote this snippet of javascript/jQuery to change a check box. http://jsfiddle.net/johnhoffman/crF93/

Javascript

$(function() {     $("a").click(function() {        if ($("input[type='checkbox']").attr('checked') == "checked")            $("input[type='checkbox']").removeAttr('checked');        else            $("input[type='checkbox']").attr('checked', 'checked');        return false;     });      $("input[type='checkbox']").change(function(){          console.log("Checkbox changed.");                 });     });​ 

HTML

<input type="checkbox" /> <a href="#">Change CheckBox</a>​ 

Interestingly, clicking the link alters the text box, but does not trigger the form change event that calls the function that logs a message in Chrome Web Developer Console. Why? How do I make it do that?

like image 342
John Hoffman Avatar asked Apr 15 '12 03:04

John Hoffman


People also ask

What method generates an event when the checkbox state changes?

When the state of a checkbox is changed, it generates an event of type ItemEvent. The associated listener interface is ItemListener.

How do I add a dynamic event handler to a checkbox?

You can bind event handlers to dynamically created elements the same way you assign an id to them, such as by doing 'li. onclick = checkCount;' , where checkCount is the name of the function you want to assign to the handler.


2 Answers

You need to trigger the change event, .trigger('change'), so that event knows that a change took place.

From http://api.jquery.com/change/:

Description: Bind an event handler to the "change" JavaScript event, or trigger that event on an element.

This method is a shortcut for .on( "change", handler ) in the first two variations, and .trigger( "change" ) in the third.

The change event is sent to an element when its value changes. This event is limited to <input> elements, <textarea> boxes and <select> elements. For select boxes, checkboxes, and radio buttons, the event is fired immediately when the user makes a selection with the mouse, but for the other element types the event is deferred until the element loses focus.

Demo:

http://jsfiddle.net/nPkPw/3/

Using chaining: http://jsfiddle.net/nPkPw/5/
i.e. $("input[type='checkbox']").trigger('change').attr('checked', 'checked');

like image 171
Tats_innit Avatar answered Oct 19 '22 10:10

Tats_innit


This isn't surprising, but I guess you could as this to the list of non-effect in the msdn.

  • "This event is fired when the contents are committed and not while the value is changing."
  • "The onchange event does not fire when the selected option of the select object is changed programmatically."

You could always just .click() it jsFiddle

like image 39
Sinetheta Avatar answered Oct 19 '22 10:10

Sinetheta