Ticket #7128 (closed bug: fixed)
attribute selector is inconsistent between qSA and Sizzle due to use of DOM properties
| Reported by: | adipose | Owned by: | timmywil |
|---|---|---|---|
| Priority: | blocker | Milestone: | 1.7 |
| Component: | selector | Version: | 1.4.3 |
| Keywords: | equal selector | Cc: | |
| Blocking: | #9261 | Blocked by: |
Description
If I set an input value with javascript, the jquery selector does not select it unless I use an incorrectly formatted selector.
This occurs in Chrome 7.0.517.24, Firefox 3.6.10, Firefox 4.0b6, Opera 10.62 and Safari 4.0 (Win32).
IE8, however, does work properly.
Correct selector: $("[value=a]") does not work. Incorrect selector: $("&[value=a]") does work. $("@[value=a]") does work. etc.
See the attached example. It works at first, but after the javascript changes the value, it gets wrong results (except in IE8).
Attachments
Change History
comment:2 Changed 3 years ago by snover
- Priority changed from high to low
- Summary changed from Jquery selector broken on values set with javascript? to value attribute selector is inconsistent between qSA and Sizzle due to use of DOM properties
The value attribute in HTML actually corresponds to the defaultValue DOM property.
Presumably, the reason the “incorrect” selectors work is because the browser’s native querySelectorAll function fails (due to their invalidity) and jQuery falls back to using Sizzle’s slow path.
The real bug here sounds like the fact that Sizzle inspects DOM 2 HTML properties instead only using getAttribute, and perhaps also that IE8 is doing something else it shouldn’t be.
comment:3 Changed 3 years ago by adipose
"The value attribute in HTML actually corresponds to the defaultValue DOM property."
Is this to say, a jquery selector that inspects value will only ever look at the defaultValue DOM property?
When using .filter(), one can select based on value and not just defaultValue. Is this also a bug?
What is the proper way to select by value if value has been changed?
comment:4 Changed 3 years ago by snover
The jQuery attribute selector [value="foo"] should always inspect the HTML attribute value (which corresponds to the DOM property defaultValue), not the DOM property value which corresponds to the user- or script-modified state of the control.
To select by the current value, you would do something like:
$('input:text').filter(function () { return this.value === "foo"; })
comment:5 Changed 3 years ago by adipose
Thank you, I did not realize this, before.
However, I would like to point out that
$('input').filter("[value=foo]")
Works. Is this supposed to work, or will it break once the other bug is corrected?
comment:10 Changed 3 years ago by snover
- Priority changed from low to blocker
- Version changed from 1.4.2 to 1.4.3
- Milestone changed from 1.4.3 to 1.next
Many more duplicates are listed in #3399.
comment:11 Changed 3 years ago by snover
- Summary changed from value attribute selector is inconsistent between qSA and Sizzle due to use of DOM properties to attribute selector is inconsistent between qSA and Sizzle due to use of DOM properties
comment:13 Changed 3 years ago by addyosmani
#6470 is a duplicate of this ticket.
comment:14 Changed 3 years ago by snover
- Blocking 7485 added
(In #7485) This is something on the roadmap for 1.5. .attr will be rewritten along with Sizzle to stop matching on the DOM properties, so this will all be happily consistent again.
comment:15 Changed 2 years ago by john
- Milestone changed from 1.5 to 1.6
This is getting bumped to 1.6 when the $.attr rewrite happens.
comment:17 Changed 2 years ago by timmywil
#5930 is a duplicate of this ticket.
comment:19 Changed 2 years ago by timmywil
#8960 is a duplicate of this ticket.
comment:20 Changed 2 years ago by timmywil
#9062 is a duplicate of this ticket.
comment:21 Changed 2 years ago by timmywil
#8740 is a duplicate of this ticket.
comment:24 Changed 2 years ago by timmywil
#9623 is a duplicate of this ticket.
comment:26 Changed 21 months ago by timmywil
#9171 is a duplicate of this ticket.
comment:32 Changed 20 months ago by timmywil
- Status changed from assigned to closed
- Resolution set to fixed
Please follow the bug reporting guidlines and use jsFiddle when providing test cases and demonstrations instead of pasting the code in the ticket.

