原生JS实现几个常用DOM操作API实例


Posted in Javascript onJanuary 19, 2017

原生实现jQuery的sibling方法

<body>
<span>我是span标签</span>
<div>我是一个div</div>
<h1 id="h1">我是标题</h1>
<p>我是一个段落</p>
<script type="text/javascript">
//获取元素的兄弟节点
function siblings(o){//参数o就是想取谁的兄弟节点,就把那个元素传进去
var a = [];//定义一个数组,用来存储o的兄弟元素
//previousSibling返回位于相同节点树层级的前一个元素
var p = o.previousSibling;
while(p){//先取o的前面的兄弟元素 判断有没有上一个兄弟元素,如果有则往下执行,p表示previousSibling
if(p.nodeType === 1){
a.push(p);
}
p = p.previousSibling//最后把上一个节点赋给p
}
a.reverse();//把顺序反转一下,这样元素的顺序就是按先后的了
//nextSibling返回位于相同节点树层级的下一个节点
var n = o.nextSibling;//再取o下面的兄弟元素
while(n){//判断有没有下一个兄弟结点,n是nextSibling的意思
if(n.nodeType === 1){//判断是否是元素节点
a.push(n);
}
n = n.nextSibling;
}
return a//最后按从老大到老小的顺序,把这一组元素返回
}
var oH = document.getElementById("h1");
console.log(siblings(oH));//[span, div, p, script]
</script>
</body>

原生实现jQuery的class选择器

//用数组模拟jQuery的class选择器
function getClassName(ParentId,NewClassName){
var AllClassElem = ParentId.getElementsByTagName(“*”);
var AllClass = [];
var i=0;
for(var i=0; i<AllClassElem.length; i++){
if(AllClassElem[i].className == NewClassName){
AllClass.push(AllClassElem[i]);
}
}
return AllClass;
}
//用法:
var PElementId=document.getElementById("bar");
var buttons = getClassName(PElementId,"sco");
//取id="bar"下class="sco"的元素;

getElementsByClassName()

/**
* 获取指定类名的元素对象集合
* @param {Object} node 父节点
* @param {String} classname 指定类名 
* @return {[Object]}目标对象集合
*/
function getElementsByClassName(node,classname) {
//如果浏览器支持则直接使用
 if (node.getElementsByClassName) { 
  return node.getElementsByClassName(classname);
 } else {
  return (function getElementsByClass(searchClass,node) {
    if ( node == null )
     node = document;
    var classElements = [],
      els = node.getElementsByTagName("*"),
      elsLen = els.length,
      pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j;

    for (i = 0, j = 0; i < elsLen; i++) {
     if ( pattern.test(els[i].className) ) {
       classElements[j] = els[i];
       j++;
     }
    }
    return classElements;
  })(classname, node);
 }
}

addLoadEvent()

/**
* 方便的将在文档加载后运行的函数添加到window.onload中
* @param {function} func 待运行函数
*/
function addLoadEvent(func){
  var oldOnload = window.onload;
  //typeof 返回String类型
  if(typeof window.onload != 'function'){
    window.onload = func;
  }else{
    window.onload = function(){
      oldOnload();
      func();
    }
  }
}

addClass()

/**
* 为指定元素结点添加新类名
* element 元素结点
* value 类名
*/
function addClass(element,value){
//如果元素类名为空,直接将value赋值给相应的元素类名
  if(!element.className){
    element.className = value;
  }else{
  //否则需要将类名之间用空格隔开
    newClassName = element.className;
    //多个类名间添加空格
    newClassName += ' ';
    newClassName += value;
    element.className = newClassName;
  }
}

insertAfter()

/**
* 在目标元素结点后面插入新的元素结点
* newElement 待插入的新元素结点
* targetElement 目标元素结点
*/
function insertAfter(newElement,targetElement){
  var parent = targetElement.parentNode;
  if(parent.lastChild == targetElement){
    parent.appendChild(newElement);
  }else{
    parent.insertBefore(newElement,targetElement.nextSibling);
  }
}

getNextElement()

/**
* 获取下一个元素结点
* @param {Object} node 兄结点
* @return {Object || null}下一个元素结点或未获取到
*/
function getNextElement(node){
    var sibNode = node.nextSibling;
  if (sibNode.nodeType == 1) {
    return node;
  }
  if (sibNode.nextSibling) {
    //递归调用
    return getNextElement(node.nextSibling);
  }
  return null;
}

以上这篇原生JS实现几个常用DOM操作API实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
setAttribute 与 class冲突解决
Feb 17 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
Javascript面向对象设计一 工厂模式
Dec 20 Javascript
深入探寻javascript定时器
Jan 02 Javascript
JavaScript 学习笔记之语句
Jan 14 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
浅谈对Angular中的生命周期钩子的理解
Jul 31 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
Oct 30 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
Nov 24 Javascript
微信小程序实现留言板
Oct 31 Javascript
通过循环优化 JavaScript 程序
Jun 24 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
JS生成一维码(条形码)功能示例
Jan 19 #Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
Jan 19 #Javascript
javascript中json基础知识详解
Jan 19 #Javascript
JavaScript实现垂直滚动条效果
Jan 18 #Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 #Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 #Javascript
基于JavaScript实现窗口拖动效果
Jan 18 #Javascript
You might like
初探PHP5
2006/10/09 PHP
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
php微信开发之上传临时素材
2016/06/24 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
获取body标签的两种方法
2011/10/13 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
2015/07/08 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
python使用Tkinter显示网络图片的方法
2015/04/24 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
在django中自定义字段Field详解
2019/12/03 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
Java中compareTo和compare的区别
2016/04/12 面试题
饮料业务员岗位职责
2013/12/15 职场文书
大学生实习思想汇报
2014/01/12 职场文书
运动会广播稿80字
2014/01/23 职场文书
高级编程求职信模板
2014/02/16 职场文书
新年寄语大全
2014/04/12 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书