mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Core: Make jQuery objects iterable
Make iterating over jQuery objects possible using ES 2015 for-of: for ( node of $( "<div id=narwhal>" ) ) { console.log( node.id ); // "narwhal" } Fixes gh-1693
This commit is contained in:
parent
9c8a3ecdc4
commit
bb026fc12c
2
.gitignore
vendored
2
.gitignore
vendored
@ -10,3 +10,5 @@
|
|||||||
|
|
||||||
/dist
|
/dist
|
||||||
/node_modules
|
/node_modules
|
||||||
|
|
||||||
|
/test/node_smoke_tests/lib/ensure_iterability.js
|
||||||
|
3
.jscsrc
3
.jscsrc
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"preset": "jquery",
|
"preset": "jquery",
|
||||||
|
|
||||||
"excludeFiles": [ "external", "src/intro.js", "src/outro.js" ]
|
"excludeFiles": [ "external", "src/intro.js", "src/outro.js",
|
||||||
|
"test/node_smoke_tests/lib/ensure_iterability.js" ]
|
||||||
}
|
}
|
||||||
|
@ -9,3 +9,4 @@ test/data/readywaitasset.js
|
|||||||
test/data/readywaitloader.js
|
test/data/readywaitloader.js
|
||||||
test/data/support/csp.js
|
test/data/support/csp.js
|
||||||
test/data/support/getComputedSupport.js
|
test/data/support/getComputedSupport.js
|
||||||
|
test/node_smoke_tests/lib/ensure_iterability.js
|
||||||
|
12
Gruntfile.js
12
Gruntfile.js
@ -30,6 +30,18 @@ module.exports = function( grunt ) {
|
|||||||
cache: "build/.sizecache.json"
|
cache: "build/.sizecache.json"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
babel: {
|
||||||
|
options: {
|
||||||
|
sourceMap: "inline",
|
||||||
|
retainLines: true
|
||||||
|
},
|
||||||
|
nodeSmokeTests: {
|
||||||
|
files: {
|
||||||
|
"test/node_smoke_tests/lib/ensure_iterability.js":
|
||||||
|
"test/node_smoke_tests/lib/ensure_iterability_es6.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
build: {
|
build: {
|
||||||
all: {
|
all: {
|
||||||
dest: "dist/jquery.js",
|
dest: "dist/jquery.js",
|
||||||
|
@ -5,7 +5,7 @@ module.exports = function( grunt ) {
|
|||||||
var fs = require( "fs" ),
|
var fs = require( "fs" ),
|
||||||
spawnTest = require( "./lib/spawn_test.js" ),
|
spawnTest = require( "./lib/spawn_test.js" ),
|
||||||
testsDir = "./test/node_smoke_tests/",
|
testsDir = "./test/node_smoke_tests/",
|
||||||
nodeSmokeTests = [ "jsdom" ];
|
nodeSmokeTests = [ "jsdom", "babel:nodeSmokeTests" ];
|
||||||
|
|
||||||
// Fire up all tests defined in test/node_smoke_tests/*.js in spawned sub-processes.
|
// Fire up all tests defined in test/node_smoke_tests/*.js in spawned sub-processes.
|
||||||
// All the files under test/node_smoke_tests/*.js are supposed to exit with 0 code
|
// All the files under test/node_smoke_tests/*.js are supposed to exit with 0 code
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"commitplease": "2.0.0",
|
"commitplease": "2.0.0",
|
||||||
|
"core-js": "0.9.17",
|
||||||
"grunt": "0.4.5",
|
"grunt": "0.4.5",
|
||||||
|
"grunt-babel": "5.0.1",
|
||||||
"grunt-cli": "0.1.13",
|
"grunt-cli": "0.1.13",
|
||||||
"grunt-compare-size": "0.4.0",
|
"grunt-compare-size": "0.4.0",
|
||||||
"grunt-contrib-jshint": "0.11.2",
|
"grunt-contrib-jshint": "0.11.2",
|
||||||
|
10
src/core.js
10
src/core.js
@ -425,6 +425,16 @@ jQuery.extend({
|
|||||||
support: support
|
support: support
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// JSHint would error on this code due to the Symbol not being defined in ES5.
|
||||||
|
// Defining this global in .jshintrc would create a danger of using the global
|
||||||
|
// unguarded in another place, it seems safer to just disable JSHint for these
|
||||||
|
// three lines.
|
||||||
|
/* jshint ignore: start */
|
||||||
|
if ( typeof Symbol === "function" ) {
|
||||||
|
jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
|
||||||
|
}
|
||||||
|
/* jshint ignore: end */
|
||||||
|
|
||||||
// Populate the class2type map
|
// Populate the class2type map
|
||||||
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),
|
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),
|
||||||
function(i, name) {
|
function(i, name) {
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
"define": false,
|
"define": false,
|
||||||
"DOMParser": false,
|
"DOMParser": false,
|
||||||
"Promise": false,
|
"Promise": false,
|
||||||
|
"Symbol": false,
|
||||||
"QUnit": false,
|
"QUnit": false,
|
||||||
"ok": false,
|
"ok": false,
|
||||||
"equal": false,
|
"equal": false,
|
||||||
|
8
test/node_smoke_tests/iterable_with_native_symbol.js
Normal file
8
test/node_smoke_tests/iterable_with_native_symbol.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
if ( typeof Symbol === "undefined" ) {
|
||||||
|
console.log( "Symbols not supported, skipping the test..." );
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
require( "./lib/ensure_iterability_es6" )();
|
13
test/node_smoke_tests/iterable_with_symbol_polyfill.js
Normal file
13
test/node_smoke_tests/iterable_with_symbol_polyfill.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/* jshint esnext: true */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var assert = require( "assert" );
|
||||||
|
|
||||||
|
delete global.Symbol;
|
||||||
|
require( "core-js" );
|
||||||
|
|
||||||
|
assert.strictEqual( typeof Symbol, "function", "Expected Symbol to be a function" );
|
||||||
|
assert.notEqual( typeof Symbol.iterator, "symbol", "Expected Symbol.iterator to be polyfilled" );
|
||||||
|
|
||||||
|
require( "./lib/ensure_iterability" )();
|
25
test/node_smoke_tests/lib/ensure_iterability_es6.js
Normal file
25
test/node_smoke_tests/lib/ensure_iterability_es6.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/* jshint esnext: true */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var assert = require( "assert" );
|
||||||
|
|
||||||
|
module.exports = function ensureIterability() {
|
||||||
|
require( "jsdom" ).env( "", function( errors, window ) {
|
||||||
|
assert.ifError( errors );
|
||||||
|
|
||||||
|
var i,
|
||||||
|
ensureJQuery = require( "./ensure_jquery" ),
|
||||||
|
jQuery = require( "../../../dist/jquery.js" )( window ),
|
||||||
|
elem = jQuery( "<div></div><span></span><a></a>" ),
|
||||||
|
result = "";
|
||||||
|
|
||||||
|
ensureJQuery( jQuery );
|
||||||
|
|
||||||
|
for ( i of elem ) {
|
||||||
|
result += i.nodeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.strictEqual( result, "DIVSPANA", "for-of doesn't work on jQuery objects" );
|
||||||
|
} );
|
||||||
|
};
|
@ -1538,3 +1538,23 @@ testIframeWithCallback( "Don't call window.onready (#14802)", "core/onready.html
|
|||||||
equal( error, false, "no call to user-defined onready" );
|
equal( error, false, "no call to user-defined onready" );
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test( "Iterability of jQuery objects (gh-1693)", function() {
|
||||||
|
/* jshint unused: false */
|
||||||
|
expect( 1 );
|
||||||
|
|
||||||
|
var i, elem, result;
|
||||||
|
|
||||||
|
if ( typeof Symbol === "function" ) {
|
||||||
|
|
||||||
|
elem = jQuery( "<div></div><span></span><a></a>" );
|
||||||
|
result = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
eval( "for ( i of elem ) { result += i.nodeName; }" );
|
||||||
|
} catch ( e ) {}
|
||||||
|
equal( result, "DIVSPANA", "for-of works on jQuery objects" );
|
||||||
|
} else {
|
||||||
|
ok( true, "The browser doesn't support Symbols" );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
Loading…
Reference in New Issue
Block a user