I just read the jQuery 1.6 release announcement and I must admit I’m a bit confused about the new .prop()
method and the breaking change to the older .attr()
method. In jQuery 1.6 a distinction is made between DOM attributes and DOM properties. Attributes are things like style
, class
and title
and represent the state of the DOM as retrieved from the document. Properties are things like value
, checked
and disabled
and represent dynamic state of the document.
For example, suppose an input element: <input id="myInput" type="checkbox" checked="checked" />
.
If you called $('#myInput').attr('checked')
in jQuery 1.5 you got back the valuetrue
. In jQuery 1.6 it would be "checked"
(the actual value of the attribute). If you call $('#myInput').prop('checked')
you get back true
. So far so good although a lot of people will probably be annoyed by the breaking change to the .attr()
method because there are thousands of lines of code that check the value of a checkbox by using .attr()
.
However, besides breaking .attr()
, the announcement of this change is very confusing. If you want to set the checked
attribute of a checkbox, I would expect you should use: $('myInput').prop('checked', true)
. But the announcement has the following line:
In jQuery 1.6 Boolean attributes (such as selected, checked, etc.) can now be toggled by passing in true
or false
to .attr()
to either add or remove them.
This is inconsistent. If you call .attr('checked')
you get back the value "checked"
but you should set the attribute by passing in the value true
. Or can you still call.attr('checked', 'checked')
as you could in jQuery 1.5?