[转帖]Mootools源码分析-23 -- Selectors-2
原帖地址: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相关推荐
- [转帖]Mootools源码分析-49 -- Asset
原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-410355 原作者:我佛山人 代码 //脚本,样式和图片的 ...
- [转帖]Mootools源码分析-02 -- Utils
原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-400118 原作者:我佛山人 //检查对象是否已经定义或者 ...
- [转帖]Mootools源码分析-04 -- Array
//对数组的扩展实现Array.implement({ //迭代方法,call的使用 forEach: function(fn, bind) {for (var i =0, l =this.lengt ...
- [转帖]Mootools源码分析-03 -- Hash
//哈希表,Native化作为内置对象var Hash =new Native({ //族名,类名,用于$type方法的精准类型判断 name: 'Hash', initialize: functio ...
- Virtualbox源码分析23 NEM(Hyper-V兼容)4 VMExit
Native execution manager (VMExit) 文章目录 Native execution manager (VMExit) 23.1 EPT内存管理 23.1.1分配内存 23. ...
- apache dubbo 源码分析系列汇总
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.后面捐献给了知名的开源社区 ...
- glibc-2.23学习笔记(二)—— free部分源码分析
glibc-2.23学习笔记(二)-- free部分源码分析 _libc_free _int_free 函数定义 局部变量 start fast bins部分 unsorted bins部分 mmap ...
- glibc-2.23学习笔记(一)—— malloc部分源码分析
glibc-2.23学习笔记(一)-- malloc部分源码分析 搭建Glibc源码调试环境 1.下载并解压glibc源码 2.配置gdb 3.编译测试程序 第一次调用 源码分析 __libc_mal ...
- MooTools 1.4 源码分析 - (关于Core、Type等模块分析)
MooTools由1.3升级到1.4的过程中,这几个核心模块只有String模块和Event模块(现在已修改为DOMEvent)做了比较大的修改,这几个模块源码的分析参考 棍子上的萝卜 所写的 ...
- 【SemiDrive源码分析】【X9芯片启动流程】23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇
[SemiDrive源码分析][X9芯片启动流程]23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇 一.RPMSG 接口 1.1 Linux Kern ...
最新文章
- Script:列出数据库中子表上没有对应索引的外键
- VMware 收购 Kubernetes 初创公司 Heptio
- 使用Java VisualVM监控远程JVM
- python如何进行数据抓取_如何进行手机APP的数据爬取?
- 数学建模学习笔记——图论最短路径
- Apache Flink 零基础入门(十三)Flink 计数器
- java gettime_Java Util.getTime方法代码示例
- 用杰克逊流式传输大型JSON文件– RxJava常见问题解答
- modifying的博客
- YII 规则rule 里面 min,max 提示错误信息
- 大数据学习笔记07:分布式文件系统HDFS
- 在centos上完全删除mysql
- 一文搞懂Java泛型到底是什么东东
- 【lol版】2022年最新Java学习路线图(来自动力节点)
- 基于android的影音设计,基于Android系统的影音播放器设 - 音响技术 - 电子发烧友网...
- 图形验证码接口及其重构思想
- 单片机 脉搏心率检测 MSP430G2553 Pulse Sensor 红外对射
- OpenHarmony驱动子系统开发
- ajax与spry的关系,用Spry框架来简化AJAX
- 那些逝去的岁月-性格分析