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


Posted in Javascript onMarch 22, 2008

先绕开头部很多的 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,今天就先到这里。

Javascript 相关文章推荐
用javascript做拖动布局的思路
May 31 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
Mar 10 Javascript
Knockout visible绑定使用方法
Nov 15 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
Apr 02 Javascript
jQuery实现数秒后自动提交form的方法
Mar 05 Javascript
深入理解JavaScript的React框架的原理
Jul 02 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
Jun 06 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
Oct 24 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
Jul 19 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
May 02 Javascript
Vue.js实现tab切换效果
Jul 24 Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 Javascript
YUI 读码日记之 YAHOO.lang.is*
Mar 22 #Javascript
详解new function(){}和function(){}() 区别分析
Mar 22 #Javascript
Javascript的一种模块模式
Mar 22 #Javascript
javascript cookie解码函数(兼容ff)
Mar 17 #Javascript
简单的JS多重继承示例
Mar 13 #Javascript
JMenuTab简单使用说明
Mar 13 #Javascript
JObj预览一个JS的框架
Mar 13 #Javascript
You might like
PHP setcookie() cannot modify header information 的解决方法
2009/01/09 PHP
解析如何用php screw加密php源代码
2013/06/20 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
网络安全方面的面试题
2016/01/07 面试题
毕业生怎样写好自荐信
2013/11/11 职场文书
物流仓储计划书
2014/01/10 职场文书
优秀学生事迹材料
2014/02/08 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
运动会开幕式致辞
2015/07/29 职场文书
2015年教师节感言
2015/08/03 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python