getElementsByClassName:

根据className获取元素集合,一般原理为:遍历页面中的元素(可指定范围)-->筛选有className的元素(有className并且不为空,以缩小检索范围)-->收集符合条件的元素(元素的className为指定的className或者是否包含指定的className)存入数组-->返回数组(即得到的结果).

其中有几个需要注意的地方:

1.用到for循环,所以在操作DOM时能写在循环外面的尽量写到外面,比如

for(var i=0,len=100;i

写成

var classname=ele.className;

for(var i=0,len=100;i

有没有发现好很多?

2.其中有用到Array.prototype.indexOf,但是这个IE9以下IE内核的浏览器是不支持这个方法的,所以需要判断下,我们就采用这个经典的方法: !-[1,]

if(!-[1,]){

//<=ie8

}else{

//other

}

3.在分解元素的className时(因为有多className的情况)用到了正则,匹配除空格、tab键和换行符之外的其他字符,match方法返回一个数组,这个数组是匹配到的结果;

好了,下面上getElementsByClassName的完整代码:

function getElementsByClassName(classname,obj){

var arr=[];

var eles=(obj?obj:document).getElementsByTagName("*");

for(var i=0,len=eles.length;i

var ele=eles[i];

var classnames=ele.className;

if(classnames!=""&&classnames.replace(/s+/g," ")!=" "){//如果该元素有classname并且不为空

var names=classnames.match(/[^s]+/g);//将其classname保存在一个数组

if(!-[1,]){//<=ie8

for(var j=0,len2=names.length;j

if(names[j]==classname){

arr.push(ele);

}

}

}else{

if(names.indexOf(classname)!=-1){//ie9 other

arr.push(ele);

}

}

}

}

return arr;

}

removeClassName:

和上面的方法异曲同工:-),就不再作详细说明

function removeClassName(classname,obj){

var classnames=obj.className;

if(classnames&&classnames.replace(/s+/g," ")!=" "){//存在

var names=classnames.match(/[^s]+/g);//转数组

var arrs=[];

for(var i=0,len=names.length;i

if(names[i]!=classname){

arrs.push(names[i]);

}

}

obj.className=arrs.join(" ");

}

}