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提取URL的搜索字符串中的参数(自定义函数实现)
Jan 22 Javascript
js获取php变量的实现代码
Aug 10 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
JS控制输入框内字符串长度
May 21 Javascript
Vue.js常用指令汇总(v-if、v-for等)
Nov 03 Javascript
jquery组件WebUploader文件上传用法详解
Oct 23 Javascript
Angular.js中控制器之间的传值详解
Apr 24 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
Jul 03 Javascript
如何用Node写页面爬虫的工具集
Oct 26 Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 Javascript
微信小程序拍照和摄像功能实现方法示例
Feb 01 Javascript
微信小程序实现分享商品海报功能
Sep 30 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 XML error parsing SOAP payload on line 1
2010/06/17 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
php实现读取手机客户端浏览器的类
2015/01/09 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
用jquery.sortElements实现table排序
2014/05/04 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
Python中无限元素列表的实现方法
2014/08/18 Python
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python版大富翁源代码分享
2018/11/19 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
Ref与out有什么不同
2012/11/24 面试题
学生会主席就职演讲稿
2014/01/14 职场文书
租赁意向书范本
2014/04/01 职场文书
文员求职信
2014/07/15 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
四风问题查摆材料
2014/08/25 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
2015年工商所工作总结
2015/05/21 职场文书
大学生村官入党自传
2015/06/26 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
Python实现位图分割的效果
2021/11/20 Python