X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fselector%2Fselector.js;h=4a578933787bf0b43c4d30d39d4678a8adf6182c;hb=139393fe0978e79c427ad13f1a03a10431ef95e5;hp=7011db382fbb296c9475d78f87a26bb543b6724f;hpb=6f064fc9c527a46b4de16f0af310b98d1a87b0f4;p=jquery.git diff --git a/src/selector/selector.js b/src/selector/selector.js index 7011db3..4a57893 100644 --- a/src/selector/selector.js +++ b/src/selector/selector.js @@ -1,3 +1,11 @@ + +var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? + "(?:[\\w*_-]|\\\\.)" : + "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", + quickChild = new RegExp("^[/>]\\s*(" + chars + "+)"), + quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), + quickClass = new RegExp("^([#.]?)(" + chars + "*)"); + jQuery.extend({ expr: { "": "m[2]=='*'||jQuery.nodeName(a,m[2])", @@ -45,8 +53,15 @@ jQuery.extend({ image: "'image'==a.type", reset: "'reset'==a.type", button: '"button"==a.type||jQuery.nodeName(a,"button")', - input: "/input|select|textarea|button/i.test(a.nodeName)" + input: "/input|select|textarea|button/i.test(a.nodeName)", + + // :has() + has: "jQuery.find(m[3],a).length", + + // :header + header: "/h\\d/i.test(a.nodeName)" }, + // DEPRECATED "[": "jQuery.find(m[2],a).length" }, @@ -55,6 +70,7 @@ jQuery.extend({ // Match: [@value='test'], [@foo] /^\[ *(@)([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, + // DEPRECATED // Match: [div], [div p] /^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/, @@ -62,8 +78,7 @@ jQuery.extend({ /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, // Match: :even, :last-chlid, #id, .class - new RegExp("^([:.#]*)(" + - ( jQuery.chars = jQuery.browser.safari && jQuery.browser.version < "3.0.0" ? "\\w" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)" ) + "+)") + new RegExp("^([:.#]*)(" + chars + "+)") ], multiFilter: function( expr, elems, not ) { @@ -79,12 +94,6 @@ jQuery.extend({ return cur; }, - /** - * @name $.find - * @type Array - * @private - * @cat Core - */ find: function( t, context ) { // Quickly handle non-string expressions if ( typeof t != "string" ) @@ -97,11 +106,13 @@ jQuery.extend({ // Set the correct context (if none is provided) context = context || document; + // DEPRECATED // Handle the common XPath // expression if ( !t.indexOf("//") ) { - context = context.documentElement; + //context = context.documentElement; t = t.substr(2,t.length); + // DEPRECATED // And the / root expression } else if ( !t.indexOf("/") && !context.ownerDocument ) { context = context.documentElement; @@ -119,13 +130,14 @@ jQuery.extend({ var r = []; last = t; + // DEPRECATED t = jQuery.trim(t).replace( /^\/\//, "" ); var foundToken = false; // An attempt at speeding up child selectors that // point to a specific element tag - var re = new RegExp("^[/>]\\s*(" + jQuery.chars + "+)"); + var re = quickChild; var m = re.exec(t); if ( m ) { @@ -142,7 +154,8 @@ jQuery.extend({ if ( t.indexOf(" ") == 0 ) continue; foundToken = true; } else { - re = /^((\/?\.\.)|([>\/+~]))\s*([a-z]*)/i; + // (.. and /) DEPRECATED + re = /^((\/?\.\.)|([>\/+~]))\s*(\w*)/i; if ( (m = re.exec(t)) != null ) { r = []; @@ -164,6 +177,7 @@ jQuery.extend({ if ( m == "+" ) break; } + // DEPRECATED } else r.push( ret[j].parentNode ); @@ -193,8 +207,8 @@ jQuery.extend({ t = " " + t.substr(1,t.length); } else { - // Optomize for the case nodeName#idName - var re2 = new RegExp("^(" + jQuery.chars + "+)(#)(" + jQuery.chars + "+)"); + // Optimize for the case nodeName#idName + var re2 = quickID; var m = re2.exec(t); // Re-organize the results, so that they're consistent @@ -204,7 +218,7 @@ jQuery.extend({ } else { // Otherwise, do a traditional filter check for // ID, class, and element selectors - re2 = new RegExp("^([#.]?)(" + jQuery.chars + "*)"); + re2 = quickClass; m = re2.exec(t); } @@ -213,7 +227,7 @@ jQuery.extend({ var elem = ret[ret.length-1]; // Try to do a global search by ID, where we can - if ( m[1] == "#" && elem && elem.getElementById ) { + if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) { // Optimization for HTML document case var oid = elem.getElementById(m[2]); @@ -230,7 +244,7 @@ jQuery.extend({ // We need to find all descendant elements for ( var i = 0; ret[i]; i++ ) { // Grab the tag name being searched for - var tag = m[1] != "" || m[0] == "" ? "*" : m[2]; + var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2]; // Handle IE7 being really dumb about s if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" ) @@ -339,7 +353,7 @@ jQuery.extend({ for ( var i = 0, rl = r.length; i < rl; i++ ) { var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ]; - if ( z == null || /href|src/.test(m[2]) ) + if ( z == null || /href|src|selected/.test(m[2]) ) z = jQuery.attr(a,m[2]) || ''; if ( (type == "" && !!z || @@ -395,7 +409,7 @@ jQuery.extend({ f = jQuery.expr[m[1]][m[2]]; // Build a custom macro to enclose it - eval("f = function(a,i){return " + f + "}"); + f = eval("false||function(a,i){return " + f + "}"); // Execute it against the current filter r = jQuery.grep( r, f, not ); @@ -407,15 +421,6 @@ jQuery.extend({ return { r: r, t: t }; }, - /** - * All ancestors of a given element. - * - * @private - * @name $.parents - * @type Array - * @param Element elem The element to find the ancestors of. - * @cat DOM/Traversing - */ parents: function( elem ){ var matched = []; var cur = elem.parentNode; @@ -426,18 +431,6 @@ jQuery.extend({ return matched; }, - /** - * A handy, and fast, way to traverse in a particular direction and find - * a specific element. - * - * @private - * @name $.nth - * @type DOMElement - * @param DOMElement cur The element to search from. - * @param String|Number num The Nth result to match. Can be a number or a string (like 'even' or 'odd'). - * @param String dir The direction to move in (pass in something like 'previousSibling' or 'nextSibling'). - * @cat DOM/Traversing - */ nth: function(cur,result,dir,elem){ result = result || 1; var num = 0; @@ -449,15 +442,6 @@ jQuery.extend({ return cur; }, - /** - * All elements on a specified axis. - * - * @private - * @name $.sibling - * @type Array - * @param Element elem The element to find all the siblings of (including itself). - * @cat DOM/Traversing - */ sibling: function( n, elem ) { var r = [];