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 相关文章推荐
jQuery 操作option的实现代码
Mar 03 Javascript
实现点击列表弹出列表索引的两种方式
Mar 08 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
js 获取当前web应用的上下文路径实现方法
Aug 19 Javascript
HTML中使背景图片自适应浏览器大小实例详解
Apr 06 Javascript
微信小程序 空白页重定向解决办法
Jun 27 Javascript
详解JavaScript添加给定的标签选项
Sep 17 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
Dec 17 Javascript
浅谈vue加载优化策略
Mar 19 Javascript
vue 使用高德地图vue-amap组件过程解析
Sep 07 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
分享php邮件管理器源码
2016/01/06 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
python装饰器使用实例详解
2019/12/14 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
教师找工作推荐信
2013/11/23 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
承诺书模板大全
2015/05/04 职场文书
校车安全管理责任书
2015/05/11 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
《月光曲》教学反思
2016/02/16 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
海弦WR-800F
2022/04/05 无线电