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玩一玩WSH吧
Feb 23 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
Nov 14 Javascript
js confirm()方法的使用方法实例
Jul 13 Javascript
jquery改变disabled的boolean状态的三种方法
Dec 13 Javascript
详解js闭包
Sep 02 Javascript
jQuery中hover与mouseover和mouseout的区别分析
Dec 24 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
Aug 01 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
Feb 08 Javascript
Vue.js 2.0中select级联下拉框实例
Mar 06 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
Dec 05 Javascript
用ES6写全屏滚动插件的示例代码
May 02 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几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
python help函数实例用法
2020/12/06 Python
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
家长寄语大全
2014/04/02 职场文书
课程设计的心得体会
2014/09/03 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
致运动员赞词
2015/07/22 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
python常见的占位符总结及用法
2021/07/02 Python