当前位置: 首页 > 图文教程 > 网络编程 > Javascript > YUI 读码日记之 YAHOO.util.Dom - Part.1

Javascript
ext实现完整的登录代码
ext form 表单提交数据的方法小结
收藏,对比功能的JS部分实现代码
js可突破windows弹退效果代码
js获取div高度的代码
JS支持带x身份证号码验证函数
javascript的indexOf忽略大小写的方法
js活用事件触发对象动作
Javascript访问html页面的控件的方法详细分析
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
js仿淘宝的拼音检索特效代码
鼠标放上去触发一个javascript提示框效果代码
FF下zoom的替代方案 单位em
json编写简单一例
js取得2008奥运金牌排名
js常用函数2008-8-16整理
一些不错的js函数ajax
javascript:void(0)的真正含义实例分析
解决AJAX中跨域访问出现''没有权限''的错误
比较详细的XMLDOM对象方法详解

Javascript 中的 YUI 读码日记之 YAHOO.util.Dom - Part.1


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 241 ::
收藏到网摘: n/a

DOM 操作是学习 Javascript 很重点的一块。YUI 提供了丰富的 DOM 操作接口,它们定义在 %BUILD%/dom/dom.js 中(封装成 YAHOO.util.Dom)。由于 DOM 操作比较重要,我计划将其分成几个 Part 分析。 先绕开头部很多的 if...else (其实就是定义 toCamel 与 getStyle 两个函数) - 由于浏览器的实现不统一,才造成如此麻烦的情况,回头可以聊聊这些代码。
下面我们在 YAHOO.util.Dom 类中看看有哪些宝藏。目前思想已经逐步的分裂,我看见个函数说个函数。
// 基本上可以认为是 document.getElementById 的翻版
get: function(el) {
// 如果已经是 HTMLElement ,那么就直接返回
if (el && (el.nodeType || el.item)) {
return el;
}
// 如果是字符串,那么就返回有这个 ID 的 Element
if (YAHOO.lang.isString(el) || !el) {
return document.getElementById(el);
}
// 看起来是个数组,循环调用自身,获取 Eelement
if (el.length !== undefined) {
var c = [];
for (var i = 0, len = el.length; i < len; ++i) {
c[c.length] = Y.Dom.get(el[i]);
}
return c;
}
return el;
},这段代码写得非常的精妙。坦白的说,上述代码中的循环体,如果不加思索的话,恐怕就会写成
for (var i = 0, len = el.length; i < len; ++i) {
c[c.length] = document.getElementById(el[i]);
}虽然也能正常工作,但是前面的判断就失去了意义。
继续走马观花,现在看看 getElementsByClassName 的内部机制。有关 getElementsByClassName 的详细调用,可以参看 YUI 文档。
getElementsByClassName: function(className, tag, root, apply) {
// 获取 tag 标签,默认为所有(“*”)
tag = tag || '*';
// 指定跟节点名
root = (root) ? Y.Dom.get(root) : null || document;
if (!root) {
return [];
}
// 初始化节点信息
var nodes = [],
elements = root.getElementsByTagName(tag),
re = getClassRegEx(className);
// 滤掉不符合规则的节点
for (var i = 0, len = elements.length; i < len; ++i) {
if ( re.test(elements[i].className) ) {
// 你一定很奇怪为什么用 nodes.length 而不是用 i
// 仔细考虑下 :^)
nodes[nodes.length] = elements[i];
// 执行回调函数
if (apply) {
apply.call(elements[i], elements[i]);
}
}
}
return nodes;
},教科书式的 DOM 节点获取和过滤,初始化数据以及操作数据都显得非常的严谨而且正规,YUI 的代码让我有几分的“安全感”。类似的,再来一个 getElementsBy 函数,相应代码如下
getElementsBy: function(method, tag, root, apply) {
// 与上述函数相同,略
tag = tag || '*';
root = (root) ? Y.Dom.get(root) : null || document;
if (!root) {
return [];
}
var nodes = [],
elements = root.getElementsByTagName(tag);
for (var i = 0, len = elements.length; i < len; ++i) {
// 根据自定义函数返回值判断节点的属性
if ( method(elements[i]) ) {
nodes[nodes.length] = elements[i];
if (apply) {
apply(elements[i]);
}
}
}
return nodes;
},OK,今天就先到这里。