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 页面模板化很多人没有使用过的方法
Jun 05 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
JS实现动画兼容性的transition和transform实例分析
Dec 13 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 Javascript
Angular ui.bootstrap.pagination分页
Jan 20 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
Angular实现可删除并计算总金额的购物车功能示例
Dec 26 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
Apr 08 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
Jan 15 Javascript
实例讲解v-if和v-show的区别
Jan 31 Javascript
详解Vue项目中实现锚点定位
Apr 24 Javascript
Layui 数据表格批量删除和多条件搜索的实例
Sep 04 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危险函数(disable_functions)
2012/02/23 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
python绘制圆柱体的方法
2018/07/02 Python
Flask之flask-session的具体使用
2018/07/26 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python根据时间获取周数代码实例
2019/09/30 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
2014婚礼司仪主持词
2014/03/14 职场文书
公司授权委托书范文
2014/08/02 职场文书
快递员岗位职责
2014/09/12 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
销售内勤岗位职责
2015/02/10 职场文书
vue elementUI表格控制对应列
2022/04/13 Vue.js
Java数据结构之堆(优先队列)
2022/05/20 Java/Android