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 获取图片颜色
Apr 05 Javascript
javascript 正则替换 replace(regExp, function)用法
May 22 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
Mar 16 Javascript
基于jQuery实现点击列表加载更多效果
May 31 Javascript
实例教学如何写vue插件
Nov 30 Javascript
实战node静态文件服务器的示例代码
Mar 08 Javascript
Vue 使用beforeEach实现登录状态检查功能
Oct 31 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
Nov 07 Javascript
浅谈vue权限管理实现及流程
Apr 23 Javascript
通过实例解析js可枚举属性与不可枚举属性
Dec 02 Javascript
node脚手架搭建服务器实现token验证的方法
Jan 20 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过滤危险html代码
2008/08/18 PHP
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
nginx下安装php7+php5
2016/07/31 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
python实现tail -f 功能
2020/01/17 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
类的核心特性有哪些
2014/01/01 面试题
女娲补天教学反思
2014/02/05 职场文书
齐云山导游词
2015/02/06 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
企业法人代表证明书
2015/06/18 职场文书
电视新闻稿
2015/07/17 职场文书
小学运动会通讯稿
2015/07/18 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书