JavaScript通过HTML的class来获取HTML元素的方法总结
对于js来说,我想每一个刚接触它的人都应该会抱怨:为什么没有一个通过class来获取元素的方法。尽管现在高版本的浏览器已经支持getElementsByClassName()函数,但是对于低版本浏览器来说,还是无法兼容,在脱离其他库的时候,还是得自己封装一个方法。
方法一
|
1
2
3
4
5
6
7
8
9
10
|
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里的值只有一个时,上面的方法没问题,但当值为多个时,就会出现问题。
|
1
2
3
4
5
|
<div class="test"></div><div class="test box"></div><script> getByClass1(document, 'test'); //只获取到第一个div</script> |
方法二
出现问题的时候,我们会尝试着改进,对于多类名的情况我们可以用正则去匹配是否包含所要查找的class名,于是就出现了下面这种写法:
|
1
2
3
4
5
6
7
8
9
10
11
|
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。看下面的例子:
|
1
2
3
4
5
6
|
<div class="test"></div><div class="test_box"></div><div class="test-box"></div><script> getByClass2(document, 'test'); //结果获取到了第一个div和第三个div</script> |
理论上应该只获取到第一个,但是却和我们预期不一样。这个bug源于下面这段代码里的\b
|
1
|
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?
改进后的代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
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;} |
这种方法舍去了用\b而采用空格来匹配边界,先在获取到的className值两边加上空格,这样就保证了className里的每个值两边都会有空格,然后再用正则去匹配。
用这种方法暂时还未发现问题,但是使用时,方法中的单引号内的空格一定不能落下。
方法四
|
1
2
3
4
5
6
7
8
9
10
11
|
function getByClass3(parent, cls){ var res = []; var reg = new RegExp('(^|\\s)' + cls + '($|\\s)', 'i'); var ele = parent.getElementsByTagName('*'); for(var i = 0; i < ele.length; i++){ if(reg.test(ele[i].className)){ res.push(ele[i]); } } return res;} |
空格完全用正则来处理,这样省去了空格容易落下的问题,代码也更美观精简。
那么这种方法是否就是比较完美的呢,其实不然,下面来看下更优的方案。
方法五(完美版)
文章开头已经提到,高版本的浏览器已经支持getElementsByClassName()方法。出于性能考虑,对支持的浏览器使用原生方法势必会更好。而对于低版本的浏览器使用上面的方法四。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function getByClass(parent, cls){ if(parent.getElementsByClassName){ return parent.getElementsByClassName(cls); }else{ var res = []; var reg = new RegExp(' ' + cls + ' ', 'i') var ele = parent.getElementsByTagName('*'); for(var i = 0; i < ele.length; i++){ if(reg.test(' ' + ele[i].className + ' ')){ res.push(ele[i]); } } return res; }}
对于js来说,我想每一个刚接触它的人都应该会抱怨:为什么没有一个通过class来获取元素的方法。尽管现在高版本的浏览器已经支持getElementsByClassName()函数,但是对于低版本浏览器来说,还是无法兼容,在脱离其他库的时候,还是得自己封装一个方法。 方法一
当然class里的值只有一个时,上面的方法没问题,但当值为多个时,就会出现问题。
方法二 出现问题的时候,我们会尝试着改进,对于多类名的情况我们可以用正则去匹配是否包含所要查找的class名,于是就出现了下面这种写法:
这种方法看似可以,解决了getByClass1()的问题,我也用了好长一段时间,但是还会有一个隐藏的bug。看下面的例子:
理论上应该只获取到第一个,但是却和我们预期不一样。这个bug源于下面这段代码里的\b
我们先来看下\b在正则中的表示的意思 \b是正则表达式规定的一个特殊代码,代表着单词的开头或结尾,也就是单词的分界处。 通俗点说:\b就是匹配一个单词(从左边界到右边界)。 而问题也就出在这里,\b把除字母、数字、下划线外的其他字符都当成是边界,对于上面的例子中第三个class值为test-box,\b匹配时,把连字符(-)当作单词边界,所以也匹配了第三个div。 方法三 因此我们还需要对上面方法进行进一步改进,这里参考了stackoverflow上提到的一种方法: How to Get Element By Class in JavaScript? 改进后的代码如下:
这种方法舍去了用\b而采用空格来匹配边界,先在获取到的className值两边加上空格,这样就保证了className里的每个值两边都会有空格,然后再用正则去匹配。 用这种方法暂时还未发现问题,但是使用时,方法中的单引号内的空格一定不能落下。 方法四
空格完全用正则来处理,这样省去了空格容易落下的问题,代码也更美观精简。 那么这种方法是否就是比较完美的呢,其实不然,下面来看下更优的方案。 方法五(完美版) 文章开头已经提到,高版本的浏览器已经支持getElementsByClassName()方法。出于性能考虑,对支持的浏览器使用原生方法势必会更好。而对于低版本的浏览器使用上面的方法四。
|
JavaScript通过HTML的class来获取HTML元素的方法总结的更多相关文章
- javascript实现浏览器管理员工具鼠标获取Html元素 并生成 xpath
javascript实现浏览器管理员工具鼠标获取Html元素 并生成 xpath 看看标题就被吓尿了,够长吧.让我们看看到底是个什么玩意.. 直接上图: 就是这个东东了,做为一个写爬虫的,有必要了解下 ...
- javascript 获取iframe元素的方法
javascript 获取iframe元素的方法 第一种: $("#IframeID").contents().find("div"); 第二种: $(win ...
- JavaScript:JavaScript中常见获取对象元素的方法
介绍: javascript中常见的3种获取元素的方法,分别是通过元素ID.通过标签名字和通过类名字来获取 操作如下: 1.getElementById DOM提供了一个名为getElementByI ...
- js 下获取子元素的方法
笔记核心: firstElementChild只会获取元素节点对象,从名称就可以看出来,firstChild则可以获取文本节点对象(当然也可以获取元素节点对象),比如空格和换行都被当做文本节点. js ...
- 由获取子元素的方法find和children所获
html代码如下 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://ww ...
- JQuery获取Dom元素的方法
(function (window) { var arr = []; var VP = function (selector, context) { return new VP.fn.init(sel ...
- vue1和vue2获取dom元素的方法
vue1.*版本中 在标签中加上el='dom',然后在代码中this.$els.dom这样就拿到了页面元素 例如:<div class='box' v-el: myBox>你好</ ...
- vue1和vue2获取dom元素的方法 及 nextTick() 、$nextTick()
vue1.*版本中 在标签中加上el='dom',然后在代码中this.$els.dom这样就拿到了页面元素 例如:<div class='box' el='myBox'>你好</d ...
- javascript获取元素的方法[xyyit]
1. javascript默认的方法: <div id=”div_id” class=”div_class” name=”div_name”></div> //1. 根据id ...
随机推荐
- 使用java的 htpUrlConnection post请求 下载pdf文件,然后输出到页面进行预览和下载
使用java的 htpUrlConnection post请求 下载pdf文件,然后输出到页面进行预览和下载 2018年06月07日 10:42:26 守望dfdfdf 阅读数:235 标签: jav ...
- datatables之翻页、搜索、排序事件
$(document).ready(function() { $('#table').on('order.dt', function() { console.log('排序'); }).on('sea ...
- php socket简单使用
php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...
- CST,CET,UTC,GMT,DST,Unix时间戳几种常见时间概述与关系
1.UTC: Universal Time Coordinated 协调世界时,又称世界标准时间 多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字 ...
- Android自定义控件练手——波浪效果
这一次要绘制出波浪效果,也是小白的我第一次还望轻喷.首先当然是展示效果图啦: 一.首先来说说实现思路. 想到波浪效果,当然我第一反应是用正余弦波来设计啦(也能通过贝塞尔曲线,这里我不提及这个方法但是在 ...
- u-boot分析(十一)----MMU简单分析|u-boot分析大结局|学习规划
u-boot分析(十一) 通过前面十篇博文,我们已经完成了对BL1阶段的分析,通过这些分析相信我们对u-boot已经有了一个比较深入的认识,在BL2阶段大部分是对外设的初始化,并且有的我们已经分析过, ...
- Spring Cloud学习路线
学习本学习路线学习完,大家将会对微服务.Spring Cloud.Docker.Kubernetes有一个系统.全面的认识.通过学习,将能掌握相关的知识体系,并能够投入到项目实战中去. 本学习路线采用 ...
- ubuntu 安装 deb 软件包
参考链接地址 blog.csdn.net/kevinhg/article/details/5934462 sudo dpkg -i xxxx.deb 安装一个 Debian 软件包,如你手动下载的文件
- May 8th 2017 Week 19th Monday
Art lies in concealing art. 隐而不露即艺术. Sometimes, concealing is much more seductive than totally naked ...
- 2017.11.4 JavaWeb-----基于JavaBean+JSP求任意两数代数和(改进的在JSP页面中无JSP脚本代码的)+网页计数器JavaBean的设计与使用
修改后的JSP中不含有JSP脚本代码这使得JSP程序的清晰性.简单 1.设计JavaBean 的Add.java 类 package beans; public class Add { private ...