Bug Tracker

Opened 10 years ago

Closed 10 years ago

Last modified 9 years ago

#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:
Blocked by: Blocking: #8163

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 (12)

comment:1 Changed 10 years ago by mathias

In src/attributes.js, near the end of attr (around line 346):

return elem[ name ];

…should probably be:

return elem.getAttribute(name);

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.

Last edited 10 years ago by mathias (previous) (diff)

comment:2 Changed 10 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/1/ )

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()

Version 1, edited 10 years ago by gnarf (previous) (next) (diff)

comment:3 Changed 10 years ago by Rick Waldron

Component: unfiledattributes
Owner: set to mathias
Status: newpending

I just applied this change and failed the following...

attributes: attr(String) (5, 14, 19)

  1. Check for defaultValue attribute

  1. Check for class attribute

  1. Check for selectedIndex attribute

  1. Died on test #18: Cannot call method 'toUpperCase' of null

attributes: attr(String, Object) (1, 29, 30)

  1. Remove name attribute

attributes: addClass(String) (3, 2, 5)

  1. Make sure there's no extra whitespace.

  1. Make sure there's no extra whitespace.*

  1. Make sure there isn't too much trimming.

attributes: addClass(Function) (3, 2, 5)

  1. Make sure there's no extra whitespace.

  1. Make sure there's no extra whitespace. *

  1. Make sure there isn't too much trimming.

  • yes, both named this

comment:4 Changed 10 years ago by Rick Waldron

Component: attributesselector
Priority: undecidedlow
Status: pendingopen

comment:6 Changed 10 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 10 years ago by jitter

Owner: changed from mathias to gnarf
Status: openassigned
Version: git1.5rc1

comment:8 Changed 10 years ago by jitter

Milestone: 1.next1.5.1

comment:9 Changed 10 years ago by jitter

Version: 1.5rc11.5

comment:10 Changed 10 years ago by jitter

#8164 is a duplicate of this ticket.

comment:11 Changed 10 years ago by jitter

Blocking: 8163 added

comment:12 Changed 10 years ago by jitter

Resolution: fixed
Status: assignedclosed
Note: See TracTickets for help on using tickets.