Skip to content

Commit c9bb72b

Browse files
committed
Selector: Make empty attribute selectors work in IE 11/Edge again
qSA in IE 11/Edge often (but not always) doesn't find elements with an empty name attribute selector (`[name=""]`). Assigning a temporary name attribute to the document root (& removing it afterwards) seems to resolve the issue. Interestingly, IE 10 & older don't seem to have the issue.
1 parent 26415e0 commit c9bb72b

File tree

5 files changed

+36
-6
lines changed

5 files changed

+36
-6
lines changed

src/selector.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,21 @@ define( [
1919
"use strict";
2020

2121
var preferredDoc = document,
22-
matches = documentElement.matches || documentElement.msMatchesSelector;
22+
matches = documentElement.matches || documentElement.msMatchesSelector,
23+
docElemHasNameAttribute = documentElement.hasAttribute( "name" ),
24+
docElemNameAttribute = documentElement.getAttribute( "name" );
25+
26+
27+
// Support: IE 11+, Edge 15 - 18+
28+
// IE 11/Edge doesn't find elements on a `[name='']` query in some cases.
29+
// Adding a temporary attribute to the document before the selection works
30+
// around the issue.
31+
documentElement.setAttribute( "name", "" );
32+
if ( docElemHasNameAttribute ) {
33+
documentElement.setAttribute( "name", docElemNameAttribute );
34+
} else {
35+
documentElement.removeAttribute( "name" );
36+
}
2337

2438
( function() {
2539

test/data/qunit-fixture.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@
116116
<input type="radio" name="R1" value="2" />
117117
<input type="text" name="My Name" value="me" />
118118
<input type="reset" name="reset" value="NO" />
119+
<div class="empty-name-container">
120+
<div id="empty-name-parent">
121+
<input type="text" id="name-empty" name="" value="" />
122+
</div>
123+
</div>
119124
<select name="S1">
120125
<option value="abc">ABC</option>
121126
<option value="abc">ABC</option>

test/data/qunit-fixture.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/unit/attributes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,7 @@ QUnit.test( "addClass(Array)", function( assert ) {
12551255
} );
12561256

12571257
QUnit.test( "addClass(Function) with incoming value", function( assert ) {
1258-
assert.expect( 57 );
1258+
assert.expect( 59 );
12591259
var pass, i,
12601260
div = jQuery( "#qunit-fixture div" ),
12611261
old = div.map( function() {
@@ -1330,7 +1330,7 @@ QUnit.test( "removeClass(Array) - simple", function( assert ) {
13301330
} );
13311331

13321332
QUnit.test( "removeClass(Function) with incoming value", function( assert ) {
1333-
assert.expect( 57 );
1333+
assert.expect( 59 );
13341334

13351335
var $divs = jQuery( "#qunit-fixture div" ).addClass( "test" ), old = $divs.map( function() {
13361336
return jQuery( this ).attr( "class" );

test/unit/selector.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,7 @@ QUnit.test( "attributes - special characters", function( assert ) {
719719
} );
720720

721721
QUnit.test( "attributes - others", function( assert ) {
722-
assert.expect( 10 );
722+
assert.expect( 14 );
723723

724724
var div = document.getElementById( "foo" );
725725

@@ -749,6 +749,17 @@ QUnit.test( "attributes - others", function( assert ) {
749749
assert.ok( !jQuery( "<input type='checkbox'/>" ).prop( "checked", true ).is( "[checked]" ),
750750
"[checked] selects by attribute (negative)"
751751
);
752+
753+
assert.t( "empty name", "[name='']", [ "name-empty" ] );
754+
assert.t( "prefixed empty name", "#empty-name-parent [name='']", [ "name-empty" ] );
755+
756+
var emptyNameContainer = jQuery( ".empty-name-container" );
757+
assert.deepEqual( emptyNameContainer.find( "[name='']" ).get(),
758+
q( "name-empty" ),
759+
"empty name with context" );
760+
assert.deepEqual( emptyNameContainer.find( "#empty-name-parent [name='']" ).get(),
761+
q( "name-empty" ),
762+
"prefixed empty name with context" );
752763
} );
753764

754765
QUnit.test( "pseudo - (parent|empty)", function( assert ) {
@@ -1258,7 +1269,7 @@ QUnit[ QUnit.jQuerySelectorsPos ? "test" : "skip" ]( "pseudo - position", functi
12581269

12591270
assert.t( "Check element position", "#qunit-fixture div div:eq(0)", [ "nothiddendivchild" ] );
12601271
assert.t( "Check element position", "#select1 option:eq(3)", [ "option1d" ] );
1261-
assert.t( "Check element position", "#qunit-fixture div div:eq(10)", [ "names-group" ] );
1272+
assert.t( "Check element position", "#qunit-fixture div div:eq(10)", [ "no-clone-exception" ] );
12621273
assert.t( "Check element position", "#qunit-fixture div div:first", [ "nothiddendivchild" ] );
12631274
assert.t( "Check element position", "#qunit-fixture div > div:first", [ "nothiddendivchild" ] );
12641275
assert.t( "Check element position", "#qunit-fixture div:first a:first", [ "yahoo" ] );

0 commit comments

Comments
 (0)