如果對於jquery的$()包裝器函式還不是很清楚,請先參閱我的上一篇日誌:淺析jQuery的鏈式呼叫
話說回來,雖然jQuery讓學習前端技術的越來越多了起來,(本人就是因為學校圖書館偶然間遇到了一本jQuery基礎教程(二)開始想深入的學習前端技術),關於jQuery的博文甚至多於javascript,它讓程式設計的門檻大大的降低了,但是它隱藏了太多細節了,形如$("#id").append("<p>xxx</p >").clone().appendTo(x).end().css(...)................這樣操作的模式已經很難找到常規javascript的影子。瀏覽器的差異彷彿一去就不見了蹤影,我不認為大部分都能在這安逸的環境再重新回到考慮javascript如何在不同瀏覽器能表現一致等問題,是福是禍真的很難說。
由於$()函式返回的是一個包裹了原生dom物件陣列的物件,並且在此物件原型上擴充套件的函式都是為了操作原生的dom物件,所以少不了迴圈遍歷的操作,熟悉jquery庫的人都知道有個jQuery.each()函式 ,大部分的涉及jquery物件的函式都會用到這個函式: 簡單的實現應該是形如這樣:
(再次重申,只是簡單的實現原理,不要考慮具體的功能性問題)
在這個函式的基礎之上可以開始擴充_jQuery的prototype了;首先就是先寫一個包裝器物件可以直接呼叫的方法each:(這個並不是重複),然後透過呼叫這個each函式可以完成對物件陣列的遍歷,
//寫在閉包內 注意將昨天命名衝突了的jQuery建構函式名稱改為_jQuery
_jQuery.prototype = {
each: function(func){
jQuery.each(this, func);
return this;
},
attr: function(key, value){
//示例定義這個set與get於一身的操作屬性的函式
if (arguments.length == 0) {
return null;
}
else
if (arguments.length == 1) {
return this.elements[0].getAttribute(key);
else if(arguments.length == 2){
this.each(function(i, item){
//這裡可以看到重新定義each方法的好處一:精簡程式碼 ,二:在內部函式中this仍然是指向呼叫的包裝器物件而不是window
item.setAttribute(key, value);
})
/*
* 這裡可以開始引入其他方法
*/
接下來做幾個簡單的測試:(還是上一篇的測試html)
輸入:
var k= $("#header");
consoles.write(k.attr("title","test title!").attr("title")); //鏈式呼叫
輸出:
test title!
依此類推,依靠each方法可以有效的擴充包裝器的方法。
如果對於jquery的$()包裝器函式還不是很清楚,請先參閱我的上一篇日誌:淺析jQuery的鏈式呼叫
話說回來,雖然jQuery讓學習前端技術的越來越多了起來,(本人就是因為學校圖書館偶然間遇到了一本jQuery基礎教程(二)開始想深入的學習前端技術),關於jQuery的博文甚至多於javascript,它讓程式設計的門檻大大的降低了,但是它隱藏了太多細節了,形如$("#id").append("<p>xxx</p >").clone().appendTo(x).end().css(...)................這樣操作的模式已經很難找到常規javascript的影子。瀏覽器的差異彷彿一去就不見了蹤影,我不認為大部分都能在這安逸的環境再重新回到考慮javascript如何在不同瀏覽器能表現一致等問題,是福是禍真的很難說。
由於$()函式返回的是一個包裹了原生dom物件陣列的物件,並且在此物件原型上擴充套件的函式都是為了操作原生的dom物件,所以少不了迴圈遍歷的操作,熟悉jquery庫的人都知道有個jQuery.each()函式 ,大部分的涉及jquery物件的函式都會用到這個函式: 簡單的實現應該是形如這樣:
(再次重申,只是簡單的實現原理,不要考慮具體的功能性問題)
在這個函式的基礎之上可以開始擴充_jQuery的prototype了;首先就是先寫一個包裝器物件可以直接呼叫的方法each:(這個並不是重複),然後透過呼叫這個each函式可以完成對物件陣列的遍歷,
//寫在閉包內 注意將昨天命名衝突了的jQuery建構函式名稱改為_jQuery
_jQuery.prototype = {
each: function(func){
jQuery.each(this, func);
return this;
},
attr: function(key, value){
//示例定義這個set與get於一身的操作屬性的函式
if (arguments.length == 0) {
return null;
}
else
if (arguments.length == 1) {
return this.elements[0].getAttribute(key);
}
else if(arguments.length == 2){
this.each(function(i, item){
//這裡可以看到重新定義each方法的好處一:精簡程式碼 ,二:在內部函式中this仍然是指向呼叫的包裝器物件而不是window
item.setAttribute(key, value);
})
}
}
/*
* 這裡可以開始引入其他方法
*/
}
接下來做幾個簡單的測試:(還是上一篇的測試html)
輸入:
var k= $("#header");
consoles.write(k.attr("title","test title!").attr("title")); //鏈式呼叫
輸出:
test title!
依此類推,依靠each方法可以有效的擴充包裝器的方法。