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 相关文章推荐
使用jQuery模板来展现json数据的代码
Oct 22 Javascript
通过一段代码简单说js中的this的使用
Jul 23 Javascript
js保留两位小数使用toFixed实现
Jul 29 Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
jquery.qtip提示信息插件用法简单实例
Jun 17 Javascript
如何用JS判断两个数字的大小
Jul 21 Javascript
详解Vue爬坑之vuex初识
Jun 14 Javascript
利用JS做网页特效_大图轮播(实例讲解)
Aug 09 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
Oct 26 Javascript
详解ES6中的Map与Set集合
Mar 22 Javascript
Vue开发环境中修改端口号的实现方法
Aug 15 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
Mysql的常用命令
2006/10/09 PHP
PHP中用hash实现的数组
2011/07/17 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
对于Python中RawString的理解介绍
2016/07/07 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
2020/06/06 Python
导致python中import错误的原因是什么
2020/07/01 Python
python定义类的简单用法
2020/07/24 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
天网面试题
2013/04/07 面试题
一名毕业生的自我鉴定
2013/12/04 职场文书
自我评价是什么
2014/01/04 职场文书
2014年高考决心书
2014/03/11 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
CSS中实现动画效果-附案例
2022/02/28 HTML / CSS