摘要:兼容,因不支持和,分別用實現(xiàn)支持。支持明細(xì)代碼讓低版本支持讓低版本支持支持實現(xiàn)方式修復(fù)不規(guī)范傳參是否有必要判斷不支持實現(xiàn)方式完整代碼修復(fù)不規(guī)范傳參支持是否有必要判斷使用項目
兼容IE6+,因IE6、IE7、IE8不支持Array.prototype.indexOf()和String.prototype.trim(),分別用Polyfill實現(xiàn)支持。
詳細(xì):
indexOf https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
trim: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
由于現(xiàn)代瀏覽器都基本支持了classList,所以移動端可以直接使用classList會更方便一些,如:
var div = document.getElementById("div"); div.classList.remove("foo"); div.classList.add("anotherclass"); div.classList.toggle("visible"); div.classList.contains("foo"); // div.classList.add("foo","bar"); //Android4.3不支持
代碼 Polyfill應(yīng)該避免直接使用多個參數(shù),支持不全面。
SVG 和 MathML 元素支持度也不全面(這個坑下面的代碼并未填上,請熟知,有興趣的可以查下Zepto是怎么填坑的)。
classList支持明細(xì): http://caniuse.com/#search=classList
// 讓低版本IE支持 Array.prototype.indexOf // Polyfill (indexOf @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement, fromIndex) { var k; if (this == null) { throw new TypeError(""this" is null or not defined"); } var o = Object(this); var len = o.length >>> 0; if (len === 0) { return -1; } var n = +fromIndex || 0; if (Math.abs(n) === Infinity) { n = 0; } if (n >= len) { return -1; } k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); while (k < len) { if (k in o && o[k] === searchElement) { return k; } k++; } return -1; }; } // 讓低版本IE支持 String.prototype.trim() // Polyfill (trim @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) if (!String.prototype.trim) { String.prototype.trim = function(){ return this.replace(/^[suFEFFxA0]+|[suFEFFxA0]+$/g, ""); }; }支持 classList 實現(xiàn)方式
function ctrlClass(opts) { if (!opts.ele || !opts.c) return false; // console.log(opts.c) var c = null; typeof (opts.c) === "string" ? c = opts.c.trim().replace(/s+/g, " ").split(" ") : c = opts.c; //修復(fù)不規(guī)范傳參 return opts.fun({ ele: opts.ele, c: c }); opts.ele = null; } /** * hasClass * @param (element, "c1 c2 c3 c4 c5") */ function hasClass(ele, c) { return ctrlClass({ ele: ele, c: c, fun: function(opts) { return opts.c.every(function(v) { return !!opts.ele.classList.contains(v); }); } }); } /** * addClass * @param (element, "c1 c2 c3 c4 c5") */ function addClass(ele, c) { return ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; c.forEach(function(v) { if (!hasClass(ele, v)) { ele.classList.add(v); } }); } }) } /** * removeClass * @param (element, "c1 c2 c3") */ function removeClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; c.forEach(function(v) { // TODO 是否有必要判斷 hasClass // if (!hasClass(ele, v)) { ele.classList.remove(v); // } }); } }); } /** * toggleClass * @param (element, "c1 c2 c3") */ function toggleClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; c.forEach(function(v) { ele.classList.toggle(v); }) } }) }不支持 classList 實現(xiàn)方式
/** * hasClass * @param (element, "c1 c2 c3 c4 c5") */ function hasClass(ele, c) { return ctrlClass({ ele: ele, c: c, fun: function(opts) { var cln = opts.ele.className.split(" "); var c = opts.c; for (var i = 0; i < c.length; i++) { if(cln.indexOf(c[i]) !== -1){ return true; } } return false; } }); } /** * addClass * @param (element, "c1 c2 c3") */ function addClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; for (var i = 0; i < c.length; i++) { if(!hasClass(ele, c[i])) { ele.className = ele.className !== "" ? (ele.className + " " + c[i]) : c[i]; } } } }); } /** * removeClass * @param (element, "c1 c2 c3") */ function removeClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c, cln = ele.className.split(" "); for (var i = 0; i < c.length; i++) { if (hasClass(ele, c[i])) { cln.splice(cln.indexOf(c[i]), 1); } } ele.className = cln.join(" "); } }); } /** * toggleClass * @param (element, "c1 c2 c3") */ function toggleClass(ele, c){ ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; for (var i = 0; i < c.length; i++) { !!hasClass(ele, c[i]) ? removeClass(ele, c[i]) : addClass(ele, c[i]); } } }); }完整代碼
// Polyfill (indexOf @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement, fromIndex) { var k; if (this == null) { throw new TypeError(""this" is null or not defined"); } var o = Object(this); var len = o.length >>> 0; if (len === 0) { return -1; } var n = +fromIndex || 0; if (Math.abs(n) === Infinity) { n = 0; } if (n >= len) { return -1; } k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); while (k < len) { if (k in o && o[k] === searchElement) { return k; } k++; } return -1; }; } // Polyfill (trim @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) if (!String.prototype.trim) { String.prototype.trim = function(){ return this.replace(/^[suFEFFxA0]+|[suFEFFxA0]+$/g, ""); }; } var cl = ("classList" in document.createElement("a")); function ctrlClass(opts) { if (!opts.ele || !opts.c) return false; // console.log(opts.c) var c = null; typeof (opts.c) === "string" ? c = opts.c.trim().replace(/s+/g, " ").split(" ") : c = opts.c; //修復(fù)不規(guī)范傳參 return opts.fun({ ele: opts.ele, c: c }); opts.ele = null; } // 支持 classList if(cl){ /** * hasClass * @param (element, "c1 c2 c3 c4 c5") */ function hasClass(ele, c) { return ctrlClass({ ele: ele, c: c, fun: function(opts) { return opts.c.every(function(v) { return !!opts.ele.classList.contains(v); }); } }); } /** * addClass * @param (element, "c1 c2 c3 c4 c5") */ function addClass(ele, c) { return ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; c.forEach(function(v) { if (!hasClass(ele, v)) { ele.classList.add(v); } }); } }) } /** * removeClass * @param (element, "c1 c2 c3") */ function removeClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; c.forEach(function(v) { // TODO 是否有必要判斷 hasClass // if (!hasClass(ele, v)) { ele.classList.remove(v); // } }); } }); } /** * toggleClass * @param (element, "c1 c2 c3") */ function toggleClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; c.forEach(function(v) { ele.classList.toggle(v); }) } }) } }else{ /** * hasClass * @param (element, "c1 c2 c3 c4 c5") */ function hasClass(ele, c) { return ctrlClass({ ele: ele, c: c, fun: function(opts) { var cln = opts.ele.className.split(" "); var c = opts.c; for (var i = 0; i < c.length; i++) { if(cln.indexOf(c[i]) !== -1){ return true; } } return false; } }); } /** * addClass * @param (element, "c1 c2 c3") */ function addClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; for (var i = 0; i < c.length; i++) { if(!hasClass(ele, c[i])) { ele.className = ele.className !== "" ? (ele.className + " " + c[i]) : c[i]; } } } }); } /** * removeClass * @param (element, "c1 c2 c3") */ function removeClass(ele, c) { ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c, cln = ele.className.split(" "); for (var i = 0; i < c.length; i++) { if (hasClass(ele, c[i])) { cln.splice(cln.indexOf(c[i]), 1); } } ele.className = cln.join(" "); } }); } /** * toggleClass * @param (element, "c1 c2 c3") */ function toggleClass(ele, c){ ctrlClass({ ele: ele, c: c, fun: function(opts) { var ele = opts.ele, c = opts.c; for (var i = 0; i < c.length; i++) { !!hasClass(ele, c[i]) ? removeClass(ele, c[i]) : addClass(ele, c[i]); } } }); } }使用
var ele = document.getElementById("test"); hasClass(ele, "c1"); addClass(ele, "c1 c2 c3"); removeClass(ele, "c1 c2 c3"); toggleClass(ele, "c1 c2 c3");項目
https://github.com/givebest/ctrl-cssClass
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80098.html
摘要:使用可以給元素很方便的添加和刪除等操作,現(xiàn)在原生的也可以實現(xiàn)這個方法了。刪除指定的類值。所以目前來看,還是無法在實際中放心的使用,只能用于某些特定的項目等。不過我們可以通過一些來實現(xiàn),或者最下方給出的原生實現(xiàn)。 使用jQuery可以給元素很方便的添加class和刪除class等操作,現(xiàn)在原生的JavaScript也可以實現(xiàn)這個方法了。使用classList可以方便的添加class、刪除...
摘要:眼看的源碼就快到頭了,后面還有幾個重要的內(nèi)容,包括和動畫操作,加油把它們看完,百度前端學(xué)院的新一批課程也開始了。,當(dāng)?shù)诙€參數(shù)為的情況,就是,為時,,從源碼來看,就是直接調(diào)用的這兩個函數(shù)。參考源碼分析樣式操作本文在上的源碼地址,歡迎來。 歡迎來我的專欄查看系列文章。 眼看 jQuery 的源碼就快到頭了,后面還有幾個重要的內(nèi)容,包括 ajax 和動畫操作,加油把它們看完,百度前端學(xué)院的...
摘要:最近在用寫頁面,當(dāng)然了在移動里引入或這些框架,肯定是極不理性的。原生挺簡單,為何需要的成功當(dāng)時是因為這些瀏覽器不兼容,讓開發(fā)者崩潰,而且上瀏覽器性能好,跨平臺兼容也不影響性能。但根本就不是為手機(jī)設(shè)計的。 最近在用mui寫頁面,當(dāng)然了在移動App里引入jq或zepto這些框架,肯定是極不理性的。原生JS挺簡單,為何需要jq?jq的成功當(dāng)時是因為ie6、7、8、9、10、chrome、ff...
摘要:四作用檢查目標(biāo)元素是否包含指定的類源碼源碼行關(guān)鍵代碼這個代碼還挺簡單的,就不解析了。 showImg(https://segmentfault.com/img/remote/1460000019280925); 一、$().addClass()作用:向目標(biāo)元素添加一個或多個類名 源碼: //向目標(biāo)元素添加一個或多個類名 //源碼8401行 addClass: f...
摘要:實現(xiàn)方法方法有判斷是否存在類名,返回值添加類名從列表中刪除類名切換類名如果列表中存在則刪除,否則添加 js 實現(xiàn) hasClass(), addClass(), removeClass() 方法 HTML5-classList classList 方法有 contains(className) // 判斷是否存在類名,返回Boolean值 add(className) /...
閱讀 2614·2021-09-26 10:17
閱讀 3239·2021-09-22 15:16
閱讀 2148·2021-09-03 10:43
閱讀 3273·2019-08-30 11:23
閱讀 3671·2019-08-29 13:23
閱讀 1317·2019-08-29 11:31
閱讀 3699·2019-08-26 13:52
閱讀 1408·2019-08-26 12:22