原生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 ...
随机推荐
- octopress Endless Error With Gem Dependencies
因为重装系统的缘故,需要重新搭建octopress环境,在执行到: bundle install 会出现一些这样的错误:An error occurred while installing timer ...
- 兼容的placeholder属性
作为一个.net后台开发的程序猿,博客里既然大多都是前端相关的博文.是不是该考虑换方向了,转前端开发得了 ... 小小吐槽一下,近期受该不该跳槽所困惑,我有选择困难症! 继续前端,这次说一下输入框 p ...
- php如何修改SESSION的生存时间
如何修改SESSION的生存时间 我们来手动设置 Session 的生存期: <?phpsession_start(); // 保存一天 $lifeTime = 24 * 3600; setco ...
- switch语法中break,default作用说明
转自:http://cjhbest999.iteye.com/blog/1137124 关于java中switch使用的一些说明 switch(表达式) { case 常量表达式1:语句1; .... ...
- 【设计模式 - 24】之访问者模式(Visitor)
1 模式简介 访问者模式的定义: 访问者模式将数据结构与数据操作进行了分离,解决了稳定的数据结构和易变的数据操作的耦合问题. 访问者模式的优点: 1) 符合单一职责原则: 2) ...
- Rsync同步工具安装文档
(1)下载Rsync源代码进行安装 (2)1' cd rsync 2' ./configure --prefix=/usr/local/rsync 3' make 4' make ...
- docker rancher 负载均衡做路由跳转
介绍 我们要实现的目的是 根据负载均衡 跳转到指定的应用容器中 负载均衡中配置好 跳转的地址 当执行URL 请求的时候会自动跳转 测试方法 curl -v --header 'Host:mu.03in ...
- 局域网内使用linux的ntp服务
假设我们的饿局域网无法连接外网,但又需要同步时间,怎么办? 1. 已局域网内的一台机器作为基础,适用date修改其他机器的时间,date -s ...,很不方便,这里不介绍. 2. 适用ntp服务,自 ...
- plupload使用指南(转)
转自http://www.cnblogs.com/2050/p/3913184.html 现在随着html5技术的逐渐推广和普及,再去使用以flash为上传手段的SWFUpload显然就有点过时了,毕 ...
- JavaScript 开发规范要求详解
作为一名开发人员(We前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题.本人在开发工作中就曾与不按规范来开发的同 ...