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. 【bzoj2438】 中山市选2011—杀人游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2438 (题目链接) 题意 n个点的有向图,其中有一个是杀手,每个人成为杀手的概率相同.警察询问一个人 ...

  2. OS X 安装pyspider

    pyspider安装的过程中,需要安装pycurl.有几个坑 一.首先遇到权限的问题 因为/Library目录是root权限,所以非root用户对该目录的读写经常会遇到权限问题,但是不宜切换成root ...

  3. cpplint

    Cpplint是一个Python脚本,作为一款开源免费的代码静态检测工具,Google也使用它作为自己的C++代码检测工具,也就是说,只要你的代码遵从Google C++代码规范,那么Cpplint将 ...

  4. poi导出word表格详解 超详细了

    转:非常感谢原作者 poi导出word表格详解 2018年07月20日 10:41:33 Z丶royAl 阅读数:36138   一.效果如下 二.js代码 function export_word( ...

  5. error: failed to connect to the hypervisor error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory 解决办法

    服务器版本:CentOS Linux release 7.4 Linux lb 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x8 ...

  6. STL中的优先级队列priority_queue

    priority_queue(queue类似)完全以底部容器为根据,再加上二叉堆(大根堆或者小根堆)的实现原理,所以其实现非常简单,缺省情况下priority_queue以vector作为底部容器.另 ...

  7. NO.1 Day 计算机基础

    计算机基础 1.编程语言的作用及与操作系统和硬件的关系 编程语言是程序员与计算机之间沟通的媒介. 一套完整的计算机系统分为计算机硬件.操作系统和软件三部分.编程语言开发的结果为软件.软件的运行在操作系 ...

  8. python常用模块(3)

    ConfigParser模块学习 ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每个节可 ...

  9. 转:iOS7导航栏遮盖问题的解决

    在开发iOS7的界面的时候,有时候你会发现UIViewController里的subView有时会被导航栏遮盖,原因是iOS7鼓励全屏布局,UIViewController中的self.view的坐标 ...

  10. webApp 页面适配布局

    webApp 页面布局 1. 流式布局 概念: 流式布局是页面元素宽度按照屏幕分辨率进行适配调整,但是整体布局不变. 设计方法: 布局都是通过百分比来定义宽度,但是高度大都是用px固定的. 弊端: 虽 ...