摘要:兼容,因不支持和,分別用實現支持。支持明細代碼讓低版本支持讓低版本支持支持實現方式修復不規范傳參是否有必要判斷不支持實現方式完整代碼修復不規范傳參支持是否有必要判斷使用項目
兼容IE6+,因IE6、IE7、IE8不支持Array.prototype.indexOf()和String.prototype.trim(),分別用Polyfill實現支持。
詳細:
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
由于現代瀏覽器都基本支持了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應該避免直接使用多個參數,支持不全面。
SVG 和 MathML 元素支持度也不全面(這個坑下面的代碼并未填上,請熟知,有興趣的可以查下Zepto是怎么填坑的)。
classList支持明細: 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 實現方式
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; //修復不規范傳參 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 實現方式
/** * 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; //修復不規范傳參 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80098.html
摘要:使用可以給元素很方便的添加和刪除等操作,現在原生的也可以實現這個方法了。刪除指定的類值。所以目前來看,還是無法在實際中放心的使用,只能用于某些特定的項目等。不過我們可以通過一些來實現,或者最下方給出的原生實現。 使用jQuery可以給元素很方便的添加class和刪除class等操作,現在原生的JavaScript也可以實現這個方法了。使用classList可以方便的添加class、刪除...
摘要:眼看的源碼就快到頭了,后面還有幾個重要的內容,包括和動畫操作,加油把它們看完,百度前端學院的新一批課程也開始了。,當第二個參數為的情況,就是,為時,,從源碼來看,就是直接調用的這兩個函數。參考源碼分析樣式操作本文在上的源碼地址,歡迎來。 歡迎來我的專欄查看系列文章。 眼看 jQuery 的源碼就快到頭了,后面還有幾個重要的內容,包括 ajax 和動畫操作,加油把它們看完,百度前端學院的...
摘要:最近在用寫頁面,當然了在移動里引入或這些框架,肯定是極不理性的。原生挺簡單,為何需要的成功當時是因為這些瀏覽器不兼容,讓開發者崩潰,而且上瀏覽器性能好,跨平臺兼容也不影響性能。但根本就不是為手機設計的。 最近在用mui寫頁面,當然了在移動App里引入jq或zepto這些框架,肯定是極不理性的。原生JS挺簡單,為何需要jq?jq的成功當時是因為ie6、7、8、9、10、chrome、ff...
摘要:四作用檢查目標元素是否包含指定的類源碼源碼行關鍵代碼這個代碼還挺簡單的,就不解析了。 showImg(https://segmentfault.com/img/remote/1460000019280925); 一、$().addClass()作用:向目標元素添加一個或多個類名 源碼: //向目標元素添加一個或多個類名 //源碼8401行 addClass: f...
摘要:實現方法方法有判斷是否存在類名,返回值添加類名從列表中刪除類名切換類名如果列表中存在則刪除,否則添加 js 實現 hasClass(), addClass(), removeClass() 方法 HTML5-classList classList 方法有 contains(className) // 判斷是否存在類名,返回Boolean值 add(className) /...
閱讀 2591·2021-09-26 10:17
閱讀 3221·2021-09-22 15:16
閱讀 2131·2021-09-03 10:43
閱讀 3258·2019-08-30 11:23
閱讀 3658·2019-08-29 13:23
閱讀 1301·2019-08-29 11:31
閱讀 3686·2019-08-26 13:52
閱讀 1394·2019-08-26 12:22