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 相关文章推荐
让人印象深刻的10个jQuery手风琴效果应用
May 08 Javascript
js判断变量是否未定义的代码
Mar 28 Javascript
extjs ColumnChart设置不同的颜色实现代码
May 17 Javascript
jquery操作checkbox实现全选和取消全选
May 02 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
Aug 27 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
Sep 17 Javascript
jquery跟随屏幕滚动效果的实现代码
Apr 13 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
Oct 12 Javascript
详解Webpack loader 之 file-loader
Nov 07 Javascript
探索JavaScript中私有成员的相关知识
Jun 13 Javascript
JavaScript实现栈结构Stack过程详解
Mar 07 Javascript
JavaScript利用html5新方法操作元素类名详解
Nov 27 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截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
探究python中open函数的使用
2016/03/01 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
Python实现图片拼接的代码
2018/07/02 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
一组SQL面试题
2016/02/15 面试题
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
物业公司采购员岗位职责
2013/12/31 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
学雷锋活动简报
2015/07/20 职场文书
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers