原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-404235

原作者:我佛山人

//根据四种操作符查找
Selectors.Getters = {
    //空格,表示根据标签名和id的常规查找
    ' ': function(found, self, tag, id, uniques)    {
        var items = Selectors.Utils.getByTagAndID(self, tag, id);
        for (var i = 0, l = items.length; i < l; i++)    {
            var item = items[i];
            if (Selectors.Utils.chk(item, uniques)) found.push(item);
        }
        return found;
    },

//大于号>表示子节点的查找
    '>': function(found, self, tag, id, uniques)    {
        var children = Selectors.Utils.getByTagAndID(self, tag, id);
        for (var i = 0, l = children.length; i < l; i++)    {
            var child = children[i];
            if (child.parentNode == self && Selectors.Utils.chk(child, uniques))    found.push(child);
        }
        return found;
    },

//加号+表示后兄弟节点的查找
    '+': function(found, self, tag, id, uniques)    {
        while ((self = self.nextSibling))    {
            if (self.nodeType == 1)    {
                if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id))
                    found.push(self);
                break;
            }
        }
        return found;
    },

//波浪号~表示后兄弟节点的查找
    '~': function(found, self, tag, id, uniques)    {
        while ((self = self.nextSibling))    {
            if (self.nodeType == 1)    {
                if (!Selectors.Utils.chk(self, uniques))    break;
                if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id))    found.push(self);
            } 
        }
        return found;
    }
};

//过滤器
Selectors.Filters = {
    //根据标签过滤
    byTag: function(self, tag)    {
        return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag));
    },

//根据id过滤
    byID: function(self, id)    {
        return (!id || (self.id && self.id == id));
    },

//根据CSS类名过滤
    byClass: function(self, klass)    {
        return (self.className && self.className.contains(klass, ' '));
    },

//根据伪类过滤
    byPseudo: function(self, parser, argument, local)    {
        return parser.call(self, argument, local);
    },

//根据属性过滤
    byAttribute: function(self, name, operator, value)    {
        //获取属性值
        var result = Element.prototype.getProperty.call(self, name);
        if (!result)    return false;
        if (!operator || value == undefined)    return true;
        //属性值运算
        switch (operator)    {
        //相等
        case '=': return (result == value);
        //包含
        case '*=': return (result.contains(value));
        //打头
        case '^=': return (result.substr(0, value.length) == value);
        //结尾
        case '$=': return (result.substr(result.length - value.length) == value);
        //不等
        case '!=': return (result != value);
        //空格分隔包含
        case '~=': return result.contains(value, ' ');
        //连接符分隔包含
        case '|=': return result.contains(value, '-');
        }
        return false;
    }
};

//伪类查找
Selectors.Pseudo = new Hash({
    // w3c pseudo selectors
    //:empty,匹配不包含文本的节点
    empty: function()    {
        return !(this.innerText || this.textContent || '').length;
    },

//:not,匹配非指定标签
    not: function(selector)    {
        return !Element.match(this, selector);
    },

//:contains,匹配节点内容中包含指定字符的节点
    contains: function(text)    {
        return (this.innerText || this.textContent || '').contains(text);
    },

//:first-child,匹配第一个节点
    'first-child': function()    {
        return Selectors.Pseudo.index.call(this, 0);
    },

//:last-child,匹配最后一个节点
    'last-child': function()    {
        var element = this;
        while ((element = element.nextSibling))    {
            if (element.nodeType == 1) return false;
        }
        return true;
    },

//:only-child,匹配一个子节点类型全为Element的节点
    'only-child': function()    {
        var prev = this;
        while ((prev = prev.previousSibling))    {
            if (prev.nodeType == 1)    return false;
        }
        var next = this;
        while ((next = next.nextSibling))    {
            if (next.nodeType == 1)    return false;
        }
        return true;
    },

//:nth-child,匹配第n个节点
    'nth-child': function(argument, local)    {
        argument = (argument == undefined) ? 'n' : argument;
        var parsed = Selectors.Utils.parseNthArgument(argument);
        //非nth伪类的处理转移
        if (parsed.special != 'n')    return Selectors.Pseudo[parsed.special].call(this, parsed.a, local);
        var count = 0;
        local.positions = local.positions || {};
        var uid = $uid(this);
        //如果没有位置标记的记录
        if (!local.positions[uid])    {
            var self = this;
            //查找前面的兄弟节点
            while ((self = self.previousSibling))    {
                //忽略非Element节点
                if (self.nodeType != 1)    continue;
                count ++;
                var position = local.positions[$uid(self)];
                //如果有标记了位置的兄弟节点,加上位置后即可跳出循环
                if (position != undefined)    {
                    count = position + count;
                    break;
                }
            }
            local.positions[uid] = count;
        }
        //a*n + b的判断,可由count = a*n + b推出
        return (local.positions[uid] % parsed.a == parsed.b);
    },

// custom pseudo selectors
    //:index,匹配指定索引的节点
    index: function(index)    {
        var element = this, count = 0;
        //向前步进计算当前索引
        while ((element = element.previousSibling))    {
            if (element.nodeType == 1 && ++count > index)    return false;
        }
        return (count == index);
    },

//:even,匹配索引为偶数的节点
    even: function(argument, local)    {
        return Selectors.Pseudo['nth-child'].call(this, '2n+1', local);
    },

//:odd,匹配索引为奇数的节点
    odd: function(argument, local)    {
        return Selectors.Pseudo['nth-child'].call(this, '2n', local);
    }
})

转载于:https://www.cnblogs.com/maapaa/articles/mootools-s-23.html

[转帖]Mootools源码分析-23 -- Selectors-2相关推荐

  1. [转帖]Mootools源码分析-49 -- Asset

    原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-410355 原作者:我佛山人 代码 //脚本,样式和图片的 ...

  2. [转帖]Mootools源码分析-02 -- Utils

    原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-400118 原作者:我佛山人 //检查对象是否已经定义或者 ...

  3. [转帖]Mootools源码分析-04 -- Array

    //对数组的扩展实现Array.implement({ //迭代方法,call的使用 forEach: function(fn, bind) {for (var i =0, l =this.lengt ...

  4. [转帖]Mootools源码分析-03 -- Hash

    //哈希表,Native化作为内置对象var Hash =new Native({ //族名,类名,用于$type方法的精准类型判断 name: 'Hash', initialize: functio ...

  5. Virtualbox源码分析23 NEM(Hyper-V兼容)4 VMExit

    Native execution manager (VMExit) 文章目录 Native execution manager (VMExit) 23.1 EPT内存管理 23.1.1分配内存 23. ...

  6. apache dubbo 源码分析系列汇总

    Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.后面捐献给了知名的开源社区 ...

  7. glibc-2.23学习笔记(二)—— free部分源码分析

    glibc-2.23学习笔记(二)-- free部分源码分析 _libc_free _int_free 函数定义 局部变量 start fast bins部分 unsorted bins部分 mmap ...

  8. glibc-2.23学习笔记(一)—— malloc部分源码分析

    glibc-2.23学习笔记(一)-- malloc部分源码分析 搭建Glibc源码调试环境 1.下载并解压glibc源码 2.配置gdb 3.编译测试程序 第一次调用 源码分析 __libc_mal ...

  9. MooTools 1.4 源码分析 - (关于Core、Type等模块分析)

        MooTools由1.3升级到1.4的过程中,这几个核心模块只有String模块和Event模块(现在已修改为DOMEvent)做了比较大的修改,这几个模块源码的分析参考 棍子上的萝卜 所写的 ...

  10. 【SemiDrive源码分析】【X9芯片启动流程】23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇

    [SemiDrive源码分析][X9芯片启动流程]23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇 一.RPMSG 接口 1.1 Linux Kern ...

最新文章

  1. Script:列出数据库中子表上没有对应索引的外键
  2. VMware 收购 Kubernetes 初创公司 Heptio
  3. 使用Java VisualVM监控远程JVM
  4. python如何进行数据抓取_如何进行手机APP的数据爬取?
  5. 数学建模学习笔记——图论最短路径
  6. Apache Flink 零基础入门(十三)Flink 计数器
  7. java gettime_Java Util.getTime方法代码示例
  8. 用杰克逊流式传输大型JSON文件– RxJava常见问题解答
  9. modifying的博客
  10. YII 规则rule 里面 min,max 提示错误信息
  11. 大数据学习笔记07:分布式文件系统HDFS
  12. 在centos上完全删除mysql
  13. 一文搞懂Java泛型到底是什么东东
  14. 【lol版】2022年最新Java学习路线图(来自动力节点)
  15. 基于android的影音设计,基于Android系统的影音播放器设 - 音响技术 - 电子发烧友网...
  16. 图形验证码接口及其重构思想
  17. 单片机 脉搏心率检测 MSP430G2553 Pulse Sensor 红外对射
  18. OpenHarmony驱动子系统开发
  19. ajax与spry的关系,用Spry框架来简化AJAX
  20. 那些逝去的岁月-性格分析

热门文章

  1. 【Loss】深度学习的多个loss如何平衡?
  2. 在茫茫决策树入门帖里,我强推这篇(附可视化图)
  3. 每日一题[LeetCode 315]计算右侧小于当前元素的个数
  4. TensorFlow函数使用总结
  5. Excel用户如何学习数据分析语言DAX?
  6. 网上商城后台架构设计
  7. 细节也可以决定网站中交互设计的成败
  8. 【数据结构笔记】二叉搜索树及其相关算法
  9. python中列表是什么类型_Python数据类型之列表
  10. 力扣-746. 使用最小花费爬楼梯