這個版本完善hasClass和css 方法.javascript
新增 attr和datacss
css: function(attr, val) { //鏈式測試 for (var i = 0; i < this.length; i++) { if(typeof attr == 'string') { if (arguments.length == 1) { return getComputedStyle(this[0], null)[attr]; } this[i].style[attr] = val; } else { var _this = this[i]; f.each(attr,function(attr,val) { _this.style.cssText += '' + attr + ':' + val + ';'; }); } } return this; }
在咱們上一個版本中,沒有對css方法傳對象進行解析,在這咱們要進行完善.java
剛恰好咱們如今已經有了each方法!直接用上吧!git
在咱們的for循環中,要先判斷下傳入的attr參數是字符串仍是對象.github
若是是字符串,咱們就按照css('width','100px')
這樣的方式處理segmentfault
若是是對象css({"width":'100px','height':'200px'})
數組
var _this = this[i]; f.each(attr,function(attr,val) { _this.style.cssText += '' + attr + ':' + val + ';'; });
首先咱們緩存下當前的this,而後用cssText方法,直接拼接進去便可.緩存
接着咱們須要完善hasClass方法.這裏要着重說明下!目前我搜到的一大堆hasClass方法與jQuery的實現都是不一樣的less
好比有這樣的dom結構dom
<div id="pox"> <ul> <li class="a c">pox</li> <li class="b">pox</li> <li>pox</li><li>pox</li> <li>pox</li> </ul> </div>
咱們若是寫$('#pox li').hasClass('b')與$('#pox li').hasClass('a')那都會是什麼樣的結果呢?
結果是都會返回true.
而如今基本能搜到的徹底沒有作這方面的判斷.因此咱們來看看我是如何實現的
hasClass : function(cls) { var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); var arr = []; for (var i = 0; i < this.length; i++) { if (this[i].className.match(reg)) arr.push(true); else arr.push(false); } if (arr.indexOf(true) != -1) return true; else return false; }
首先咱們須要一個正則匹配,還須要一個數組,進行存儲每一個元素是否有存在判斷的class
而後咱們再在那個數組中尋找是否有true?若是有true,則返回true,若是一個true都沒有的狀況下,才能徹底返回false.但願你們在這裏要注意如下
最後是咱們的attr和data方法
attr : function(attr, val) { for (var i = 0; i < this.length; i++) { if(typeof attr == 'string') { if (arguments.length == 1) { return this[i].getAttribute(attr); } this[i].setAttribute(attr,val); } else { var _this = this[i]; f.each(attr,function(attr,val) { _this.setAttribute(attr,val);; }); } } return this; }, data : function(attr, val) { for (var i = 0; i < this.length; i++) { if(typeof attr == 'string') { if (arguments.length == 1) { return this[i].getAttribute('data-' + attr); } this[i].setAttribute('data-' + attr,val); } else { var _this = this[i]; f.each(attr,function(attr,val) { _this.setAttribute('data-' + attr,val);; }); } } return this; }
這兩個方法就很簡單啦,跟CSS方法相似,先判斷第一個參數是否爲字符串,若是是字符串就是直接增長一個屬性.若是是對象,就each下一個一個set便可.
毛主席說過,只閱不star都是耍流氓! :(
github地址: https://github.com/MeCKodo/forchange/tree/master/lesson-6
可想實現一個本身的簡單jQuery庫?(六):http://segmentfault.com/a/1190000004013654