您好,欢迎访问一九零五行业门户网

YUI 读码日记之 YAHOO.util.Dom - Part.1_YUI.Ext相关

先绕开头部很多的 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             c[c.length] = y.dom.get(el[i]);
        }
return c;
    }
return el;
},这段代码写得非常的精妙。坦白的说,上述代码中的循环体,如果不加思索的话,恐怕就会写成
for (var i = 0, len = el.length; 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         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         // 根据自定义函数返回值判断节点的属性
        if ( method(elements[i]) ) {
            nodes[nodes.length] = elements[i];
            if (apply) {
                apply(elements[i]);
            }
        }
    }
return nodes;
},ok,今天就先到这里。
其它类似信息

推荐信息