📄 selector-beta.js
字号:
return result;};var rTestNode = function(node, selector, token, deDupe) { token = token || tokenize(selector).pop() || {}; if (!node.tagName || (token.tag !== '*' && node.tagName.toUpperCase() !== token.tag) || (deDupe && node._found) ) { return false; } if (token.attributes.length) { var attribute; for (var i = 0, len = token.attributes.length; i < len; ++i) { attribute = node.getAttribute(token.attributes[i][0], 2); if (attribute === null || attribute === undefined) { return false; } if ( Selector.operators[token.attributes[i][1]] && !Selector.operators[token.attributes[i][1]](attribute, token.attributes[i][2])) { return false; } } } if (token.pseudos.length) { for (var i = 0, len = token.pseudos.length; i < len; ++i) { if (Selector.pseudos[token.pseudos[i][0]] && !Selector.pseudos[token.pseudos[i][0]](node, token.pseudos[i][1])) { return false; } } } return (token.previous && token.previous.combinator !== ',') ? combinators[token.previous.combinator](node, token) : true;};var foundCache = [];var parentCache = [];var regexCache = {};var clearFoundCache = function() { for (var i = 0, len = foundCache.length; i < len; ++i) { try { // IE no like delete delete foundCache[i]._found; } catch(e) { foundCache[i].removeAttribute('_found'); } } foundCache = [];};var clearParentCache = function() { if (!document.documentElement.children) { // caching children lookups for gecko return function() { for (var i = 0, len = parentCache.length; i < len; ++i) { delete parentCache[i]._children; } parentCache = []; }; } else return function() {}; // do nothing}();var getRegExp = function(str, flags) { flags = flags || ''; if (!regexCache[str + flags]) { regexCache[str + flags] = new RegExp(str, flags); } return regexCache[str + flags];};var combinators = { ' ': function(node, token) { while (node = node.parentNode) { if (rTestNode(node, '', token.previous)) { return true; } } return false; }, '>': function(node, token) { return rTestNode(node.parentNode, null, token.previous); }, '+': function(node, token) { var sib = node.previousSibling; while (sib && sib.nodeType !== 1) { sib = sib.previousSibling; } if (sib && rTestNode(sib, null, token.previous)) { return true; } return false; }, '~': function(node, token) { var sib = node.previousSibling; while (sib) { if (sib.nodeType === 1 && rTestNode(sib, null, token.previous)) { return true; } sib = sib.previousSibling; } return false; }};var getChildren = function() { if (document.documentElement.children) { // document for capability test return function(node, tag) { return (tag) ? node.children.tags(tag) : node.children || []; }; } else { return function(node, tag) { if (node._children) { return node._children; } var children = [], childNodes = node.childNodes; for (var i = 0, len = childNodes.length; i < len; ++i) { if (childNodes[i].tagName) { if (!tag || childNodes[i].tagName.toLowerCase() === tag) { children[children.length] = childNodes[i]; } } } node._children = children; parentCache[parentCache.length] = node; return children; }; }}();/* an+b = get every _a_th node starting at the _b_th 0n+b = no repeat ("0" and "n" may both be omitted (together) , e.g. "0n+1" or "1", not "0+1"), return only the _b_th element 1n+b = get every element starting from b ("1" may may be omitted, e.g. "1n+0" or "n+0" or "n") an+0 = get every _a_th element, "0" may be omitted */var getNth = function(node, expr, tag, reverse) { if (tag) tag = tag.toLowerCase(); reNth.test(expr); var a = parseInt(RegExp.$1, 10), // include every _a_ elements (zero means no repeat, just first _a_) n = RegExp.$2, // "n" oddeven = RegExp.$3, // "odd" or "even" b = parseInt(RegExp.$4, 10) || 0, // start scan from element _b_ result = []; var siblings = getChildren(node.parentNode, tag); if (oddeven) { a = 2; // always every other op = '+'; n = 'n'; b = (oddeven === 'odd') ? 1 : 0; } else if ( isNaN(a) ) { a = (n) ? 1 : 0; // start from the first or no repeat } if (a === 0) { // just the first if (reverse) { b = siblings.length - b + 1; } if (siblings[b - 1] === node) { return true; } else { return false; } } else if (a < 0) { reverse = !!reverse; a = Math.abs(a); } if (!reverse) { for (var i = b - 1, len = siblings.length; i < len; i += a) { if ( i >= 0 && siblings[i] === node ) { return true; } } } else { for (var i = siblings.length - b, len = siblings.length; i >= 0; i -= a) { if ( i < len && siblings[i] === node ) { return true; } } } return false;};var getId = function(attr) { for (var i = 0, len = attr.length; i < len; ++i) { if (attr[i][0] == 'id' && attr[i][1] === '=') { return attr[i][2]; } }};var getIdTokenIndex = function(tokens) { for (var i = 0, len = tokens.length; i < len; ++i) { if (getId(tokens[i].attributes)) { return i; } } return -1;};var patterns = { tag: /^((?:-?[_a-z]+[\w-]*)|\*)/i, attributes: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i, //attributes: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^'"\]]*)['"]?\]*/i, pseudos: /^:([-\w]+)(?:\(['"]?(.+)['"]?\))*/i, combinator: /^\s*([>+~]|\s)\s*/};/** Break selector into token units per simple selector. Combinator is attached to left-hand selector. */var tokenize = function(selector) { var token = {}, // one token per simple selector (left selector holds combinator) tokens = [], // array of tokens id, // unique id for the simple selector (if found) found = false, // whether or not any matches were found this pass match; // the regex match selector = replaceShorthand(selector); // convert ID and CLASS shortcuts to attributes /* Search for selector patterns, store, and strip them from the selector string until no patterns match (invalid selector) or we run out of chars. Multiple attributes and pseudos are allowed, in any order. for example: 'form:first-child[type=button]:not(button)[lang|=en]' */ do { found = false; // reset after full pass for (var re in patterns) { if (!YAHOO.lang.hasOwnProperty(patterns, re)) { continue; } if (re != 'tag' && re != 'combinator') { // only one allowed token[re] = token[re] || []; } if (match = patterns[re].exec(selector)) { // note assignment found = true; if (re != 'tag' && re != 'combinator') { // only one allowed //token[re] = token[re] || []; // capture ID for fast path to element if (re === 'attributes' && match[1] === 'id') { token.id = match[3]; } token[re].push(match.slice(1)); } else { // single selector (tag, combinator) token[re] = match[1]; } selector = selector.replace(match[0], ''); // strip current match from selector if (re === 'combinator' || !selector.length) { // next token or done token.attributes = fixAttributes(token.attributes); token.pseudos = token.pseudos || []; token.tag = token.tag ? token.tag.toUpperCase() : '*'; tokens.push(token); token = { // prep next token previous: token }; } } } } while (found); return tokens;};var fixAttributes = function(attr) { var aliases = Selector.attrAliases; attr = attr || []; for (var i = 0, len = attr.length; i < len; ++i) { if (aliases[attr[i][0]]) { // convert reserved words, etc attr[i][0] = aliases[attr[i][0]]; } if (!attr[i][1]) { // use exists operator attr[i][1] = ''; } } return attr;};var replaceShorthand = function(selector) { var shorthand = Selector.shorthand; var attrs = selector.match(patterns.attributes); // pull attributes to avoid false pos on "." and "#" if (attrs) { selector = selector.replace(patterns.attributes, 'REPLACED_ATTRIBUTE'); } for (var re in shorthand) { if (!YAHOO.lang.hasOwnProperty(shorthand, re)) { continue; } selector = selector.replace(getRegExp(re, 'gi'), shorthand[re]); } if (attrs) { for (var i = 0, len = attrs.length; i < len; ++i) { selector = selector.replace('REPLACED_ATTRIBUTE', attrs[i]); } } return selector;};Selector = new Selector();Selector.patterns = patterns;Y.Selector = Selector;if (YAHOO.env.ua.ie) { // rewrite class for IE (others use getAttribute('class') Y.Selector.attrAliases['class'] = 'className'; Y.Selector.attrAliases['for'] = 'htmlFor';}})();YAHOO.register("selector", YAHOO.util.Selector, {version: "2.6.0", build: "1321"});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -