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 的应用开发初探(mootools)
Dec 19 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
Feb 06 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
Jul 04 Javascript
javascript工厂方式定义对象
Dec 26 Javascript
JavaScript中的普通函数与构造函数比较
Apr 07 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
js获取当前页的URL与window.location.href简单方法
Feb 13 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
Apr 03 jQuery
Vue下路由History模式打包后页面空白的解决方法
Jun 29 Javascript
微信小程序动态添加和删除组件的现实
Feb 28 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 格式化数字的时候注意数字的范围
2010/04/13 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
php头像上传预览实例代码
2017/05/02 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
浅析node应用的timing-attack安全漏洞
2018/02/28 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
Python日志syslog使用原理详解
2020/02/18 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
附答案的Java面试题
2012/11/19 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
医院标语大全
2014/06/23 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL