原生JavaScript 获取下一个/上一个同胞元素
看JavaScript遇到的问题,研究了下
获取上一个或者下一个同胞元素,使用很多人会立马想到JQuery prev() 和 next() 的确非常方便。那么原生的JavaScript该怎么获取 上一个 或者 下一个 同胞元素呢?
JavaScript 提供了原生的API nextSibling / prevSibling;
用法:
ele.nextSibling
问题: 在现代浏览器中,nextSibing会返回下一个节点,但通常下一个节点是文本节点(产生文本节点的原因是标签之间的换行,空格等)而非元素节点。
例如:

获取li2, 使用document.querySelector("li2").nextSibling 并不能选中<li>3</li>,而是选中了文本节点。因此JavaScript提供的新的api :nextElementSibling / previousElementSibling但是这个api不支持ie8;要兼容IE8只能手动写函数了。
function getNextSibilingsNode(ele) {
var parsent = ele.parentNode;//获取元素父元素
var childrens = parsent.childNodes;//获取兄弟元素
var i = 0;
for(i; i < childrens.length; i++) {
if(childrens[i].nodeType == 1 && childrens[i] == ele){//元素节点nodeType值为1,剔除文本节点
if(childrens[i+1].nodeType == 1){//防止li之间没有换行,直接选择下一个i+1
return childrens[i+1];
}if(childrens[i+2].nodeType == 1){//跳过文本节点,所以i+2
return childrens[i+2];
}
else{
throw error("传入的元素出错,请检查,可能这是最后一个元素");
}
}
}
}
这个方法测试了下,兼容ie5+了。足够用了。
prev方法 获取前一个同胞元素
function getNextSibilingsNode(ele) {
var parsent = ele.parentNode;//获取元素父元素
var childrens = parsent.childNodes;//获取兄弟元素
var i = 0;
for(i; i < childrens.length; i++) {
if(childrens[i].nodeType == 1 && childrens[i] == ele){//元素节点nodeType值为1,剔除文本节点
if(childrens[i-1].nodeType == 1){//防止li之间没有换行,直接选择下一个i+1
return childrens[i-1];
}if(childrens[i-2].nodeType == 1){//跳过文本节点,所以i+2
return childrens[i-2];
}
else{
throw error("传入的元素出错,请检查,可能这是第一个元素");
}
}
}
}
原生JavaScript 获取下一个/上一个同胞元素的更多相关文章
- JavaScript封装函数:获取下一个/上一个兄弟元素节点
要求: 获得下一个/上一个兄弟元素节点,不包括文本节点等 解决IE兼容性问题 代码实现: 获得下一个兄弟元素节点: function getNextElement(element) { var el ...
- javascript 获取下一个节点
下一个节点: nextElementSibling 上一个节点 previousElementSibling <div> <select onchange="alert(t ...
- 原生js获取下拉框下标
// 获取下拉框所选下标 传入下拉框的id function getselectscheckitemindex (idStr) { let o = document.getElementById(id ...
- 前端 JS 原生 javascript 和 location.hash 实现一个单页应用的路由 router
开篇日常立个flag-- 前言 最近在做一些应用,类似于单页应用,想实现类似于 Vue 路由的效果. 但是个人 Vue 基础四舍五入约等于无,而且看着 Vue-router 吃力+用不起来(因为我的项 ...
- kubernetes获取崩溃容器/上一个容器的应用日志
kubectl logs命令将显示当前容器的日志.当你想知道为什么前一个容器终止时,你想看到的是前一个容器的日志,而不是当前容器的.可以通过添加--previous选项来完成: $ kubectl l ...
- 原生javascript实现 下拉框搜索功能
由于业务需求,要实现 一个下拉框搜索功能.这个下拉功能和百度的还是有点区别的,百度的是时时与服务器交互的,而这个只是模拟.技术点在于实现 了搜索功能. 未搜索前如下图: 搜索后: <!DOCTY ...
- 利用原生JavaScript获取样式的方式小结
来源:http://www.ido321.com/930.html ps:是获取样式,不是设置样式.若没有给元素设置样式值,则返回浏览器给予的默认值.(论坛整理) 1.element.style:只能 ...
- HTML5 + AJAX ( 原生JavaScript ) 异步多文件上传
这是在上篇 HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条 的修改版本.后台代码不变就可以接着使用,但是脚本不再使用jQuery了,改为原生的 JavaScript 代码,所以我 ...
- 原生javascript实现文件异步上传
效果图: 代码:(demo33.jsp) <%@ page contentType="text/html;charset=UTF-8" language="java ...
随机推荐
- 电源管理之pmu驱动分析
电源管理芯片可以为多设备供电,且这些设备电压电流有所不同.为这些设备提供的稳压器代码模型即为regulator. 说白了regulator就是稳压器,它提供电源供给.简单的可以gpio操作,高电平开电 ...
- DIY常用网站
工作: 技术: 学习: 个人十佳博客介绍:http://hedengcheng.com/?p=676
- 一步一步制作yaffs/yaffs2根文件系统(七)---真挚地道歉以及纠正前边出现的错误!
接上一节http://blog.csdn.net/mybelief321/article/details/10040939 说实话,我当时写这个系列的博文的时候,感觉对BusyBox算是有点了解,直到 ...
- 模仿微信"转你妹"游戏
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- oracle2
为什么选择oracle--性能优越 概述:目前主流数据库包括 微软: sql server和access 瑞典MySql: AB公司mysql ibm公司: db2(处理海量) 美国Sybase公司: ...
- oracle6
转换函数 介绍 转换函数用于将数据类型从一种转为另外一种.在某些情况下,oracle server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型 比如: crea ...
- python学习笔记--Django入门0 安装dangjo
经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...
- vc++ 最小化到托盘的详细实现
在VC++中,想实现将MFC最小化到系统托盘,需要调用NOTIFYICONDATA类,并注册相应的消息,以下详细讲解如何实现: 1.声明一个NOTIFYICONDATA类,也就是NOTIFYICOND ...
- 设计模式——工厂模式 (C++实现)
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...
- angularjs 更新局部作用域
前几天项目需要,做了一个背景遮罩的弹出框,html采用js动态添加进去的,结果发现angularjs绑定在这里面不起作用,搜索下解决了,记录下: var smallApplyParent = docu ...