如今主流的JS框架要数ExtJs和JQuery应用的比較广泛。JQuery属于轻量级的,一般做站点应用比較常见。可见块头小的优势。
ExtJs比較庞大,它除了对主要的JS语法和HTML DOM操作方式的封装之外。还提供了一套强大的UI库。在企业级B/S解决方式应用上独占优势。就单说它在原生JS的封装,DOM操作方式封装方面也足以轻蔑JQuery。以下我就通过对照API,体现两种框架的异曲同工之处。我们已JQuery API为主线,来看看ExtJs是否有替代的方案。
注意一点:ExtJs4.0相对上一版本号修改较大,本系列文章临时仅仅对ExtJs4.0及以上版本号提供支持。
一、选择器
1.上下文选择器对照
JS对HTML节点的操作比較频繁。所以要常常定位和查询DOM元素。
我们分别看看两种框架的实现
获取Id="div1"的DOM元素:
[JQuery]
以下是一个完整的比較代码:
[ExtJs]2.选择器语法简单介绍
JQuery选择器支持CSS3选择符。ExtJs相同也提供支持。除此之外还支持主要的XPath语法。以下分别解说:
1)CSS3选择符
以下列举的命令是单个形式,都能够无限组合使用。
元素选择符:
-
随意元素
- E 一个标签为 E 的元素
- E F 全部 E 元素的分支元素中含有标签为 F 的元素
- E > F 或 E/F 全部 E 元素的直系子元素中含有标签为 F 的元素
- E + F 全部标签为 F 并紧随着标签为 E 的元素之后的元素
- E ~ F 全部标签为 F 并与标签为 E 的元素是側边的元素
属性选择符:
@ 与引號的使用是可选的。比如:div[@foo='bar'] 也是一个有效的属性选择符。
- E[foo] 拥有一个名为 “foo” 的属性
- E[foo=bar] 拥有一个名为 “foo” 且值为 “bar” 的属性
- E[foo^=bar] 拥有一个名为 “foo” 且值以 “bar” 开头的属性
- E[foo$=bar] 拥有一个名为 “foo” 且值以 “bar” 结尾的属性 =bar] 拥有一个名为 “foo” 且值包括字串 “bar” 的属性
- E[foo%=2] 拥有一个名为 “foo” 且值可以被2整除的属性
- E[foo!=bar] 拥有一个名为 “foo” 且值不为 “bar” 的属性
伪类:
- E:first-child E 元素为其父元素的第一个子元素
- E:last-child E 元素为其父元素的最后一个子元素
- E:nth-child(n) E 元素为其父元素的第 n 个子元素(由1開始的个数)
- E:nth-child(odd) E 元素为其父元素的奇数个数的子元素
- E:nth-child(even) E 元素为其父元素的偶数个数的子元素
- E:only-child E 元素为其父元素的唯一子元素
- E:checked E 元素为拥有一个名为“checked”且值为“true”的元素(比如:单选框或复选框)
- E:first 结果集中第一个 E 元素
- E:last 结果集中最后一个 E 元素
- E:nth(n) 结果集中第 n 个 E 元素(由1開始的个数)
- E:odd :nth-child(odd) 的简写
- E:even :nth-child(even) 的简写
- E:contains(foo) E 元素的 innerHTML 属性中包括“foo”字串
- E:nodeValue(foo) E 元素包括一个 textNode 节点且 nodeValue 等于“foo”
- E:not(S) 一个与简单选择符 S 不匹配的 E 元素
- E:has(S) 一个包括与简单选择符 S 相匹配的分支元素的 E 元素
- E:next(S) 下一个側边元素为与简单选择符 S 相匹配的 E 元素
- E:prev(S) 上一个側边元素为与简单选择符 S 相匹配的 E 元素
CSS 值选择符:
- E{display=none} css 的“display”属性等于“none”
- E{display^=none} css 的“display”属性以“none”開始
- E{display$=none} css 的“display”属性以“none”结尾 =none} css 的“display”属性包括字串“none”
- E{display%=2} css 的“display”属性可以被2整除
- E{display!=none} css 的“display”属性不等于“none”
2)XPath语法
以下通过几个样例来说明:
/html/body/div/div :从根文件夹開始找。找到正文的第二层所有DIV。
div/div :在全文匹配DIV元素。并获取包括子DIV的所有子DIV集合。
3.Ext.get和Ext.fly的差别:
通俗点讲,他们的作用都是一样的。都是获取元素。可是前者每次调用都会生成一个Ext.Element对象。开辟新的内存空间,而后者共享了一个公用的内存空间,每次调用都会覆盖前一次的信息。因为Ext.Element 比較庞大。后者的优点是能够节省资源。假设你获取的Ext.Element 不须要长期保持反复调用。用后者较为合理。以下通过一个样例来体现他们的差别:
get(el ) :Ext.dom.Element使用了缓存机制来提升获取DOM节点的效率
fly(dom, [named] ) :Ext.dom.Element.Fly使用了JavaScript经典的享元模式来提升效率,从而节约内存,更加低碳化
//这样更新的是div1 var div1 = Ext.get("div1"); var div2 = Ext.get("div2"); div1.update("我想更新div1"); //将get替换成fly后.... //更新的却是div2 var div1 = Ext.fly("div1"); var div2 = Ext.fly("div2"); div1.update("我想更新div1");
我们发现,再次调用Ext.fly后,更新的是DIV2,而再次调用Ext.get不会影响更新的元素。
另外我们在这里再提一下getDom(el ) : Object
它很适合直接获取页面元素,并返回的就是DOM元素,假设你想操作DOM元素的属性。那这种方法是最好只是的咯。
二、属性
注意:CSS类操作的几个方法相对于早期版本号有变化之前是:e.addClass("c2")
[JQuery][ExtJs]
四、筛选
[JQuery][ExtJs]
select(selector, [unique] ) : 返回Ext.CompositeElement(Ext.dom.Element集合)
五、文档处理
[JQuery][ExtJs]
六、CSS
[JQuery]var e = $("div1");
//设置样式
e.css("width", "550px");
e.css("position", "absolute");
//设置高度
e.height(100);
//获取宽度
e.width();
[ExtJs]
七、事件
[JQuery][ExtJs]