JQuery模塊分析及其實現第四部分屬性部分功能及實現,接第三部分!
appendTo 方法
- 功能:將結果集中的元素 追加到指定的
dom
元素上. - 語法:
<target對象>.appendTo(target)
- 實現思路
- 定義
appendTo
方法,聲明一個形參target
.追加到目標dom
元素- 選擇器
dom
元素dom
數組
- 爲了操作方便,將
target
類型統一爲itcast
對象,去itcast
函數走一圈,出來就是itcast
對象. - 遍歷
this
上的每一個dom
元素,再遍歷target
上的每一個dom
元素 - 將
this
上的dom
元素追加到target
上 - 注意:
在追加節點時,如果遍歷的是第一個目標
dom
元素,不需要拷貝節點;否則要深拷貝節點,並將上述得到的節點儲存到ret
內 - 將
ret
數組轉換成itcast
對象,作爲appendTo
方法的返回值- 如果不這樣做的話,就會在添加樣式時,只有沒拷貝的節點有樣式
- 定義
appendTo: function(target) { var node, ret = []; // 統一target類型 爲itcast對象(爲了方便操作) target = itcast(target); // 遍歷this上的每一個dom元素 this.each(function(v) { // 在遍歷目標dom元素 target.each(function(t, i) { // 如果當前dom元素爲 目標上的第一個.不拷貝節點 // 否則拷貝節點 node = i === 0 ? v : v.cloneNode(true); // 將被追加的節點,添加到ret內 ret.push(node); // 將節點追加到指定的目標dom元素上. t.appendChild(node); }); }); // 將每一個添加的dom元素,轉換成itcast對象返回,實現鏈式編程 // 原因:在添加樣式時,如果不這樣做的話,只會給沒克隆的節點添加樣式. return itcast(ret); }
append 方法
- 語法:
<itcast對象>.append(source)
; - 功能: 將
source
上的所有dom
元素,追加到itcast
對象上 - 實現思路
- 統一
source
類型,爲itcast
對象. source.appendTo(this)
return this;
- 統一
append: function(source) { //統一source類型,爲itcast對象 source = itcast(source); source.appendTo(this); return this; },
prependTo 方法
- 語法:
<itcast對象>.prependTo(target);
- 功能:將
itcast
對象上的每一個dom
元素,追加到target
最前邊insertBefore
- 實現思路
- 統一
target
類型,爲itcast
對象 - 定義
node
變量,臨時存儲被追加的結點.定義ret
數組,存儲所有被追加的節點 - 先遍歷
target
上的每一個dom
元素 - 定義變量
firstChild
,臨時存儲當前目標dom
元素的第一個子節點,再遍歷this
上的每一個dom
元素 - 判斷當前遍歷的
dom
是否爲target
上的第一個dom
元素 - 如果爲真,此時不需要克隆節點
- 否則,要深克隆節點
- 將上述的到的節點,
push
到ret
內 - 調用
insertBefore
方法追加節點,此時第一個參數爲追加新的節點,第二個參數爲firstChild
,在firstChild
之前追加新節點. - 兩層循環結束,操作完成
- 將
ret
轉換成itcast
對象,作爲prependTo
方法的返回值,實現鏈式編程.
- 統一
prependTo: function(target) { //定義變量node,臨時存儲被追加的節點 var node, //定義變量firstChild,臨時存儲當前dom元素的第一個子節點 firstChild, self = this, //定義ret數組,存儲所有被追加的節點 ret = []; //統一類型爲itcast對象 target = itcast(target); //遍歷target上的每一個dom元素 target.each(function(elem, i) { // 緩存當前目標dom元素的第一個子節點 firstChild = elem.firstChild; //遍歷this上的每一個dom元素 self.each(function(dom) { //判斷當前遍歷的dom是否爲target上的每一個dom元素 //若爲真,則不需要克隆節點,否則,要深克隆節點 // 將得到的節點賦值給node node = i === 0 ? dom : dom.cloneNode(true); //將節點push到ret內 ret.push(node); //調用insertBefore方法,追加節點(追加的新節點,firstChild) elem.insertBefore(node, firstChild); }); }); //將ret作爲itcast對象,並且返回 return itcast(ret); }
prepend 方法
- 語法:
<itcast對象>.prepend(source);
- 功能:把
source
上的所有的dom
元素,添加到this
上的最前邊 - 實現思路:
- 統一
source
類型,爲itcast
對象 - 通過
source
調用prependTo
方法,將source
上的所有dom
添加到this
上的最前邊 return this
實現鏈式編程
- 統一
prepend: function(source) { source = itcast(source); source.prependTo(this); return this; }
next 方法
- 功能:獲取
itcast
對象上所有dom
元素的下一個兄弟元素(nextSiling)
- 語法:
<itcast對象>.next();
返回值類型,itcast
對象 - 實現思路
- 定義
ret
數組,存儲所有dom
的下一個兄弟元素 - 遍歷
this
上的所有dom
元素 - 遍歷當前
dom
元素下面的所有兄弟,如果類型爲 元素,將此元素存儲ret
內,結束循環。 - 兩層循環結束,將
ret
轉換成itcast
對象,作爲next
方法的返回值。
- 定義
next: function() { // 存儲所用dom的下一個兄弟元素 var ret = []; // 遍歷this上的所有dom元素 this.each(function() { // 在遍歷當前dom元素下面所有的兄弟元素 for(var node = this.nextSibling; node ; node = node.nextSibling){ // 如果當前兄弟節點,爲元素節點 // 即爲結果,將其添加ret內,並結束循環 if(node.nodeType === 1){ ret.push(node); break; } } }); // 將ret轉換成itcast對象,返回 return itcast(ret); },
nextAll
- 功能:獲取
itcast
對象上所有dom
元素下面的所有兄弟元素(nextSiling)
- 語法:
<itcast對象>.nextAll();
返回值類型,itcast
對象 - 實現思路
- 定義
ret
數組,存儲所有dom
的下一個兄弟元素 - 遍歷
this
上的所有dom
元素 - 遍歷當前
dom
元素下面的所有兄弟,如果類型爲 元素,將此元素存儲ret
內,結束循環。 - 兩層循環結束,將
ret
轉換成itcast
對象,作爲nextAll
方法的返回值。
- 定義
nextAll: function() { var ret = [], node; this.each(function() { for(node = this.nextSibling; node ; node = node.nextSibling){ if(node.nodeType === 1) ret.push(node); } }); return itcast(itcast.unique(ret)); }
before 方法
- 功能:
- 語法:
<itcast對象>.before(source)
- 實現思路
- 統一
source
類型爲itcast
對象 - 遍歷
this
上的每一個dom
元素 - 再遍歷
source
上的每一個dom
元素 - 判斷當前遍歷
this
的dom
元素的索引是否爲0 - 如果是
0
,不需要拷貝節點 - 否則要深拷貝節點
- 先拿到當前遍歷
this
的dom
元素的父節點,調用insertBefore
方法在其前面添加上面的到的新節點 - 兩層循環完畢,操作完成
return this
實現鏈式編程
- 統一
before: function(source) { var node; source = itcast(source); this.each(function(dom, i) { source.each(function(elem) { node = i === 0 ? elem : elem.cloneNode(true); // 獲取dom的父節點,調用insertBefore方法在dom前添加新的子節點node dom.parentNode.insertBefore(node, dom); }); }); return this; },
after 方法
- 功能:
- 語法:
<itcast對象>.after(source)
- 實現思路
- 定義
nextSiling
變量,存儲dom
元素的下一個兄弟節點 - 統一
source
類型爲itcast
對象 - 遍歷
this
上的每一個dom
元素 - 再遍歷
source
上的每一個dom
元素 - 判斷當前遍歷
this
的dom
元素的索引是否爲0
- 如果是
0
,不需要拷貝節點 - 否則要深拷貝節點
- 先拿到當前遍歷
this
的dom
元素的父節點,調用insertBefore
方法在其前面添加上面的到的新節點 - 兩層循環完畢,操作完成
return this
實現鏈式編程
- 定義
after: function(source) { var node, nextSibling; source = itcast(source); this.each(function(dom, i) { nextSibling = dom.nextSibling; source.each(function(elem) { node = i === 0 ? elem : elem.cloneNode(true); // 獲取dom的父節點,調用insertBefore方法在dom前添加新的子節點node dom.parentNode.insertBefore(node, nextSibling); }); }); return this; }
unique 方法
- 功能:實現數組元素去重
- 語法:
var newRet = itcast.unique(arr);
- 實現思路
- 定義空數組對象
ret
.存儲去重後的元素 - 遍歷原數組,如果當前遍歷到的元素在
ret
中不存在,就添加ret
內 - 循環結束,
ret
存儲的就是去重後的元素 - 返回
ret
- 定義空數組對象
- 兼容IE8 indexof 方法
- 首先判斷當前瀏覽器是否支持
indexof
方法 - 如果不支持就給數組對象的原型添加
indexof
方法 - 遍歷
this
上的所有元素 - 如果遍歷到的當前元素和指定參數值相同就直接返回其索引值.結束循環
- 如果在整個上述循環都沒有返回值,那麼表示不存在指定參數值就返回
-1
.
- 首先判斷當前瀏覽器是否支持
unique: function(arr) { // 存儲去重後的結果 var ret = []; // 遍歷原數組arr itcast.each(arr, function() { // 判斷ret是否存在當前遍歷到的元素 // 如果不存在將其添加到ret中 if(ret.indexOf(this) === -1) ret.push(this); }); // 將ret返回 return ret; }
兼容 IE8
indexof
方法
// 兼容數組對象的indexOf方法 (function() { // 如果瀏覽器不支持indexOf方法 // 那麼就給數組對象的原型添加indexOf方法 if(!Array.prototype.indexOf){ Array.prototype.indexOf = function(val) { // 遍歷this for(var i = 0,l = this.length; i < l; i++){ // 如果遍歷到的當前元素和val相同,返回其索引值 if(this[i] == val) return i; } // 那麼表示不存在指定參數值就返回 -1 return -1; }; } }());
prev 方法
- 功能: 獲取
itcast
對象上所有dom
元素的前一個兄弟元素(previousSibling)
- 語法:
<itcast對象>.prev();
返回值類型:itcast對象
- 實現思路
- 定義
ret
數組,存儲所有dom
的前一個兄弟元素 - 遍歷
this
上的所有dom
元素 - 遍歷當前
dom
元素之前的所有兄弟,如果類型爲元素,將此元素存儲ret
內,結束循環 - 兩層循環結束,將
ret
轉換成itcast
對象,作爲next
方法的返回值
- 定義
prev:function(){ //存儲所有dom的前一個兄弟元素 var ret=[]; //遍歷this上的所有dom元素 this.each(function(){ //在遍歷當前dom元素之前所有的兄弟元素 for(var node=this.previousSibling;node;node=node.previousSibling){ //如果當前兄弟節點爲元素節點 //即爲結果,將其添加到ret內,並結束循環 if(node.nodeType===1){ ret.push(node); break; } } }); //將ret轉換成itcast對象,返回 return itcast(ret); },
prevAll 方法
- 功能: 獲取
itcast
對象上所有dom
元素的之前的所有兄弟元素(nextSibling)
- 語法:
<itcast對象>.nextAll();
返回值類型:itcast對象
- 實現思路
- 定義
ret數組
,存儲所有dom
之前的所有兄弟元素 - 遍歷
this
上的所有dom元素
- 遍歷當前
dom
元素之前的所有兄弟,如果類型爲元素,將此元素存儲ret
內,結束循環 - 兩層循環結束,將
ret
轉換成itcast對象
,作爲nextAll
方法的返回值
- 定義
prevAll:function(){ var ret=[]; this.each(function() { for(var node=this.previousSibling;node;node=node.previousSibling){ if(node.nodeType===1) ret.push(node); } }); return itcast(itcast.unique(ret)); }