原生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 ...
随机推荐
- Hadoop-MapReduce之自定义数据类型
以下是自定义的一个数据类型,有两个属性,一个是名称,一个是开始点(可以理解为单词和单词的位置) MR程序就不写了,请看WordCount程序. package cn.genekang.hadoop.m ...
- mao/reduce实现求平均值
import java.io.*; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io. ...
- 基于TCP协议的客户端
基于TCP协议的客户端 此客户端能用于下一篇博客的单线程服务器和多线程服务器 import java.io.BufferedReader; import java.io.IOException; im ...
- Kth Ancestor 第k个祖先问题
题目出处 这道题目出自hackerrank的8月月赛的第三题. 题目大意: 先给出一棵树 之后有三种操作分别为:加边,查询,和删除一个节点 查询的时候要给出任意节点x的第k个祖先 每组数据有t个cas ...
- Tornado自定义分布式session框架
一.session框架处理请求执行的流程: 1.服务器端生成随机的cookie字符串 2.浏览器发送请求,服务器将cookie返回给浏览器. 3.服务器在生成一个字典.字典的key为cookie,va ...
- Centos系统python2.x升级python3.x
1. Centos7初始安装的python版本为2.7.5 2.下载最新的python3.5.2,解压到/usr/local/src 3. 配置.编译.测试.安装(根据软件的README说明) ./c ...
- [Webpack 2] Grouping vendor files with the Webpack CommonsChunkPlugin
Often, you have dependencies which you rarely change. In these cases, you can leverage the CommonsCh ...
- thinkphp连接oracle
配置文件中: //Oracle 测试环境 'DB_TYPE' => 'Oracle', // 数据库类型 'DB_HOST' => '1 ...
- android 72 确定取消对话框,单选对话框,多选对话框
package com.itheima.dialog; import android.os.Bundle; import android.app.Activity; import android.ap ...
- 5 Ways to Use Log Data to Analyze System Performance--reference
Recently we looked across some of the most common behaviors that our community of 25,000 users looke ...