Bug Tracker

Ticket #8039 (closed bug: fixed)

Opened 3 years ago

Last modified 2 years ago

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:1 Changed 3 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 3 years ago by mathias (previous) (diff)

comment:2 Changed 3 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()

Last edited 3 years ago by gnarf (previous) (diff)

comment:3 Changed 3 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)

  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 3 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 3 years ago by gnarf

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

  • Owner changed from mathias to gnarf
  • Status changed from open to assigned
  • Version changed from git to 1.5rc1

comment:8 Changed 3 years ago by jitter

  • Milestone changed from 1.next to 1.5.1

comment:9 Changed 3 years ago by jitter

  • Version changed from 1.5rc1 to 1.5

comment:10 Changed 3 years ago by jitter

#8164 is a duplicate of this ticket.

comment:11 Changed 3 years ago by jitter

  • Blocking 8163 added

comment:12 Changed 3 years ago by jitter

  • Status changed from assigned to closed
  • Resolution set to fixed
Note: See TracTickets for help on using tickets.