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:
Michał Gołębiowski
2015-06-01 23:25:38 +02:00
parent 9c8a3ecdc4
commit bb026fc12c
12 changed files with 97 additions and 2 deletions

View File

@@ -22,6 +22,7 @@
"define": false,
"DOMParser": false,
"Promise": false,
"Symbol": false,
"QUnit": false,
"ok": false,
"equal": false,

View 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" )();

View 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" )();

View 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" );
} );
};

View File

@@ -1538,3 +1538,23 @@ testIframeWithCallback( "Don't call window.onready (#14802)", "core/onready.html
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" );
}
} );