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 图片缩放(按比例)控制代码
May 27 Javascript
google 搜索框添加关键字实现代码
Apr 24 Javascript
基于Jquery的开发个代阴影的对话框效果代码
Jul 28 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
Feb 03 Javascript
JS删除数组元素的函数介绍
Mar 27 Javascript
javascript数字时钟示例分享
Apr 23 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
Aug 14 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
Oct 08 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
Aug 15 Javascript
关于单文件组件.vue的使用
Sep 20 Javascript
详解Node.js使用token进行认证的简单示例
May 25 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代码的函数
2007/12/10 PHP
php5 mysql分页实例代码
2008/04/10 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
lib.utf.js
2007/08/21 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
python爬虫正则表达式之处理换行符
2018/06/08 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
python实现批量命名照片
2020/06/18 Python
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
干部培训自我鉴定
2014/01/22 职场文书
兽医医药专业求职信
2014/07/27 职场文书
商铺租房协议书范本
2014/12/04 职场文书
工人先进事迹材料
2014/12/26 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python
如何基于python实现单目三维重建详解
2022/06/25 Python