YUI读码日记之YAHOO.util.Dom-Part.1
作者:书友56183408 | 来源:互联网 | 2022-09-21 10:41
DOM操作是学习Javascript很重点的一块。YUI提供了丰富的DOM操作接口,它们定义在%BUILD%domdom.js中(封装成YAHOO.util.Dom)。由于DOM操作比较重要,我计划将其分成几个Part分析。
先绕开头部很多的 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,今天就先到这里。
推荐阅读
蜡笔小新 2024-11-14 19:07:05
蜡笔小新 2024-11-14 16:26:25
本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ...
[详细]
蜡笔小新 2024-11-14 15:57:40
2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ...
[详细]
蜡笔小新 2024-11-14 12:11:09
一个初秋的雨夜,我独自漫步在校园的小道上,心中突然涌起对理想爱情的憧憬。这篇文章将分享我对理想伴侣的期望,以及与他共度美好时光的愿景。 ...
[详细]
蜡笔小新 2024-11-14 11:27:23
本文旨在探讨信息安全专业的职业规划路径,结合个人经历和专家建议,为即将毕业的学生提供实用的指导。 ...
[详细]
蜡笔小新 2024-11-13 21:56:42
近期,微信公众平台上的HTML5游戏引起了广泛讨论,预示着HTML5游戏将迎来新的发展机遇。磊友科技的赵霏,作为一名HTML5技术的倡导者,分享了他在微信平台上开发HTML5游戏的经验和见解。 ...
[详细]
蜡笔小新 2024-11-13 16:56:47
HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ...
[详细]
蜡笔小新 2024-11-13 14:02:50
本文详细探讨了使用Python3编写爬虫时如何应对网站的反爬虫机制,通过实例讲解了如何模拟浏览器访问,帮助读者更好地理解和应用相关技术。 ...
[详细]
蜡笔小新 2024-11-14 19:48:54
蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ...
[详细]
蜡笔小新 2024-11-14 19:31:55
本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ...
[详细]
蜡笔小新 2024-11-14 18:30:58
过去查询Mysql的时候,都见3306对所有端口开放着,感觉不安全。netstat -anlp | grep mysqltcp 0&am ...
[详细]
蜡笔小新 2024-11-13 17:36:31
越来越多的家庭在装修淋浴房时选择不铺设传统瓷砖,而是采用四边走水的设计,这种设计不仅排水迅速,还能提升整体美感。本文将详细介绍这一趋势及其优点。 ...
[详细]
蜡笔小新 2024-11-13 17:18:06
本文详细介绍了MySQL数据库服务器(mysqld)和客户端(mysql)的区别,并提供了多种启动和关闭MySQL服务器的方法。通过这些方法,您可以更好地管理和维护MySQL数据库。 ...
[详细]
蜡笔小新 2024-11-13 16:29:31
本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ...
[详细]
蜡笔小新 2024-11-13 14:50:37
书友56183408
这个家伙很懒,什么也没留下!