A follow-up to [6578] (which stopped adding expandos to elements that didn't have data). That broke jQuery.unique() (so we're now using the unique from Sizzle). Using Sizzle's unique (which also sorts in document order) changed how add, andSelf, parents, nextAll, prevAll, and siblings work. after and before were changed to not use .add() (in order to guarantee their position in the jQuery set). Also, jQuery.data(elem) was updated to return that element's data object (instead of its ID).
$("<div/>").after("<span/>") => [ div, span ] (calling after on a disconnected DOM node adds the nodes to the end of the jQuery set) $("<div/>").before("<span/>") => [ span, div ] (calling before on a disconnected DOM node adds the nodes to the beginning of the jQuery set) $("div").add("span") => [ div, span, span, div, span ] (results now come out in document order) $("div").find("code").andSelf(); => [ div, code, code ] (results now come out in document order) Same goes for .parents(), .nextAll(), .prevAll(), and .siblings(). Exception: .parents() will still return the results in reverse document order. jQuery.data(elem) => { object of data } (no longer returns the unique ID assigned to the node)
This commit is contained in:
parent
67089eedf6
commit
67d445a703
9 changed files with 73 additions and 48 deletions
19
src/core.js
19
src/core.js
|
@ -462,25 +462,6 @@ jQuery.extend({
|
|||
return first;
|
||||
},
|
||||
|
||||
unique: function( array ) {
|
||||
var ret = [], done = {}, id;
|
||||
|
||||
try {
|
||||
for ( var i = 0, length = array.length; i < length; i++ ) {
|
||||
id = jQuery.data( array[ i ] );
|
||||
|
||||
if ( !done[ id ] ) {
|
||||
done[ id ] = true;
|
||||
ret.push( array[ i ] );
|
||||
}
|
||||
}
|
||||
} catch( e ) {
|
||||
ret = array;
|
||||
}
|
||||
|
||||
return ret;
|
||||
},
|
||||
|
||||
grep: function( elems, callback, inv ) {
|
||||
var ret = [];
|
||||
|
||||
|
|
12
src/data.js
12
src/data.js
|
@ -14,8 +14,8 @@ jQuery.extend({
|
|||
var id = elem[ expando ], cache = jQuery.cache, thisCache;
|
||||
|
||||
// Handle the case where there's no name immediately
|
||||
if ( !name ) {
|
||||
return id;
|
||||
if ( !name && !id ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Compute a unique ID for the element
|
||||
|
@ -39,7 +39,7 @@ jQuery.extend({
|
|||
thisCache[ name ] = data;
|
||||
}
|
||||
|
||||
return name === true ? thisCache : thisCache[ name ];
|
||||
return name ? thisCache[ name ] : thisCache;
|
||||
},
|
||||
|
||||
removeData: function( elem, name ) {
|
||||
|
@ -116,7 +116,9 @@ jQuery.extend({
|
|||
|
||||
jQuery.fn.extend({
|
||||
data: function( key, value ){
|
||||
if(typeof key === "undefined" && this.length) return jQuery.data(this[0], true);
|
||||
if ( typeof key === "undefined" && this.length ) {
|
||||
return jQuery.data( this[0] );
|
||||
}
|
||||
|
||||
var parts = key.split(".");
|
||||
parts[1] = parts[1] ? "." + parts[1] : "";
|
||||
|
@ -165,4 +167,4 @@ jQuery.fn.extend({
|
|||
clearQueue: function(type){
|
||||
return this.queue( type || "fx", [] );
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -111,12 +111,10 @@ jQuery.fn.extend({
|
|||
return this.domManip(arguments, false, function(elem){
|
||||
this.parentNode.insertBefore( elem, this );
|
||||
});
|
||||
} else {
|
||||
var set = jQuery.isFunction(arguments[0]) ?
|
||||
jQuery( arguments[0]() ) :
|
||||
jQuery.apply(jQuery, arguments);
|
||||
|
||||
return this.pushStack( set.add( this ), "before", arguments );
|
||||
} else if ( arguments.length ) {
|
||||
var set = jQuery(arguments[0]);
|
||||
set.push.apply( set, this.toArray() );
|
||||
return this.pushStack( set, "before", arguments );
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -125,10 +123,10 @@ jQuery.fn.extend({
|
|||
return this.domManip(arguments, false, function(elem){
|
||||
this.parentNode.insertBefore( elem, this.nextSibling );
|
||||
});
|
||||
} else {
|
||||
return jQuery.isFunction(arguments[0]) ?
|
||||
this.add( arguments[0]() ) :
|
||||
this.add.apply( this, arguments );
|
||||
} else if ( arguments.length ) {
|
||||
var set = this.pushStack( this, "after", arguments );
|
||||
set.push.apply( set, jQuery(arguments[0]).toArray() );
|
||||
return set;
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -144,6 +144,8 @@ Sizzle.uniqueSort = function(results){
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
};
|
||||
|
||||
Sizzle.matches = function(expr, set){
|
||||
|
@ -703,6 +705,13 @@ var sortOrder;
|
|||
|
||||
if ( document.documentElement.compareDocumentPosition ) {
|
||||
sortOrder = function( a, b ) {
|
||||
if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
|
||||
if ( a == b ) {
|
||||
hasDuplicate = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
|
||||
if ( ret === 0 ) {
|
||||
hasDuplicate = true;
|
||||
|
@ -711,6 +720,13 @@ if ( document.documentElement.compareDocumentPosition ) {
|
|||
};
|
||||
} else if ( "sourceIndex" in document.documentElement ) {
|
||||
sortOrder = function( a, b ) {
|
||||
if ( !a.sourceIndex || !b.sourceIndex ) {
|
||||
if ( a == b ) {
|
||||
hasDuplicate = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
var ret = a.sourceIndex - b.sourceIndex;
|
||||
if ( ret === 0 ) {
|
||||
hasDuplicate = true;
|
||||
|
@ -719,6 +735,13 @@ if ( document.documentElement.compareDocumentPosition ) {
|
|||
};
|
||||
} else if ( document.createRange ) {
|
||||
sortOrder = function( a, b ) {
|
||||
if ( !a.ownerDocument || !b.ownerDocument ) {
|
||||
if ( a == b ) {
|
||||
hasDuplicate = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
|
||||
aRange.selectNode(a);
|
||||
aRange.collapse(true);
|
||||
|
@ -1036,6 +1059,8 @@ jQuery.sibling = function(n, elem){
|
|||
return r;
|
||||
};
|
||||
|
||||
jQuery.unique = Sizzle.uniqueSort;
|
||||
|
||||
return;
|
||||
|
||||
window.Sizzle = Sizzle;
|
||||
|
|
|
@ -69,12 +69,14 @@ jQuery.fn.extend({
|
|||
},
|
||||
|
||||
add: function( selector ) {
|
||||
return this.pushStack( jQuery.unique( jQuery.merge(
|
||||
this.get(),
|
||||
typeof selector === "string" ?
|
||||
var set = typeof selector === "string" ?
|
||||
jQuery( selector ) :
|
||||
jQuery.makeArray( selector )
|
||||
)));
|
||||
jQuery.makeArray( selector ),
|
||||
all = jQuery.merge( this.get(), set );
|
||||
|
||||
return this.pushStack( set[0] && (set[0].setInterval || set[0].nodeType === 9 || (set[0].parentNode && set[0].parentNode.nodeType !== 11)) ?
|
||||
jQuery.unique( all ) :
|
||||
all );
|
||||
},
|
||||
|
||||
eq: function( i ) {
|
||||
|
@ -125,9 +127,16 @@ jQuery.each({
|
|||
jQuery.fn[ name ] = function( selector ) {
|
||||
var ret = jQuery.map( this, fn );
|
||||
|
||||
if ( selector && typeof selector == "string" )
|
||||
if ( selector && typeof selector === "string" ) {
|
||||
ret = jQuery.multiFilter( selector, ret );
|
||||
}
|
||||
|
||||
return this.pushStack( jQuery.unique( ret ), name, selector );
|
||||
ret = this.length > 1 ? jQuery.unique( ret ) : ret;
|
||||
|
||||
if ( name === "parents" && this.length > 1 ) {
|
||||
ret = ret.reverse();
|
||||
}
|
||||
|
||||
return this.pushStack( ret, name, selector );
|
||||
};
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue