js中兼容的库

var utils = (function () {

var flag = "getComputedStyle" in window;

//->listToArray:把类数组集合转换为数组

function listToArray(likeAry) {

if (flag) {

return Array.prototype.slice.call(likeAry, 0);

}

var ary = [];

for (var i = 0; i < likeAry.length; i++) {

ary[ary.length] = likeAry[i];

}

return ary;

}

//->formatJSON:把JSON格式字符串转换为JSON格式对象

function formatJSON(jsonStr) {

return "JSON" in window ? JSON.parse(jsonStr) : eval("(" + jsonStr + ")");

}

//->offset:获取页面中任意元素距离BODY的偏移

function offset(curEle) {

var disLeft = curEle.offsetLeft, disTop = curEle.offsetTop, par = curEle.offsetParent;

while (par) {

if (navigator.userAgent.indexOf("MSIE 8") === -1) {

disLeft += par.clientLeft;

disTop += par.clientTop;

}

disLeft += par.offsetLeft;

disTop += par.offsetTop;

par = par.offsetParent;

}

return {left: disLeft, top: disTop};

}

//->win:操作浏览器的盒子模型信息

function win(attr, value) {

if (typeof value === "undefined") {

return document.documentElement[attr] || document.body[attr];

}

document.documentElement[attr] = value;

document.body[attr] = value;

}

//->children:获取所有的元素子节点

function children(curEle, tagName) {

var ary = [];

if (!flag) {

var nodeList = curEle.childNodes;

for (var i = 0, len = nodeList.length; i < len; i++) {

var curNode = nodeList[i];

curNode.nodeType === 1 ? ary[ary.length] = curNode : null;

}

nodeList = null;

} else {

ary = this.listToArray(curEle.children);

}

if (typeof tagName === "string") {

for (var k = 0; k < ary.length; k++) {

var curEleNode = ary[k];

if (curEleNode.nodeName.toLowerCase() !== tagName.toLowerCase()) {

ary.splice(k, 1);

k--;

}

}

}

return ary;

}

//->prev:获取上一个哥哥元素节点

//->首先获取当前元素的上一个哥哥节点,判断是否为元素节点,不是的话基于当前的继续找上面的哥哥节点...一直到找到哥哥元素节点为止,如果没有哥哥元素节点,返回null即可

function prev(curEle) {

if (flag) {

return curEle.previousElementSibling;

}

var pre = curEle.previousSibling;

while (pre && pre.nodeType !== 1) {

pre = pre.previousSibling;

}

return pre;

}

//->next:获取下一个弟弟元素节点

function next(curEle) {

if (flag) {

return curEle.nextElementSibling;

}

var nex = curEle.nextSibling;

while (nex && nex.nodeType !== 1) {

nex = nex.nextSibling;

}

return nex;

}

//->prevAll:获取所有的哥哥元素节点

function prevAll(curEle) {

var ary = [];

var pre = this.prev(curEle);

while (pre) {

ary.unshift(pre);

pre = this.prev(pre);

}

return ary;

}

//->nextAll:获取所有的弟弟元素节点

function nextAll(curEle) {

var ary = [];

var nex = this.next(curEle);

while (nex) {

ary.push(nex);

nex = this.next(nex);

}

return ary;

}

//->sibling:获取相邻的两个元素节点

function sibling(curEle) {

var pre = this.prev(curEle);

var nex = this.next(curEle);

var ary = [];

pre ? ary.push(pre) : null;

nex ? ary.push(nex) : null;

return ary;

}

//->siblings:获取所有的兄弟元素节点

function siblings(curEle) {

return this.prevAll(curEle).concat(this.nextAll(curEle));

}

//->index:获取当前元素的索引

function index(curEle) {

return this.prevAll(curEle).length;

}

//->firstChild:获取第一个元素子节点

function firstChild(curEle) {

var chs = this.children(curEle);

return chs.length > 0 ? chs[0] : null;

}

//->lastChild:获取最后一个元素子节点

function lastChild(curEle) {

var chs = this.children(curEle);

return chs.length > 0 ? chs[chs.length - 1] : null;

}

//->append:向指定容器的末尾追加元素

function append(newEle, container) {

container.appendChild(newEle);

}

//->prepend:向指定容器的开头追加元素

//->把新的元素添加到容器中第一个子元素节点的前面,如果一个元素子节点都没有,就放在末尾即可

function prepend(newEle, container) {

var fir = this.firstChild(container);

if (fir) {

container.insertBefore(newEle, fir);

return;

}

container.appendChild(newEle);

}

//->insertBefore:把新元素(newEle)追加到指定元素(oldEle)的前面

function insertBefore(newEle, oldEle) {

oldEle.parentNode.insertBefore(newEle, oldEle);

}

//->insertAfter:把新元素(newEle)追加到指定元素(oldEle)的后面

//->相当于追加到oldEle弟弟元素的前面,如果弟弟不存在,也就是当前元素已经是最后一个了,我们把新的元素放在最末尾即可

function insertAfter(newEle, oldEle) {

var nex = this.next(oldEle);

if (nex) {

oldEle.parentNode.insertBefore(newEle, nex);

return;

}

oldEle.parentNode.appendChild(newEle);

}

//->hasClass:验证当前元素中是否包含className这个样式类名

function hasClass(curEle, className) {

var reg = new RegExp("(^| +)" + className + "( +|$)");

return reg.test(curEle.className);

}

//->addClass:给元素增加样式类名

function addClass(curEle, className) {

var ary = className.replace(/(^ +| +$)/g, "").split(/ +/g);

for (var i = 0, len = ary.length; i < len; i++) {

var curName = ary[i];

if (!this.hasClass(curEle, curName)) {

curEle.className += " " + curName;

}

}

}

//->removeClass:给元素移除样式类名

function removeClass(curEle, className) {

var ary = className.replace(/(^ +| +$)/g, "").split(/ +/g);

for (var i = 0, len = ary.length; i < len; i++) {

var curName = ary[i];

if (this.hasClass(curEle, curName)) {

var reg = new RegExp("(^| +)" + curName + "( +|$)", "g");

curEle.className = curEle.className.replace(reg, " ");

}

}

}

//->getElementsByClass:通过元素的样式类名获取一组元素集合

function getElementsByClass(strClass, context) {

context = context || document;

if (flag) {

return this.listToArray(context.getElementsByClassName(strClass));

}

//->IE6~8

var ary = [], strClassAry = strClass.replace(/(^ +| +$)/g, "").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 k = 0; k < strClassAry.length; k++) {

var reg = new RegExp("(^| +)" + strClassAry[k] + "( +|$)");

if (!reg.test(curNode.className)) {

isOk = false;

break;

}

}

if (isOk) {

ary[ary.length] = curNode;

}

}

return ary;

}

//->getCss:获取元素的样式值

function getCss(attr) {

var val = null, reg = null;

if (flag) {

val = window.getComputedStyle(this, null)[attr];

} else {

if (attr === "opacity") {

val = this.currentStyle["filter"];

reg = /^alpha\(opacity=(\d+(?:\.\d+)?)\)$/;

val = reg.test(val) ? reg.exec(val)[1] / 100 : 1;

} else {

val = this.currentStyle[attr];

}

}

reg = /^(-?\d+(\.\d+)?)(px|pt|em|rem)?$/;

return reg.test(val) ? parseFloat(val) : val;

}

//->setCss:给当前元素的某一个样式属性设置值(增加在行内样式上的)

function setCss(attr, value) {

if (attr === "float") {

this["style"]["cssFloat"] = value;

this["style"]["styleFloat"] = value;

return;

}

if (attr === "opacity") {

this["style"]["opacity"] = value;

this["style"]["filter"] = "alpha(opacity=" + value * 100 + ")";

return;

}

var reg = /^(width|height|top|bottom|left|right|((margin|padding)(Top|Bottom|Left|Right)?))$/;

if (reg.test(attr)) {

if (!isNaN(value)) {

value += "px";

}

}

this["style"][attr] = value;

}

//->setGroupCss:给当前元素批量的设置样式属性值

function setGroupCss(options) {

for (var key in options) {

if (options.hasOwnProperty(key)) {

setCss.call(this, key, options[key]);

}

}

}

//->css:此方法实现了获取、单独设置、批量设置元素的样式值

function css(curEle) {

var argTwo = arguments[1], ary = Array.prototype.slice.call(arguments, 1);

if (typeof argTwo === "string") {

if (typeof arguments[2] === "undefined") {

return getCss.apply(curEle, ary);

}

setCss.apply(curEle, ary);

}

argTwo = argTwo || 0;

if (argTwo.toString() === "[object Object]") {

setGroupCss.apply(curEle, ary);

}

}

//->把外界需要使用的方法暴露给utils

return {

win: win,

offset: offset,

listToArray: listToArray,

formatJSON: formatJSON,

children: children,

prev: prev,

next: next,

prevAll: prevAll,

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,

getElementsByClass: getElementsByClass,

css: css

}

})();

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

推荐阅读更多精彩内容

  • var utils = (function () {var frg = 'getComputedStyle' in...
    高冷潜质再发光阅读 363评论 0 0
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,017评论 1 10
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,621评论 2 17
  • 1. tab列表折叠效果 html: 能源系统事业部 岗位名称: 工作地点 岗位名...
    lilyping阅读 1,764评论 0 1
  • 还记得曾经胆怯的小孩吗?还记得从来没有一件事情能够完成的自卑者不? 还记得那就是曾经的自己。偶尔回头看看,会发现...
    鱼择阅读 197评论 0 0