var utils = (function(window) {

    var flag = "getComputedStyle" in window;

    function win(attr, value) {
if(typeof value !== "undefined") {
document.documentElement[attr] = value;
document.body[attr] = value;
}
return document.documentElement[attr] || document.body[attr];
} function getCss(curEle, attr) {
var val = null,
reg = null;
if(!flag) {
if(attr === "opacity") {
val = curEle.currentStyle["filter"];
reg = /^alpha\(opacity=(\d+(?:\.\d+)?)\)$/i
val = reg.test(val) ? reg.exec(val)[1] / 100 : 1;
} else {
val = curEle.currentStyle[attr];
}
} else {
val = window.getComputedStyle(curEle, null)[attr];
} reg = /^(-?\d+(\.\d+)?)(px|pt|rem|rm)?$/i;
if(reg.test(val)) {
return parseFloat(val);
} else {
return val;
}
} function listToArray(likeAry) {
var ary = [];
if(!flag) {
for(var i = 0; i < likeAry.length; i++) {
ary[ary.length] = likeAry[i];
}
} else {
ary = Array.prototype.slice.call(likeAry);
}
return ary;
} function trim(str) {
return str.replace(/(^ +| +$)/g, "");
} function jsonParse(str) {
var obj = null;
if(!flag) {
obj = eval("(" + str + ")");
} else {
obj = JSON.parse(str);
}
return obj;
} function offset(curEle) {
var top = null,
left = null,
par = curEle.offsetParent; left += curEle.offsetLeft;
top += curEle.offsetTop; while(par) {
//IE8已经包含边框
if(navigator.userAgent.indexOf("MSIE 8") === -1) {
//累加父级边框
left += par.clientLeft;
top += par.clientTop;
} //累加父级参照物偏移量
left += par.offsetLeft;
top += par.offsetTop; par = par.offsetParent;
} return {
top: top,
left: left
}
} function children(curEle, tagName) {
var nodeList = curEle.childNodes;
var ary = []; if(!flag) {
for(var i = 0, len = nodeList.length; i < len; i++) {
var curNode = nodeList[i];
if(curNode.nodeType === 1) {
ary[ary.length] = curNode;
}
nodeList = null;
}
} else {
//类数组转换为数组
ary = Array.prototype.slice.call(curEle.children);
}
//二次筛选
if(typeof tagName === "string") {
for(var j = 0; j < ary.length; j++) {
var curEleNode = ary[j];
if(curEleNode.nodeName.toLowerCase() !== tagName.toLowerCase()) {
ary.splice(j, 1);
j--;
}
}
}
return ary;
} function prev(curEle) {
if(flag) {
return curEle.previousElementSibling;
}
var pre = curEle.previousSibling;
while(pre && pre.nodeType !== 1) {
pre = pre.previousSibling;
}
return pre;
} function prevAll(curEle) {
var ary = [];
var pre = this.prev(curEle);
while(pre) {
ary.unshift(pre);
pre = this.prev(pre);
}
return ary;
} function next(curEle) {
if(flag) {
return curEle.nextElementSibling;
}
var next = curEle.nextSibling;
while(next && next.nodeType !== 1) {
next = next.previousSibling;
}
return next;
} function nextAll(curEle) {
var ary = [];
var next = this.next(curEle);
while(next) {
ary.push(next);
next = this.next(next);
}
return ary;
} function sibling(curEle) {
var ary = [];
var pre = this.prev(curEle);
var next = this.next(curEle);
pre ? ary.push(pre) : null;
next ? ary.push(next) : null;
return ary;
} function siblings(curEle) {
return this.prevAll(curEle).concat(this.nextAll(curEle));
} function index(curEle) {
return this.prevAll(curEle).length;
} function firstChild(curEle) {
var children = this.children(curEle);
return children.length > 0 ? children[0] : null;
} function lastChild(curEle) {
var children = this.children(curEle);
return children.length > 0 ? children[children.length - 1] : null;
} function append(newEle, container) {
container.appendChild(newEle);
} function prepend(newEle, container) {
var firstEle = this.firstChild(container);
if(firstEle) {
container.insertBefore(newEle, firstEle);
return;
}
this.append(newEle, container);
} function insertBefore(newEle, oldEle) {
oldEle.parentNode.insertBefore(newEle, oldEle);
} function insertAfter(newEle, oldEle) {
var next = this.next(oldEle);
if(next) {
oldEle.parentNode.insertBefore(newEle, next);
return;
}
oldEle.parentNode.appendChild(newEle); } function hasClass(curEle, className) {
var reg = new RegExp("(^| +)" + className + "( +|$))");
return reg.test(curEle.className)
} function addClass(curEle, className) {
//防止传递的多个类名,先拆分成数组
var ary = this.trim(className).split(/ +/g);
for(var i = 0; i < ary.length; i++) {
var curClass = ary[i];
if(!this.hasClass(curEle, curClass)) {
curEle.className += " " + curClass;
}
}
} function removeClass(curEle, className) {
//防止传递的多个类名,先拆分成数组
var ary = this.trim(className).split(/ +/g);
var reg = new RegExp("(^| +)" + className + "( +|$))", "g");
for(var i = 0; i < ary.length; i++) {
var curClass = ary[i];
if(this.hasClass(curEle, curClass)) {
curEle.className = curEle.className.replace(reg, " ");
}
}
} function getEleByClass(className, context) {
context = context || document;
if(flag) {
return this.listToArray(context.getElementsByClassName(className));
} var ary = [];
var classNameAry = this.trim(className).split(/ +/g);
var nodeList = context.getElementsByTagName("*");
for(var i = 0, len = nodeList.length; i < len; i++) {
var curNode = nodeList[i]; var isOk = true; for(var j = 0; j < classNameAry.length; j++) {
var curName = classNameAry[j];
var reg = new RegExp("(^| +)" + curName + "( +|$)")
if(!reg.test(curNode.className)) {
isOk = false;
break;
}
}
if(isOk) {
ary.push(curNode);
}
}
return ary;
} function setCss(curEle, attr, value) {
reg = /^(width|height|top|right|bottom|left|(margin|padding)(Top|Right|Bottom|Right|)?)$/; if(attr === "float") {
curEle.style["cssFloat"] = value;
curEle.style["styleFloat"] = value;
return;
} if(attr === "opacity") {
curEle.style["opacity"] = value;
curEle.style["filter"] = "alpha(opacity=" + value * 100 + ")";
return;
} if(reg.test(attr)) {
if(!isNaN(value)) {
curEle.style[attr] = value + "px";
}
}
curEle.style[attr] = value; } function setGroupCss(curEle, obj) {
obj = obj || 0;
if(obj.toString() !== "[object Object]") {
return;
}
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
this.setCss(curEle, key, obj[key]);
}
}
} function css(curEle) {
var arg2 = arguments[1];
if(typeof arg2 === "string") {
var arg3 = arguments[2];
if(typeof arg3 === "undefined") {
return this.getCss.call(curEle, arguments);
}
this.setCss.call(curEle, arguments);
}
arg2 = arg2 || 0;
if(arg2.toString() === "[object Object]") {
this.setGroupCss.apply(this, arguments);
}
} return {
win: win, //操作浏览器盒子模型
listToArray: listToArray, //类数组转换为数组
trim: trim, //去除字符串首尾空格
jsonParse: jsonParse, //格式化JSON
offset: offset, //获取元素偏移量
children: children, //获取元素所有子节点
prev: prev, //获取哥哥节点
prevAll: prevAll, //获取所有哥哥节点
next: next, //获取弟弟节点
nextAll: nextAll, //获取所有弟弟节点
sibling: sibling, //获取相邻两个节点
siblings: siblings, //获取所有兄弟节点
index: index, //获取当前元素索引
firstChild: firstChild, //获取当前元素第一个子节点
lastChild: lastChild, //获取当前元素最后一个子节点
append: append, //向当前元素末尾追加一个元素
prepend: prepend, //向当前元素之前追加一个元素
insertBefore: insertBefore, //把当前元素追加指定元素之前
insertAfter: insertAfter, //把当前元素追加指定元素之后
hasClass: hasClass, //判断元素是否有某个类名
addClass: addClass, //给元素增加样式
removeClass: removeClass, //删除元素样式
getEleByClass: getEleByClass, //通过类名获取元素
getCss: getCss, //获取元素样式
setCss: setCss, //设置元素样式
css: css //获取设置css
}
})(window)

封装了大多数常用的dom操作,页面引入即可使用,不依赖任何库,纯原生js,欢迎留言提交BUG,与我联系。

原生js封装dom操作库的更多相关文章

  1. 抛开jQuery,拾起原生JS的DOM操作

    常用的JS-DOM操作与jQuery的对比 jQuery用多了,还是需要来熟练熟练原生JS的操作,不然写JS都快离不开jQuery了 目录 1. 获取DOM 2. 创建DOM 3. 添加DOM 4. ...

  2. 原生js的dom操作

    父节点parentNode 第一个子节点 只会获取到元素节点 firstElementChild ★★★★★    ​ 第一个子节点 (如果有文本节点将会获取到文本节点) firstChild ​ 最 ...

  3. 利用原生js的Dom操作实现简单的ToDoList的效果

    效果如下: 前端及js代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  4. 整理一下原生js的dom操作

    获取元素 getElementById() getElementsByClass() getElementsByTagName getElementsByName node属性 前.后.父.子 pre ...

  5. js的dom操作(整理)(转)

    js的dom操作整理(整理)(转) 一.总结 一句话总结: dom操作有用原生js的dom操作,也可以用对js封装过的jquery等插件来来更加方便的进行dom操作 1.dom是什么? 对于JavaS ...

  6. js的DOM操作整理(整理)

    js的DOM操作整理(整理) 一.总结 一句话总结: dom操作有用原生js的dom操作,也可以用对js封装过的jquery等插件来更加方便的进行dom操作 1.dom是什么? 对于JavaScrip ...

  7. 原生JS和jQuery操作DOM的区别小结

    一.Js原生对象和jQuery实例对象的相互转化: (1).原生JS对象转JQ对象: $(DOM对象); (2). JQ对象转原生JS对象: $(DOM对象).get(index); //注意区分eq ...

  8. zBase --轻量级DOM操作库

    项目地址:ZengTianShengZ-github zBase-1.2.0 --v3 修复部分bug,添加AMD规范测试 zBase-1.1.0 --v2 对 v1 版本做了升级,优化DOM查找,简 ...

  9. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

