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 相关文章推荐
解决遍历时Array.indexOf产生的性能问题
Jul 03 Javascript
jquery对象和DOM对象的区别介绍
Aug 09 Javascript
JS远程获取网页源代码实例
Sep 05 Javascript
js之事件冒泡和事件捕获详细介绍
Oct 28 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
类似天猫商品详情随浏览器移动的示例代码
Feb 27 Javascript
在linux中使用包管理器安装node.js
Mar 13 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
Apr 10 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
Aug 03 Javascript
写gulp遇到的ES6问题详解
Dec 03 Javascript
详解一个小实例理解js原型和继承
Apr 24 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乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
Python如何实现强制数据类型转换
2019/11/22 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
会计毕业自我鉴定
2014/02/05 职场文书
公司请假条格式
2014/04/11 职场文书
留学顾问岗位职责
2014/04/14 职场文书
员工生日活动方案
2014/08/24 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
甲午大海战观后感
2015/06/02 职场文书
宾馆卫生管理制度
2015/08/06 职场文书