⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selector-beta.js

📁 这是YUI的源码及相关示例。里面有很多很炫的Javascript效果。
💻 JS
📖 第 1 页 / 共 2 页
字号:
    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 + -