随机推荐

  1. Ecshop 2.x_3.x SQL注入和代码执行漏洞复现和分析

    0x00 前言 问题发生在user.php的的显示函数,模版变量可控,导致注入,配合注入可达到远程代码执行 0x01 漏洞分析 1.SQL注入 先看user.php的$ back_act变量来源于HT ...

  2. 解题:SDOI 2017 数字表格

    题面 反演题,推式子么=.= $\prod\limits_{d=1}^{min(n,m)}\prod\limits_{i=1}^n\prod\limits_{j=1}^m[gcd(i,j)==d]fi ...

  3. c++ 容器弊端

    1.stack 不能直接清空,要 while (!s.empty()) s.pop(); 2.vector 增添.删除数据,也许vector首尾的地址会发生改变 如: ( watch f.begin( ...

  4. 勉励自己--淡定的CrazyDog

    明天就要靠六级,今天只是背了一篇作文,做了两篇阅读,收获很小啊,但是要求自己一定要写,博客,我就把自己背的作文模板写成日记好了(纯手打) Relationship Between Major and ...

  5. svn提交失败 :“svn: E200007: Commit failed”

    引言: 在切换subversion服务器地址之后,发生的无法正确提交代码的问题org.apache.subversion.javahl.ClientException: svn: E200007: C ...

  6. ElasticStack系列之十六 & ElasticSearch5.x index/create 和 update 源码分析

    开篇 在ElasticSearch 系列十四中提到的问题即 ElasticStack系列之十四 & ElasticSearch5.x bulk update 中重复 id 性能骤降,继续这个问 ...

  7. P1147 连续自然数和

    P1147 连续自然数和 题目描述 对一个给定的自然数 M ,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为 M . Solution 两点问题 弄两个点 \(l,r\) , 因为前缀和 ...

  8. HTTP协议(2)-------- 网络编程

    1. HTTP请求格式 做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干.HTTP协议传输的消息 ...

  9. 大量DOM操作的解决方案

    案例:如何在页面元素ul中一次性插入30000个li标签,保证页面体验流畅呢? 解决方案:可以从减少 DOM 操作次数.缩短循环时间两个方面减少主线程阻塞的时间 减少 DOM 操作次数的良方是 Doc ...

  10. appium 使用过程问题踩坑-笔记

    问题1:虚拟设备选用问题 运行脚本抛出异常,创建session对象失败 排查过程:在进入cmd模式下: ①adb devices   --ok ②appium-doctor  --ok ③appium ...