首页 > 语言 > JavaScript > 正文

JavaScript通过HTML的class来获取HTML元素的方法总结

2024-05-06 14:57:41
字体:
来源:转载
供稿:网友

对于js来说,我想每一个刚接触它的人都应该会抱怨:为什么没有一个通过class来获取元素的方法。尽管现在高版本的浏览器已经支持getElementsByClassName()函数,但是对于低版本浏览器来说,还是无法兼容,在脱离其他库的时候,还是得自己封装一个方法。

方法一

function getByClass1(parent, cls){  var res = [];  //存放匹配结果的数组  var ele = parent.getElementsByTagName('*');  for(var i = 0; i < ele.length; i++){    if(ele[i].className == cls){      res.push(ele[i]);    }  }  return res;}

当然class里的值只有一个时,上面的方法没问题,但当值为多个时,就会出现问题。

<div class="test"></div><div class="test box"></div><script>  getByClass1(document, 'test');  //只获取到第一个div</script>

方法二

出现问题的时候,我们会尝试着改进,对于多类名的情况我们可以用正则去匹配是否包含所要查找的class名,于是就出现了下面这种写法:

function getByClass2(parent, cls){  var res = [];  var reg = new RegExp('//b' + cls + '//b', 'i');  //匹配cls是一个独立的单词  var ele = parent.getElementsByTagName('*');  for(var i = 0; i < ele.length; i++){    if(reg.test(ele[i].className)){      res.push(ele[i]);    }  }  return res;}

这种方法看似可以,解决了getByClass1()的问题,我也用了好长一段时间,但是还会有一个隐藏的bug。看下面的例子:

<div class="test"></div><div class="test_box"></div><div class="test-box"></div><script>  getByClass2(document, 'test');  //结果获取到了第一个div和第三个div</script>  

理论上应该只获取到第一个,但是却和我们预期不一样。这个bug源于下面这段代码里的/b

var reg = new RegExp('//b' + cls + '//b', 'i');

我们先来看下/b在正则中的表示的意思

/b是正则表达式规定的一个特殊代码,代表着单词的开头或结尾,也就是单词的分界处。

通俗点说:/b就是匹配一个单词(从左边界到右边界)。

而问题也就出在这里,/b把除字母、数字、下划线外的其他字符都当成是边界,对于上面的例子中第三个class值为test-box,/b匹配时,把连字符(-)当作单词边界,所以也匹配了第三个div。

方法三

因此我们还需要对上面方法进行进一步改进,这里参考了stackoverflow上提到的一种方法:

How to Get Element By Class in JavaScript?

改进后的代码如下:

function getByClass3(parent, cls){  var res = [];  var reg = new RegExp(' ' + cls + ' ', 'i');  //匹配cls时,两边需要有空格  var ele = parent.getElementsByTagName('*');  for(var i = 0; i < ele.length; i++){    if(reg.test(' ' + ele[i].className + ' ')){      res.push(ele[i]);    }  }  return res;}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选