Ticket #8039 (closed bug: fixed)
Selectors with new HTML(5) input types don’t work in <= IE7
| Reported by: | mathias | Owned by: | gnarf |
|---|---|---|---|
| Priority: | low | Milestone: | 1.5.1 |
| Component: | selector | Version: | 1.5 |
| Keywords: | Cc: | ||
| Blocking: | #8163 | Blocked by: |
Description
HTML:
<input type="search">
jQuery:
$('input[type="search"]').length; // should be 1, but is 0 in <= IE7
$('input[type="text"]').length; // should be 0, but is 1 in <= IE7
$('input').attr('type'); // should be "search", but is "text" in <= IE7
document.getElementsByTagName('input')[0].getAttribute('type'); // "search" (works everywhere)
It seems jQuery is using elem.type internally instead of elem.getAttribute('type'). In this case, there’s an important difference.
I’ve created a jsFiddle to illustrate the bug: http://jsfiddle.net/mathias/XzGcW/ Note that it uses alert() so it can be debugged in a clean IE without any plugins installed.
P.S. This does not fix the bug, but I think that in src/selector.js, around line 613, this should be rewritten to elem.getAttribute('type') to prevent similar bugs with :text:
text: function( elem ) {
return "text" === elem.type;
}
Change History
comment:2 Changed 2 years ago by gnarf
One fix is to add a special case for the 'type' ATTR check that will force .getAttribute:
Sizzle.selectors.attrHandle['type'] = function ( elem ) {
return elem.getAttribute( 'type' );
}
( change Sizzle to jQuery.find and you can monkey patch this bug on your own page: seen on http://jsfiddle.net/gnarf/XzGcW/2/ )
Also, I'm not really sure why the default behavior in the attr function around ~790 of sizzle.js prefers to use elem[ name ] over elem.getAttribute( name ) but switching this to prefer elem.getAttribute may fix the need to have attrHandle at all since both the current one (href) and the proposed one for type just return .getAttribute()
comment:3 Changed 2 years ago by rwaldron
- Owner set to mathias
- Status changed from new to pending
- Component changed from unfiled to attributes
I just applied this change and failed the following...
attributes: attr(String) (5, 14, 19)
- Check for defaultValue attribute
- Check for class attribute
- Check for selectedIndex attribute
- Died on test #18: Cannot call method 'toUpperCase' of null
attributes: attr(String, Object) (1, 29, 30)
- Remove name attribute
attributes: addClass(String) (3, 2, 5)
- Make sure there's no extra whitespace.
- Make sure there's no extra whitespace.*
- Make sure there isn't too much trimming.
attributes: addClass(Function) (3, 2, 5)
- Make sure there's no extra whitespace.
- Make sure there's no extra whitespace. *
- Make sure there isn't too much trimming.
- yes, both named this
comment:4 Changed 2 years ago by rwaldron
- Priority changed from undecided to low
- Status changed from pending to open
- Component changed from attributes to selector
comment:5 Changed 2 years ago by gnarf
Potential Fix: https://github.com/jeresig/sizzle/pull/48
comment:6 Changed 2 years ago by mathias
I can confirm that gnarf’s patch successfully fixes the problem, while passing all unit tests in all supported browsers, including IE7 and IE6.
comment:7 Changed 2 years ago by jitter
- Owner changed from mathias to gnarf
- Status changed from open to assigned
- Version changed from git to 1.5rc1
comment:10 Changed 2 years ago by jitter
#8164 is a duplicate of this ticket.
comment:12 Changed 2 years ago by jitter
- 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.

In src/attributes.js, near the end of attr (around line 346):
…should probably be:
This fixes the .attr() issue, but not the selector bug.
Edit: Of course, this change causes errors with className etc, see comment 3 by rwaldron.