天天看点

六(2).自己动手生产一个getElementsByClass()函数3. getElementsByClass() # 通过类名查找元素

六.W3C DOM之旅的第一步,文档访问 .第二节.自己动手生产一个getElementsByClass()函数

3. getElementsByClass() # 通过类名查找元素

getElementsByClass()方法,内建的DOM函数中并没有提供用来实现按类名查找元素的方法,因此我们需要自己动手生产一个函数来完成这一功能。

只要把编写好的getElementsByClass()函数放在我们的js文件里或者封装到我们自己的库里,积少成多就有了像Prototype, jQuery,Mootools一样的JavaScript Library了。在我们编写任何JavaScript代码的时候,都可以将类名作为参数使用该函数查找元素组了.

完整的getElementsByClass()函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

      
function
 $(
element)
{
 

    if
(
arguments.length
>
1
)
{
 

        for
(
var
 i=
0
,
elements=
[
]
,
length=
arguments.length
;
i<
length;
i++
)
{


            elements.push
(
$(
arguments[
i]
)
)
;
 

		}
	

        return
 elements;
 

    }
 

	//如果该参数是一个字符串那假设它是一个id


    if
(
typeof
 element==
"string"
)
 {


        return
 document.getElementById
(
element)
;
 

	}
else
{
	

 

        return
 element;
 

    }
		

}
 

/* 

 第一个参数CSS类名,第二个参数父对象,第三个参数标签名(eg "div"、"li") 

 其中第一个参数必选,第二个第三个参数可选 

*/
 

document.getElementsByClassName
=
function
(
className,
parentElement,
tagName)
 {
 

var
 children =
 (
$(
parentElement)
||
document.body
)
.getElementsByTagName
(
tagName||
'*'
)
;
//兼容IE5.x以上的版本和FF的判断


//var children =document.all?document.all:document.getElementsByTagName("*");//兼容IE5.x版本和FF的判断


var
 elements =
 [
]
,
child;
 

for
 (
var
 i=
0
,
length=
children.length
;
i<
length;
i++
)
 {
 

	child =
 children[
i]
;
 

	if
 (
hasClassName(
child,
className)
)
 

	   elements.push
(
child)
;
 

	}
 

	return
 elements;
 

}
;
 

//判断对象element是否包含指定类className 


function
 hasClassName(
element,
className)
 {
 

    if
 (
!
(
element=
$(
element)
)
)
 return
 false
;
 

    var
 elementClassName=
element.className
;
 

    if
 (
elementClassName.length
 ==
 0
)
 return
 false
;
 

    if
 (
elementClassName==
className||
elementClassName.match
(
new
 RegExp(
"(^|//
s)"
+
className+
"(//
s|$)"
)
)
)
 

        return
 true
;
 

    return
 false
;
 

}
           

测试:

相同类名的div元素

1

2

3

4

5

      
<div
 class
=
"c"
>
aaaaa</
div
>


<div
 class
=
"c"
>
bbbbb</
div
>


<div
 class
=
"c"
>
ccccc</
div
>


<div
 class
=
"c"
>
ddddd</
div
>


<div
 class
=
"c"
>
eeeee</
div
>
           

通过getElementsByClass()函数,查找有相同类名的div元素组。

1

2

3

4

5

6

7

8

      
//测试


var
 className=
document.getElementsByClassName
(
"c"
)
;


if
(
typeof
 className!=
"undefined"
)
{


	for
(
var
 i=
0
;
i<
className.length
;
i++
)
{


	   alert
(
className[
i]
.innerHTML
)
;


	}


 

}
           

完整的getElementsByClass()函数的第二种实现方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

      
//getElementsByClass()函数的第二种实现方式


document.getElementsByClassName
=
function
(
className)
{


    var
 allArray=
new
 Array(
)
;


	var
 elements=
new
 Array(
)
;


	if
(
typeof
 document.all
!=
"undefined"
)
{


 

	   allArray=
document.all
;
//返回文档中的所有元素


 

	}
else
{


 

	   allArray=
document.getElementsByTagName
(
"*"
)
;
//返回文档中的所有元素


 

	}


	for
(
var
 i=
0
;
i<
allArray.length
;
i++
)
{


	  var
 isClassName=
hasClassName(
allArray[
i]
,
className)
;


	  if
 (
isClassName)
{


		   elements.push
(
allArray[
i]
)
;
 

	  }
 

 

    }


    return
 elements;


}
;


 

 

//判断对象element是否包含指定类className 


function
 hasClassName(
element,
className)
 {
 

 

    var
 elementClassName=
element.className
;


    if
 (
elementClassName.length
 ==
 0
)
 return
 false
;
 

    if
 (
elementClassName==
className||
elementClassName.match
(
new
 RegExp(
"(^|//
s)"
+
className+
"(//
s|$)"
)
)
)
 

        return
 true
;
 

    return
 false
;
 

 

}
           

继续阅读