From d8b3bd700fe131d8b1dc381163abc6386a90501e Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 17 Feb 2009 17:51:50 +0000 Subject: [PATCH] Switch to using createRange for element comparision instead of Array indexOf checks - thanks for the tip, Ioseb. --- src/selector.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/selector.js b/src/selector.js index 6538d97..3e1d711 100644 --- a/src/selector.js +++ b/src/selector.js @@ -692,20 +692,22 @@ if ( document.documentElement.compareDocumentPosition ) { } return ret; }; -} else if ( Array.prototype.indexOf ) { - var indexOf = Array.prototype.indexOf, - allSort = document.getElementsByTagName("*"); - +} else if ( "sourceIndex" in document.documentElement ) { sortOrder = function( a, b ) { - var ret = indexOf.call( allSort, a ) - indexOf.call( allSort, b ); + var ret = a.sourceIndex - b.sourceIndex; if ( ret === 0 ) { hasDuplicate = true; } return ret; }; -} else if ( "sourceIndex" in document.documentElement ) { +} else if ( document.createRange ) { sortOrder = function( a, b ) { - var ret = a.sourceIndex - b.sourceIndex; + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.selectNode(a); + aRange.collapse(true); + bRange.selectNode(b); + bRange.collapse(true); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); if ( ret === 0 ) { hasDuplicate = true; } -- 1.7.10.4