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 相关文章推荐
event.srcElement 用法笔记e.target
Dec 18 Javascript
前端开发的开始---基于面向对象的Ajax类
Sep 17 Javascript
给文字加上着重号的JS代码
Nov 12 Javascript
Angularjs中如何使用filterFilter函数过滤
Feb 06 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
Jun 21 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
WebSocket实现简单客服聊天系统
May 12 Javascript
微信小程序 rich-text的使用方法
Aug 04 Javascript
javaScript产生随机数的用法小结
Apr 21 Javascript
JavaScript设计模式之代理模式简单实例教程
Jul 03 Javascript
inquirer.js一个用户与命令行交互的工具详解
May 18 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
php实现文件上传基本验证
2020/03/04 PHP
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
python openCV自制绘画板
2020/10/27 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
八年级历史教学反思
2014/01/10 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
英语课外活动总结
2014/08/27 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
各种货币符号快捷输入
2022/02/17 杂记