JS获取元素多层嵌套思路详解


Posted in Javascript onMay 16, 2016

如果一段html嵌套过多,在js中获取还是比较麻烦的,我写了几套方案,大家可以参考参考,如果你有好的方法,也分享出来,让我们瞧瞧。

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>元素多层嵌套,JS获取问题</title>
</head>
<body>
<div id="box">
<span>span</span>
<div>
<span>span</span>
<a href="">
<span>1</span>
</a>
</div>
<div>
<a href="">
<span>2</span>
</a>
</div>
<div>
<a href="">
<span>3</span>
</a>
</div>
</div>
</body>
</html>

我想获取a下面的span。

思路1:先获取它的父元素,然后通过for循环诶个获取这个元素下面的元素,然后通过此次获取到的元素在依次循环获取下面的元素,直到获取到目标元素。

// 获取父元素
var dBox = document.getElementById('box');
// 通过父元素获取所有div
var dDiv = dBox.getElementsByTagName('div');
// 将所有的a标签放到dArr中
var aArr = [];
for(var i=0;i<dDiv.length;i++){
aArr.push(dDiv[i].getElementsByTagName('a')[0]);
}
// 通过a标签获取所有span
var spanArr = [];
for(var i=0;i<aArr.length;i++){
spanArr.push(aArr[i].getElementsByTagName('span')[0]);
}
console.log(spanArr);

缺点:消耗性能,如果再嵌套多一点,那获取目标元素就相当的麻烦。

思路2:通过父元素,直接获取目标元素,但是这样做肯定是有问题的,因为它会把父元素下的所有span都获取到,我的想法是将获取到的这些元素进行判断它的父元素是不是a标签。

var box = document.getElementById('box');
// 获取box下面所有的span
var span = box.getElementsByTagName('span');
// 定义一个数组保存过滤后的span
var arr = [];
for(var i=0;i<span.length;i++){
// 诶个判断span是父元素是不是A,如果是就把它添加到arr中。
if(span[i].parentNode.tagName==='A'){
arr.push(span[i]);
}
}
console.log(arr);

思路1跟思路2虽然可以,但其实它们都有缺点,如果布局再复杂一些,可能获取到的就不是那么精确了。

如果想精确的获取可以给每个元素添加一个class。但class的话,浏览器有兼容问题。

突然想到了另外一个方法。

思路:通过自定义属性,但是因为在js中获取js自定义属性有兼容问题,我就用正则来判断,这个元素是否有我自定义的属性。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>元素多层嵌套,JS获取问题</title>
</head>
<body>
<div id="box">
<span>span</span>
<div>
<span>span</span>
<a href="">
<span isspan='span'>1</span>
</a>
</div>
<div>
<a href="">
<span isspan='span'>2</span>
</a>
</div>
<div>
<a href="">
<span isspan='span'>3</span>
</a>
</div>
</div>
</body>
</html>

js

// 获取父元素
var dBox = document.getElementById('box');
// 获取所有子元素
var dSpan = dBox.getElementsByTagName('span');
// 当前元素
var str = '';
// 过滤后的所有span元素
var spans = [];
for(var i=;i<dSpan.length;i++){
// 获取当前整个元素
str = dSpan[i].outerHTML;
console.log(str);
// 判断当前这个元素是否有自定义属性
if(/isspan="span"/.test(str)){
// 有就添加到数组中
spans.push(dSpan[i]);
}
}
console.log(spans);

建议用class或者自定义属性获取,第一和第二种方法获取的不精确。

以上所述是小编给大家介绍的JS获取元素多层嵌套的问题,希望对大家有所帮助,也希望大家多多支持三水点靠木网站!

Javascript 相关文章推荐
javascript加号&quot;+&quot;的二义性说明
Mar 04 Javascript
使用jspdf生成pdf报表
Jul 03 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 Javascript
js字符串与Unicode编码互相转换
May 17 Javascript
详解Node.js模板引擎Jade入门
Jan 19 Javascript
vue-cli axios请求方式及跨域处理问题
Mar 28 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
May 01 Javascript
如何根据业务封装自己的功能组件
Apr 19 Javascript
vue实现select下拉显示隐藏功能
Sep 30 Javascript
基于postman获取动态数据过程详解
Sep 08 Javascript
详解ES6 中的Object.assign()的用法实例代码
Jan 11 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
May 16 #Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
May 16 #Javascript
在javascript中创建对象的各种模式解析
May 16 #Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
May 16 #Javascript
论Bootstrap3和Foundation5网格系统的异同
May 16 #Javascript
Javascript基础教程之比较null和undefined值
May 16 #Javascript
javascript对象的相关操作小结
May 16 #Javascript
You might like
php事件驱动化设计详解
2016/11/10 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python如何实现FTP功能
2020/05/28 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
python re模块常见用法例举
2021/03/01 Python
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
电脑教师的自我评价
2013/12/18 职场文书
办公室主任先进事迹
2014/01/18 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
校庆筹备方案
2014/03/30 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
晚会闭幕词
2015/01/28 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL