- 浏览: 1460340 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
当然,现代的库都判断了浏览器是否实现了 w3c selector-api
,如果没有才采用下面的方法,目前只有ie系列会执行了。
以前分析过 extjs 的css 选择器实现 ,也粗略看过 jquery的css 选择器实现,这次又看了 yui3的选择器实现,发现每种实现都不同,而yui3或许不是效率最高的一个,却是实现起来最简单的一个。
Extjs 与 Jquery
extjs ,jquery都是属于自顶向下的分析方法,不同之处在于jquery将复杂选择符分解为简单单元后直接开始查找,去重,而extjs则分为编译与执行两个阶段,编译期生成对应选择器的dom操作函数,执行器直接执行生成函数即可:
div span
jquery 每次都分析选择器字符串,如分解为为["div","span"],然后再找到页面所有 div,再对这些div的所有子孙span进行合并去重得到最终结果。
extjs 则只有在第一次分析选择符字符串,生成了下列命令组成的函数:
alert(Ext.DomQuery.compile("div span")); //解析 selector 字串在编译期已经做了 //递归也不需要,直接生成调用序列 function (root) { var mode; ++batch; var n = root || document; //获取元素 n = getNodes(n, mode, "div"); mode = ""; n = getNodes(n,mode, "span"); //过滤元素 return nodup(n); }
以后每次相同的选择器字符串只需直接执行函数即可。
对于复杂的选择符,extjs,jquery都需要经过分析,选择,合并,过滤,去重 的阶段。
YUI3 css selector :
而 yui3 选择了同以上两者都不同的策略,即自底向上的分析方法,降低了难度,对于
div span
首先分解出单元选择器 ["div","span"] (每个单元有复杂的数据结构),然后取出文档中的所有span元素,再对这些span元素进行过滤,条件为是否父(祖先)元素为div。只需执行过滤操作即可,没有必要执行合并与去重操作。
总体来说:yui3 包括 分析与选择,过滤 阶段。代码包括:dom-debug.js,selector-css3-debug.js
分析:
Y.Selector._tokenize 函数,将选择符分解为 combinator 分割的简单选择符,combinator 在css2下面包括
combinators: { ' ': { axis: 'parentNode' }, '>': { axis: 'parentNode', direct: true }, '+': { axis: 'previousSibling', direct: true } },
并将它们对应到相应的dom节点的运动方位。
对应简单的选择符yui3其实就分为三类:
属性选择符,其中id,class被简化到这个类别
{ name: ATTRIBUTES, re: /^\[(-?[a-z]+[\w\-]*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i, fn: function(match, token) { var operator = match[2] || '', operators = Y.Selector.operators, test; // add prefiltering for ID and CLASS if ((match[1] === 'id' && operator === '=') || (match[1] === 'className' && document.documentElement.getElementsByClassName && (operator === '~=' || operator === '='))) { token.prefilter = match[1]; token[match[1]] = match[3]; } // add tests if (operator in operators) { test = operators[operator]; if (typeof test === 'string') { match[3] = match[3].replace(Y.Selector._reRegExpTokens, '\\$1'); test = Y.DOM._getRegExp(test.replace('{val}', match[3])); } match[2] = test; } if (!token.last || token.prefilter !== match[1]) { return match.slice(1); } } }
标签选择符
{ name: TAG_NAME, re: /^((?:-?[_a-z]+[\w-]*)|\*)/i, fn: function(match, token) { var tag = match[1].toUpperCase(); token.tagName = tag; if (tag !== '*' && (!token.last || token.prefilter)) { return [TAG_NAME, '=', tag]; } if (!token.prefilter) { token.prefilter = 'tagName'; } } }
伪类选择符
{ name: PSEUDOS, re: /^:([\-\w]+)(?:\(['"]?(.+)['"]?\))*/i, fn: function(match, token) { var test = Selector[PSEUDOS][match[1]]; if (test) { // reorder match array return [match[2], test]; } else { // selector token not supported (possibly missing CSS3 module) return false; } } }
其中的re即为分解选择符时用到的正则表达式,而fn则是附加到简单的选择符上面,用来过滤阶段的判断。
而 伪类和 combinator以及属性判断操作符都是动态从集合中取得:
//伪类对应过滤操作方式 Selector[PSEUDOS] //连接符 combinators: { 对应元素与对应dom方位操作 } //属性判断操作符对应正则式 operators[operator]
则这就是yui3 css选择器部分的扩展机制 ,例如selector-css3-debug.js就是扩展了上述三者:
则最后给个复杂例子,如
#id1 div > a[href~='yiminghe'].ovcls
根据连接符则分为三个简单选择符:
每个结构的tests即为当前的过滤条件,而combinator即为通过当前过滤条件后的下一个将要检测的节点。注意direct属性,若direct为true,则表示失败后,结束,而direct为false,则表述还可以继续循着这个方向检测,如
" " direct为false,则父节点检测失败后,可以继续检测祖父节点。如 div span, 假设dom树中 span的父节点为 td,则如果td的父节点为div也是可以的。而 ">" direct就为true了,表示父节点不通过,这个节点就被过滤掉了。
选择过滤阶段:
分析出简单选择符后就简单了,Y.Selector._bruteQuery函数:取出最后一个简单选择符的对应文档元素 ,这步可以利用 id,tag,以及class(支持getElementsByClassName)。
剩下的就是单纯过滤了:
Y.Selector._filterNodes函数:
对选择阶段选出的所有元素,按简单选择符从后往前根据combinator定方位来变换检测节点,以及根据tests检测是否符合简单选择符,若一直到第1个简单选择符都符合,则当前节点保留,否则就过滤掉了。
发表评论
-
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8619模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5359目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6028看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7375promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1784为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2845简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2846场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2268分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7047作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2475这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2167事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1657一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 5151随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2657@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2223由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1587很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1815yui3 的沙箱机制可以在 ... -
yui3下的load事件触发
2010-06-01 13:31 3224以前的一些总结:页面l ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 2001YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2780资料: 关于新发 ...
相关推荐
此外,YUI还支持预处理器和后处理器,可以与其他工具(如CSS预处理器Sass或Less)配合使用,实现更复杂的构建流程。 总结来说,YUI JS CSS 打包工具是Web开发者优化前端资源的利器,通过压缩和合并JS与CSS文件,...
3. **CSS选择器合并**:YUI Compressor 不会合并CSS选择器,为了更高效的压缩,可以考虑使用额外的工具如CSSComb或Clean-CSS。 总之,YUI Compressor 是一个强大且实用的前端开发工具,能够帮助优化网站性能,减少...
同时,它还会优化选择器顺序,删除未使用的样式,使得CSS更加精简。 4. **错误检测**:在压缩过程中,`yuicompressor`会尝试检测潜在的JavaScript语法错误,帮助开发者在部署前发现和修复问题。 5. **命令行接口**...
首先,YUI Compressor 2.4.7是一个轻量级的Java应用程序,它能解析JavaScript和CSS文件,删除不必要的空格、注释和换行,甚至应用一些代码优化,如合并相邻的选择器。这个版本的YUI Compressor已经足够成熟,能够...
无论是从设计理念的转变、UI框架的选择,还是前后端架构的设计、前端模板语言的应用,再到CSS3 Transform & Transition的灵活运用和多点触控API的支持,每一步都是为了打造出更加流畅、直观且响应迅速的Web应用。...
它是一款开源的 JavaScript 和 CSS 压缩器,由 Jakob Jenkov 创建,并在 Yahoo! 的开源项目下维护。YUI Compressor 使用 Java 编写,通过删除不必要的空格、注释和换行,以及进行变量名混淆来达到压缩效果。此外,它...
对于CSS文件,YUI Compressor会删除不必要的空白、换行符和注释,同时进行CSS优化,如合并选择器。对于JavaScript文件,除了压缩外,它还能检测并修复一些常见的语法错误。 在Ant中集成YUI Compressor,可以创建一...
6. **用户界面组件**:包括按钮、表单、布局、表格、菜单、日期选择器等多种UI组件,帮助快速构建交互丰富的界面。 7. **IO与Ajax**:提供了强大的网络通信功能,如XMLHttpRequest、JSONP、跨域请求等,方便与...
YUI还提供了丰富的组件库,包括按钮、表格、日期选择器、菜单等,这些组件不仅具有良好的交互体验,而且易于定制和扩展。例如,例子中可能用到了“yui-button”来创建交互式的按钮,或者使用“yui-menu”构建导航...
2. **简化选择器**:冗余或者复杂的CSS选择器会被简化,如 `.class .child` 可能会被优化为 `.class>child`。 3. **合并重复规则**:如果多个规则有相同的属性,压缩工具会将它们合并为一条规则。 4. **移除未使用的...
同时,yuicompressor还支持CSS压缩,通过对CSS选择器和值进行压缩,同样能有效减少文件大小。 在使用yuicompressor时,开发者可以通过命令行或者集成到IDE(如IntelliJ IDEA,简称Idea)中来操作。对于Idea用户,...
3. **CSS样式工具**:YUI3包含了一套CSS工具,如样式类名管理器(YUI.addClass, YUI.removeClass等),这有助于在JavaScript中动态控制元素的样式。 4. **DOM操作**:YUI3提供了丰富的DOM操作接口,如查找元素(YUI...
`selector`模块是YUI中的CSS选择器引擎,它实现了W3C的CSS Selectors Level 3标准,使得开发者能够方便地选取页面上的元素。`event-delegate`模块则提供了事件委托功能,提高了性能,尤其是在处理大量动态生成的元素...
它会删除不必要的空白符和注释,合并选择器,并优化颜色值和URL等。这有助于减少CSS文件的大小,加快页面样式加载速度。 **使用方法** 使用YUI Compressor非常简单,你可以通过命令行界面或集成到构建系统中。在...
YUI3提供了强大的DOM操作API,包括选择元素、创建元素、修改属性、插入和删除节点等。这些方法与jQuery类似,但YUI3的设计更加面向对象,如`Node`和`Selector`模块,它们提供了更加高效和灵活的方式来处理DOM元素。 ...
2. **压缩CSS**:对于CSS文件,YUI Compressor同样会去除空格、换行和注释,而且会处理CSS中的选择器,使其更紧凑,减少重复。 3. **混淆JavaScript变量名**:在保持代码功能不变的前提下,YUI Compressor还可以将...
yuicompressor是一款由Yahoo开发的JavaScript和CSS压缩工具,它能够删除代码中的空格、注释以及简化CSS选择器,从而减小文件大小,提高网页加载速度。而Ant是Apache组织开发的一款Java构建工具,它通过XML配置文件来...
7. **Selector**:高性能的CSS选择器引擎,支持复杂的DOM选择。 8. **App**:用于构建单页应用(SPA)的框架,支持路由管理、视图切换等。 四、YUI的使用与学习 学习YUI,首先需要掌握JavaScript基础知识,然后...
- **Selector**: 选择器引擎,提供了类似jQuery的选择器功能,方便选取DOM元素。 - **Utilities**: 工具函数集合,包含许多实用的JavaScript辅助方法,如字符串处理、数组操作等。 **4. 实例与应用** 雅虎YUI组件...