utils工具库(27)

var utils = (function () {
var frg = 'getComputedStyle' in window;//如果frg为true,说明是标准浏览器;否则是IE6-8浏览器
return {
//类数组转数组
makeArray: function (arg) {
var ary = [];
if (frg) {//标准浏览器
ary = Array.prototype.slice.call(arg);
} else {//IE6-8浏览器
for (var i = 0; i < arg.length; i++) {
ary.push(arg[i]);
}
}
return ary;
},
//把json格式的字符串转成JSON格式的对象
jsonParse: function (strJson) {
return 'JSON' in window ? JSON.parse(strJson) : eval('(' + strJson + ')');
//当你的json in window 的时候 返回的是json格式的字符串否则返回的是eval
},
//求[n,m]之间的随机数 包含n和m
rnd: function (n, m) {
n = Number(n);
m = Number(m);
//无效数字返回0-1之间随机数
if (isNaN(n) || isNaN(m)) {
return Math.random();
}
if (n > m) {// 传错的时候
var tmp = m;
m = n;
n = tmp;
}
return Math.round(Math.random() * (m - n) + n);
},
//getCss:获取非行间样式(也可以拿到行内样式)
//获取 某个元素身上的某个样式值
//元素必须作为参数,样式也是个参数 值是要得到的返回值
getCss: function (ele, attr) {//ele是元素 attr是某个属性名 需要 求的是属性值
var value = null, reg = null;
if (frg) {//frg代表标准
value = getComputedStyle(ele, false)[attr];
} else {//IE6-8
if (attr == 'opacity') {//opacity 是透明度
value = ele.currentStyle.filter;//在ie浏览器下做的兼容 filter是ie兼容的值 filter alpha(opacity=xx);ie浏览器下1=100
reg = /alpha(opacity=:)/;//filter:alpha(opacity=10)
return reg.test(value) ? RegExp.$1 / 100 : 1;
// 校验value合不合格
} else {//不是透明度的话正常写
value = ele.currentStyle[attr];
}
}
//单位处理 px pt rem em
reg = /^([+-]?(\d|([1-9]\d+))(.\d+)?)(px|pt|rem|em)$/;
return reg.test(value) ? parseFloat(value) : value;
},
//win:盒子模型。求的是可视区的宽高和被浏览器卷去的高度
//通过第二个参数来区分获取和设置
win: function (attr, value) {
//value==undefined ; typeof value=='undefined' ; value==null;
if (value == null) {
return document.body[attr] || document.documentElement[attr];
}
document.body[attr] = document.documentElement[attr] = value;
},
//offset:求定位元素到body的偏移量
offset: function (ele) {
var l = ele.offsetLeft;
var t = ele.offsetTop;
var par = ele.offsetParent;
while (par) {
if (window.navigator.userAgent.toUpperCase().indexOf('MSIE 8.0') == -1) {//说明不是IE8得累加边框
l += par.clientLeft;
t += par.clientTop;
}
l += par.offsetLeft;
t += par.offsetTop;
par = par.offsetParent;
}
return {left: l, top: t};
},
//setCss:给元素设置一个样式
setCss: function (ele, attr, value) {
//3.浮动
if (attr === 'float') {
ele.style.cssFloat = value;//firefox
ele.style.styleFloat = value;//ie
return;
}
//2.处理透明度
if (attr === 'opacity') {
ele.style[attr] = value;//标准浏览器
ele.style.filter = 'alpha(opacity=' + value * 100 + ')';
return;
}
//1.处理单位:width,height,left,top,right,bottom,margin,padding
var reg = /(width|height|top|right|bottom|left|((margin|padding)(Top|Right|Bottom|Left)?))/g;
/if(reg.test(attr) && !/(auto|%)/.test(value)){
value=parseInt(value)+'px';
}
/
//富豪思想
if (reg.test(attr) && !isNaN(value)) {
value = value + 'px';
}
ele.style[attr] = value;//最核心的
},
//setGroupCss:给当前元素,设置一组样式
setGroupCss: function (ele, opt) {
for (var attr in opt) {
this.setCss(ele, attr, opt[attr]);
}
},
//css:三合一的方法;集获取,设置一个,设置一组为一体;
//都有的是ele,第二个参数,如果是字符串(1有第三个参数,2没有第三个);如果是对象,设置一组;---核心:在与区分参数
css: function (ele) {
var argTwo = arguments[1];// 第二个参数
//判断第二个参数的数据类型
if (typeof argTwo === 'string') {
var argThree = arguments[2];
//说明没有第三个参数,是获取
if (typeof argThree === 'undefined') {
return this.getCss(ele, argTwo);
} else {//有第三个参数,是设置一个
this.setCss(ele, argTwo, argThree);
}
}
//对象数据类型的检测,直接使用toString(); 是对象,说明是设置一组
if (argTwo.toString() === '[object Object]') {
this.setGroupCss(ele, argTwo);
}
},
//getChildren:获取当前容器下的所有元素
getChildren: function (parent, tagName) {
var childNodes = parent.childNodes;
var ary = [];
for (var i = 0; i < childNodes.length; i++) {
var cur = childNodes[i];
//先判断是个元素节点
if (cur.nodeType == 1) {
//如果第二个参数没有,说明不过滤,直接添加即可;
if (typeof tagName === 'undefined') {
ary.push(cur);
} else {//如果第二个参数有,需要比对标签名是否一致
if (cur.tagName.toLowerCase() === tagName.toLowerCase()) {
ary.push(cur);
}
}
}
}
return ary;
},
//prev:求上一个哥哥元素
prev: function (ele) {
if (frg) {
return ele.previousElementSibling;
}
var pre = ele.previousSibling;
while (pre && pre.nodeType !== 1) {
pre = pre.previousSibling;
}
return pre;
},
//next:下一个弟弟元素
next: function (ele) {
if (frg) {
return ele.nextElementSibling;
}
var nex = ele.nextSibling;//下一个弟弟节点
while (nex && nex.nodeType !== 1) {
nex = nex.nextSibling;
}
return nex;
},
//prevAll:当前元素所有的哥哥元素
prevAll: function (ele) {
var ary = [];
var pre = this.prev(ele);//先求出上一个哥哥元素
while (pre) {
ary.push(pre);
pre = this.prev(pre);
}
return ary;
},
//nextAll:
nextAll: function (ele) {
var ary = [];
var nex = this.next(ele);
while (nex) {
ary.push(nex);
nex = this.next(nex);
}
return ary;
},
//sibling:当前元素的相邻元素
sibling: function (ele) {
var prev = this.prev(ele);
var next = this.next(ele);
var ary = [];
if (prev) ary.push(prev);
if (next) ary.push(next);
return ary;
},
//siblings:当前元素的所有兄弟元素
siblings: function (ele) {
return this.prevAll(ele).concat(this.nextAll(ele));
},
//求当前元素的所有索引
index: function (ele) {
return this.prevAll(ele).length;
},
//firstChild:求当前容器下的第一个子元素
firstChild: function (parent) {
var aChild = this.getChildren(parent);
return aChild[0];
},
//lastChild:求当前容器的最后一个子元素
lastChild: function (parent) {
var aChild = this.getChildren(parent);
return aChild[aChild.length - 1];
},
//把元素插入到父容器的末尾;
appendChild: function (parent, ele) {
parent.appendChild(ele);
},
prependChild: function (parent, ele) {
var first = this.firstChild(parent);
if (first) {
parent.insertBefore(ele, first);
} else {
parent.appendChild(ele);
}
},
//insertBefore
insertBefore: function (newEle, oldEle) {
oldEle.parentNode.insertBefore(newEle, oldEle);
},
//insertAfter
insertAfter: function (newEle, oldEle) {
var nex = this.next(oldEle);//先求出oldEle的弟弟
if (nex) {
oldEle.parentNode.insertBefore(newEle, nex);
} else {
oldEle.parentNode.appendChild(newEle);
}
}
}
})();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容