YUI 读码日记之 YAHOO.util.Dom - Part.1

时间:2021-05-25

先绕开头部很多的if...else(其实就是定义toCamel与getStyle两个函数)-由于浏览器的实现不统一,才造成如此麻烦的情况,回头可以聊聊这些代码。

下面我们在YAHOO.util.Dom类中看看有哪些宝藏。目前思想已经逐步的分裂,我看见个函数说个函数。

//基本上可以认为是document.getElementById的翻版
get:function(el){
//如果已经是HTMLElement,那么就直接返回
if(el&&(el.nodeType||el.item)){
returnel;
}

//如果是字符串,那么就返回有这个ID的Element
if(YAHOO.lang.isString(el)||!el){
returndocument.getElementById(el);
}

//看起来是个数组,循环调用自身,获取Eelement
if(el.length!==undefined){
varc=[];
for(vari=0,len=el.length;i<len;++i){
c[c.length]=Y.Dom.get(el[i]);
}

returnc;
}

returnel;
},这段代码写得非常的精妙。坦白的说,上述代码中的循环体,如果不加思索的话,恐怕就会写成

for(vari=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[];
}

//初始化节点信息
varnodes=[],
elements=root.getElementsByTagName(tag),
re=getClassRegEx(className);

//滤掉不符合规则的节点
for(vari=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]);
}
}
}

returnnodes;
},教科书式的DOM节点获取和过滤,初始化数据以及操作数据都显得非常的严谨而且正规,YUI的代码让我有几分的“安全感”。类似的,再来一个getElementsBy函数,相应代码如下

getElementsBy:function(method,tag,root,apply){
//与上述函数相同,略
tag=tag||'*';
root=(root)?Y.Dom.get(root):null||document;

if(!root){
return[];
}

varnodes=[],
elements=root.getElementsByTagName(tag);

for(vari=0,len=elements.length;i<len;++i){
//根据自定义函数返回值判断节点的属性
if(method(elements[i])){
nodes[nodes.length]=elements[i];
if(apply){
apply(elements[i]);
}
}
}

returnnodes;
},OK,今天就先到这里。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章