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 相关文章推荐
js 刷新页面的代码小结 推荐
Apr 02 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
Dec 11 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
May 14 Javascript
JavaScript中的关联数组问题
Mar 04 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
Aug 01 Javascript
JS实现自动阅读单词(有道单词本添加功能)
Nov 14 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
详解vue+webpack+express中间件接口使用
Jul 17 Javascript
JavaScript创建防篡改对象的方法分析
Dec 30 Javascript
pm2发布node配置文件ecosystem.json详解
May 15 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
Aug 19 Javascript
JS实现简易日历效果
Jan 25 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
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
php构造函数与析构函数
2016/04/23 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
php事件驱动化设计详解
2016/11/10 PHP
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
javascript模拟命名空间
2015/04/17 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
开业典礼主持词
2014/03/21 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
实习报告怎么写
2019/06/20 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript