看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 获取下一个/上一个同胞元素的更多相关文章

  1. JavaScript封装函数:获取下一个/上一个兄弟元素节点

    要求: 获得下一个/上一个兄弟元素节点,不包括文本节点等 解决IE兼容性问题 代码实现: 获得下一个兄弟元素节点: function getNextElement(element) { var el ...

  2. javascript 获取下一个节点

    下一个节点: nextElementSibling 上一个节点 previousElementSibling <div> <select onchange="alert(t ...

  3. 原生js获取下拉框下标

    // 获取下拉框所选下标 传入下拉框的id function getselectscheckitemindex (idStr) { let o = document.getElementById(id ...

  4. 前端 JS 原生 javascript 和 location.hash 实现一个单页应用的路由 router

    开篇日常立个flag-- 前言 最近在做一些应用,类似于单页应用,想实现类似于 Vue 路由的效果. 但是个人 Vue 基础四舍五入约等于无,而且看着 Vue-router 吃力+用不起来(因为我的项 ...

  5. kubernetes获取崩溃容器/上一个容器的应用日志

    kubectl logs命令将显示当前容器的日志.当你想知道为什么前一个容器终止时,你想看到的是前一个容器的日志,而不是当前容器的.可以通过添加--previous选项来完成: $ kubectl l ...

  6. 原生javascript实现 下拉框搜索功能

    由于业务需求,要实现 一个下拉框搜索功能.这个下拉功能和百度的还是有点区别的,百度的是时时与服务器交互的,而这个只是模拟.技术点在于实现 了搜索功能. 未搜索前如下图: 搜索后: <!DOCTY ...

  7. 利用原生JavaScript获取样式的方式小结

    来源:http://www.ido321.com/930.html ps:是获取样式,不是设置样式.若没有给元素设置样式值,则返回浏览器给予的默认值.(论坛整理) 1.element.style:只能 ...

  8. HTML5 + AJAX ( 原生JavaScript ) 异步多文件上传

    这是在上篇 HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条 的修改版本.后台代码不变就可以接着使用,但是脚本不再使用jQuery了,改为原生的 JavaScript 代码,所以我 ...

  9. 原生javascript实现文件异步上传

    效果图: 代码:(demo33.jsp) <%@ page contentType="text/html;charset=UTF-8" language="java ...

随机推荐

  1. windows上zend server安装 报The server encountered an internal error or misconfiguration and was unable to complete your request -解决方法 摘自网络

    windows上zend server安装完成后报如下错误:   Internal Server Error The server encountered an internal error or m ...

  2. phonegap与google analytics整合

    用phonegap开发的app接近尾声,需要整一个谷歌分析进去. 1.首先申请一个GA帐号,在“what would you like to track”下选择APP

  3. python-面向对象(三)——类的特殊成员

    类的特殊成员 1. __doc__     表示类的描述信息 class Foo: """ 描述类信息,这是用于看片的神奇 """ def ...

  4. SQLServer加入域后无法远程连接

    如果您更改的SQLServer的远程连接端口(默认1433),加入域后,防火墙会把自定义规则都禁用掉 所以,你得进防火墙,查看,是否防火墙关闭了,我的就是关闭了,找了半天原因

  5. onethink加密解密函数

    onethink中封装的加密解密函数 <?php /** * 系统加密方法 * @param string $data 要加密的字符串 * @param string $key 加密密钥 * @ ...

  6. struts2 表单处理

    在这篇教程里我们将探究如何处理表单提交.本文例子介绍: javabean存储表单数据 在action中重写validate方法进行简单的校验 创建一个struts2表单并和javabean匹配 jav ...

  7. Nginx平台构架 分类: Nginx 2015-07-13 10:55 205人阅读 评论(0) 收藏

    深入理解Nginx模块发开与架构解析读书笔记. nginx在启动后,在unix系统中会以daemon的方式(可以手动关闭 nginx.conf daemon off)在后台运行,后台进程包含一个mas ...

  8. Load Balance Tomcat with Nginx and Store Sessions in Redis--reference

    An awkward title, but that’s exactly what we’re going to do. For some time, I was looking for a way ...

  9. 用NodeJs实现优先级队列PQueue

    优先级队列(PriorityQueue)是个很有用的数据结构,很多编程语言都有实现.NodeJs是一个比较新潮的服务器语言,貌似还没有提供相关类.这些天有用到优先级队列,因为时间很充足,闲来无事,就自 ...

  10. hdu2074java

    叠筐 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...