回覆列表
  • 1 # 使用者834195712159

    如果對於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方法可以有效的擴充包裝器的方法。

  • 中秋節和大豐收的關聯?
  • 無線網路設定需要設定WAN口不知道怎樣接使用者名稱和密碼是房東接的也不知道?