js中兼容的庫

var utils = (function () {

var flag = "getComputedStyle" in window;

//->listToArray:把類數(shù)組集合轉(zhuǎn)換為數(shù)組

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格式字符串轉(zhuǎn)換為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:獲取所有的元素子節(jié)點

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:獲取上一個哥哥元素節(jié)點

//->首先獲取當(dāng)前元素的上一個哥哥節(jié)點,判斷是否為元素節(jié)點,不是的話基于當(dāng)前的繼續(xù)找上面的哥哥節(jié)點...一直到找到哥哥元素節(jié)點為止,如果沒有哥哥元素節(jié)點,返回null即可

function prev(curEle) {

if (flag) {

return curEle.previousElementSibling;

}

var pre = curEle.previousSibling;

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

pre = pre.previousSibling;

}

return pre;

}

//->next:獲取下一個弟弟元素節(jié)點

function next(curEle) {

if (flag) {

return curEle.nextElementSibling;

}

var nex = curEle.nextSibling;

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

nex = nex.nextSibling;

}

return nex;

}

//->prevAll:獲取所有的哥哥元素節(jié)點

function prevAll(curEle) {

var ary = [];

var pre = this.prev(curEle);

while (pre) {

ary.unshift(pre);

pre = this.prev(pre);

}

return ary;

}

//->nextAll:獲取所有的弟弟元素節(jié)點

function nextAll(curEle) {

var ary = [];

var nex = this.next(curEle);

while (nex) {

ary.push(nex);

nex = this.next(nex);

}

return ary;

}

//->sibling:獲取相鄰的兩個元素節(jié)點

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:獲取所有的兄弟元素節(jié)點

function siblings(curEle) {

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

}

//->index:獲取當(dāng)前元素的索引

function index(curEle) {

return this.prevAll(curEle).length;

}

//->firstChild:獲取第一個元素子節(jié)點

function firstChild(curEle) {

var chs = this.children(curEle);

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

}

//->lastChild:獲取最后一個元素子節(jié)點

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:向指定容器的開頭追加元素

//->把新的元素添加到容器中第一個子元素節(jié)點的前面,如果一個元素子節(jié)點都沒有,就放在末尾即可

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)的后面

//->相當(dāng)于追加到oldEle弟弟元素的前面,如果弟弟不存在,也就是當(dāng)前元素已經(jīng)是最后一個了,我們把新的元素放在最末尾即可

function insertAfter(newEle, oldEle) {

var nex = this.next(oldEle);

if (nex) {

oldEle.parentNode.insertBefore(newEle, nex);

return;

}

oldEle.parentNode.appendChild(newEle);

}

//->hasClass:驗證當(dāng)前元素中是否包含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:給當(dāng)前元素的某一個樣式屬性設(shè)置值(增加在行內(nèi)樣式上的)

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:給當(dāng)前元素批量的設(shè)置樣式屬性值

function setGroupCss(options) {

for (var key in options) {

if (options.hasOwnProperty(key)) {

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

}

}

}

//->css:此方法實現(xiàn)了獲取、單獨設(shè)置读整、批量設(shè)置元素的樣式值

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

}

})();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硕噩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躯肌,更是在濱河造成了極大的恐慌者春,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件清女,死亡現(xiàn)場離奇詭異钱烟,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拴袭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來读第,“玉大人,你說我怎么就攤上這事拥刻×鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵般哼,是天一觀的道長吴汪。 經(jīng)常有香客問我,道長蒸眠,這世上最難降的妖魔是什么漾橙? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮楞卡,結(jié)果婚禮上霜运,老公的妹妹穿的比我還像新娘。我一直安慰自己蒋腮,他們只是感情好淘捡,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徽惋,像睡著了一般案淋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上险绘,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天踢京,我揣著相機與錄音,去河邊找鬼宦棺。 笑死瓣距,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的代咸。 我是一名探鬼主播蹈丸,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呐芥!你這毒婦竟也來了逻杖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤思瘟,失蹤者是張志新(化名)和其女友劉穎荸百,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滨攻,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡够话,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年蓝翰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片女嘲。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡畜份,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欣尼,到底是詐尸還是另有隱情爆雹,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布媒至,位于F島的核電站顶别,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拒啰。R本人自食惡果不足惜驯绎,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谋旦。 院中可真熱鬧剩失,春花似錦、人聲如沸册着。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甲捏。三九已至演熟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間司顿,已是汗流浹背芒粹。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留大溜,地道東北人化漆。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像钦奋,于是被迫代替她去往敵國和親座云。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • var utils = (function () {var frg = 'getComputedStyle' in...
    高冷潛質(zhì)再發(fā)光閱讀 384評論 0 0
  • 單例模式 適用場景:可能會在場景中使用到對象付材,但只有一個實例朦拖,加載時并不主動創(chuàng)建,需要時才創(chuàng)建 最常見的單例模式厌衔,...
    Obeing閱讀 2,073評論 1 10
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品贞谓,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式葵诈。簡單...
    舟漁行舟閱讀 7,771評論 2 17
  • 1. tab列表折疊效果 html: 能源系統(tǒng)事業(yè)部 崗位名稱: 工作地點 崗位名...
    lilyping閱讀 1,869評論 0 1
  • 還記得曾經(jīng)膽怯的小孩嗎裸弦?還記得從來沒有一件事情能夠完成的自卑者不? 還記得那就是曾經(jīng)的自己作喘。偶爾回頭看看理疙,會發(fā)現(xiàn)...
    魚擇閱讀 216評論 0 0