西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁編程開發(fā)javascript|JQuery → jquery 美元背后的一點(diǎn)小技巧

jquery 美元背后的一點(diǎn)小技巧

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2013/3/10 8:55:07字體大。A-A+

作者:西西點(diǎn)擊:0次評論:0次標(biāo)簽: jquery

  • 類型:編程輔助大。109KB語言:中文 評分:5.0
  • 標(biāo)簽:
立即下載

在Jquery中,$是JQuery的別名,所有使用$的地方也都可以使用JQuery來替換,如$('#msg')等同于JQuery('#msg') 的寫法。

1、如何給一個id為casper的標(biāo)簽添加一個名為“world”的class

考慮下面一個場景,假設(shè)我們頁面上有個id為casper的div標(biāo)簽,如下所示

<div id="casper" class="hello">casper是個大傻瓜,啦啦啦啦啦</div>

現(xiàn)在我們想要給它添加一個class,比如“world”,用jquery的話如何實現(xiàn)?很簡單,不賣關(guān)子

$('#casper').addClass('world');

很好,接下來我們思考:如何不用jquery,我們?nèi)绾稳绾螌崿F(xiàn)實現(xiàn)上述功能?最簡單的方式:

var node = document.getElementById('casper');
node.className += ' world'; 

getElementById、getElementsByTagName神馬的,名字老長老長的,寫著有點(diǎn)不爽,于是把getElementById這個方法用美元($)包裝下:

function $(id){
  return document.getElementById(id);
}
$('casper').className += ' world';

className品字符串神馬的,jquery的調(diào)用方式相比麻煩多了,那再改進(jìn)下:

function $(id){

    var node = document.getElementById(id);
    node.addClass = function(addName){
        node.className += ' ' + addName;
    };
    return document.getElementById(id);
}
$('casper').addClass('world');

看上去挺像那么一回事了,多優(yōu)雅的接口。釡I盈眶中)~

真的是這樣嗎,再仔細(xì)瞧瞧?于是果斷發(fā)現(xiàn)不對勁的地方:對于$,每次調(diào)用,都會給返回的dom元素上添加一個addClass方法,這對空間來說是極大的浪費(fèi)。當(dāng)然,可以將addClass方法抽取出來:

function addClass(className){

    //實現(xiàn)略
}
function $(id){
    var node = document.getElementById(id);
    node.addClass = addClass;
    return document.getElementById(id);
}
$('casper').addClass('world');

原先的空間浪費(fèi)問題可以在很大程度上得到解決,但明顯這解決方法還不夠好。如果有那么一種實現(xiàn)方式,讓所有的對象實例都共享一個方法。。。

2、jQuery中的實現(xiàn)思路

同樣不必賣關(guān)子,這里說的就是原型方法,我們再看下jquery的調(diào)用方式

$('#casper').addClass('world');

$('#casper')并不是像我們上面那樣,簡單地將id為casper的元素返回。實際上,$('#casper')返回的是一個jQuery對象,該對象特征如下:

擁有一個length屬性,length等于你調(diào)用$選中的元素的數(shù)目,在$('#casper')中為1

擁有0~n-1的實例屬性,分別對應(yīng)調(diào)用$時選中的第1~第n個元素,如本例中$('#casper')[0]即為目標(biāo)dom元素

擁有一堆原型方法,如常見的addClass、removeClass、bind等

根據(jù)上面三點(diǎn),很容易對我們之前寫的代碼進(jìn)行修改,如下:

function $(id){

    this[0] = document.getElementById(id);
    this.length = 1;
}
$.prototype.addClass = function(className){
    this[0].className += ' ' + className;
};

var noode = new $('casper');
node.addClass('world');

其實就幾行代碼的事情,但。。。還是覺得有些不對勁,new $('casper'),平常在用jquery的時候似乎不需要new一下的說,想想看,我們代碼中一坨new是多么可怕的事情~

好吧,其實是因為jQuery幫你完成了構(gòu)造函數(shù)調(diào)用的這部分工作,這一小小的細(xì)節(jié)改善對jQuery的流行起到了很大的幫助。按照這個思路,繼續(xù)修改之前的代碼:

function $(id){

    if(!(this instanceof $) return new $(id);    //加了這么個語句
    this[0] = document.getElementById(id);
    this.length = 1;
}

//其他一樣,節(jié)省空間不貼代碼

在上面的代碼中,只有一點(diǎn)小小的修改,就是加了個判斷語句 if(!(this instanceof $)) ,作用在于判斷,當(dāng)$被調(diào)用時,究竟是采用以下兩種調(diào)用方式的哪一種,關(guān)于這種判斷方式,可參考之前寫的《【經(jīng)驗總結(jié)】構(gòu)造函數(shù)的強(qiáng)制調(diào)用》:

$('casper'),直接調(diào)用,于是this為window

new $('casper'),此時$為構(gòu)造方法,this instanceof $ == true

3、jQuery中的源碼實現(xiàn)以及問題所在(俺的疑惑)

羅嗦了這么多,我們看看關(guān)于這點(diǎn),jQuery里是如何實現(xiàn)的,源碼大致如下,一些不相干的代碼略過:

(function( window, undefined ) {

//去掉無關(guān)變量聲明等,防止干擾分析
var jQuery = (function() {

    // Define a local copy of jQuery
    var jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context, rootjQuery );
    },

    //一堆無關(guān)細(xì)節(jié)暫時略過

    jQuery.fn = jQuery.prototype = {
        constructor: jQuery,
        init: function( selector, context, rootjQuery ) {
            //繼續(xù)略過
        }
    };
    // Give the init function the jQuery prototype for later instantiation
    jQuery.fn.init.prototype = jQuery.fn;

    return jQuery;

})();

window.jQuery = window.$ = jQuery;

})( window );

對于研究過jQuery源碼或曾經(jīng)打算研究jQuery源碼的同學(xué)來說,上面這段代碼肯定不會陌生,它有一個特點(diǎn):看上去比較晦澀,特別是是結(jié)合了jQuery源碼里面比較詭異的代碼縮進(jìn)~

通過閉包返回的jQuery對象,閉包里面是有jQuery函數(shù)定義,jQuery函數(shù)里面return了new jQuery.fn.init 。。?焖倏炊厦孢@段代碼的秘訣在于:一個支持代碼高亮和職能中括號匹配的編輯器,比如webstorm。。。

上面只是開個小玩笑,繞了這么久,無法是想做下面幾件事情:

無論有沒有new,只要調(diào)用$,都給你返回一個jQuery對象(實際上jQuery.fn.init才是實際的構(gòu)造函數(shù))

將jQuery.fn.init.fn指向jQuery.prototype,這樣的話,當(dāng)我們通過$.fn.newPrototypeAttr 方式向jQuery添加原型屬性或方法,其實最終都成為了jQuery.fn.init地原型屬性或方法

將constructor屬性指向jQuery,不然$('#casper').constructor 獲得的會是jQuery.fn.init

個人覺得上面這段代碼有些費(fèi)解,似乎完全可以采用相對不那么曲折的方式實現(xiàn),如下所示,其實思路都是相同的:

然后,就是添加各種原型方法了,兼容性處理和優(yōu)雅的API,這塊才是精華,這里還沒講到。

(function(){

    var jQuery = function(id){
        return new _jquery(id);
    };

    var _jquery = function(id){
        //此處各種選擇分支神馬的都忽略~
        this[0] = document.getElementById(id);
        this.length = 1;
    };

    jQuery.fn = jQuery.prototype = {
        constructor: jQuery,
        addClass: function(className){
            this[0].className += ' ' + className;
        }
    };

    _jquery.prototype = jQuery.fn;

    window.$ = window.jQuery = jQuery;

})();

    html編輯器
    (73)html編輯器
    我們做網(wǎng)頁的時候最難找的就是編輯器,網(wǎng)上找一個吧,要不是圖片上傳錯誤,就是到處都是錯誤,垃圾太多.大家都需要一個簡單,速度快的.西西為您提供最好用的編輯器一站式下載編輯器定義編輯器指的是一類編輯制作工具,可自定義窗囗,編輯主題索引,可選擇添搜索頁,無任何不自由。編輯器哪個好用小編個人比較喜歡使用和,這兩款編輯器軟件都有不錯的表現(xiàn)。至于編輯器哪個好用,這就要根據(jù)你的個人需求去選擇對應(yīng)的編輯器啦...更多>>
    • UltraEdit-32中文版21.20.1001 中文

      06-29 / 19.5M

      推薦理由:ultraEdit 32 破解版 簡體中文 內(nèi)有安裝說明,完全免費(fèi),無試用期的。該軟件功能強(qiáng)大,能打開各種格式的文件
    • pyscripter x642.5.3 官方最新版

      11-10 / 4.7M

      推薦理由:python編輯器,代碼補(bǔ)全、參數(shù)提示補(bǔ)全工具,這個工具其實非常重要,可以大大提高開發(fā)效率,減少出錯。很滿
    • 快手AAuto StudioV10.71 綠色中文

      04-21 / 7.8M

      推薦理由:快手aauto是由一鶴軟件耗時四年開發(fā)新一代編程語言。完美支持靜態(tài)類型、動態(tài)類型,完美支持com、dllapi、re
    • ultraedit64位破解版v22.20.0.49 綠

      03-31 / 37.9M

      推薦理由:UltraEdit是最強(qiáng)大的一款超值文本編輯器!ultraedit64位破解版,適用于Windows64位系統(tǒng)使用,此版為綠色破解
    • Dreamweaver cs6中文版官方原版

      11-19 / 279.7M

      推薦理由:Adobe Dreamweaver CS6 是 Adobe Creative Suite 6 系列中的 HTML 編輯器和網(wǎng)頁設(shè)計軟件,是最優(yōu)秀的可視化
    • Adobe Dreamweaver CS5官方簡體中文

      05-15 / 436.8M

      推薦理由:Adobe Dreamweaver CS5 軟件使設(shè)計人員和開發(fā)人員能充滿自信地構(gòu)建基于標(biāo)準(zhǔn)的網(wǎng)站。由于同新的 Adobe CS Li
    dreamweaver cs6
    (14)dreamweaver cs6
    新版本使用了自適應(yīng)網(wǎng)格版面創(chuàng)建頁面,在發(fā)布前使用多屏幕預(yù)覽審閱設(shè)計,可大大提高工作效率。改善的性能,更高效地傳輸大型文件。實時視圖和多屏幕預(yù)覽面板可呈現(xiàn)代碼,更能夠檢查自己的工作。曾經(jīng)風(fēng)靡一時的網(wǎng)頁三劍客成員之一是目前應(yīng)用最廣的網(wǎng)頁制作軟件,原本是由公司所開發(fā)的著名網(wǎng)站開發(fā)工具,隨被收購后,改名為。它是第一套針對專業(yè)網(wǎng)頁設(shè)計師特別發(fā)展的視覺化網(wǎng)頁開發(fā)工具,以及在之后推出的針對專業(yè)網(wǎng)頁圖像設(shè)計的,三者...更多>>
    • Dreamweaver cs6中文版官方原版

      11-19 / 279.7M

      推薦理由:Adobe Dreamweaver CS6 是 Adobe Creative Suite 6 系列中的 HTML 編輯器和網(wǎng)頁設(shè)計軟件,是最優(yōu)秀的可視化
    • Dreamweaver cc amtlib.dll補(bǔ)丁

      07-05 / 834KB

      推薦理由:Adobe Dreamweaver CC 13.0 build 6390多語言正式版的破解補(bǔ)丁,破解后程序不再提示剩余天數(shù)與激活注冊。關(guān)
    • Dreamweaver CS5 HTML 5 擴(kuò)展包

      06-22 / 5.7M

      推薦理由:安裝了該擴(kuò)展后再也不用擔(dān)心不記得難記的css3樣式代碼了! 剛裝 Dreamweaver CS5 的時候,發(fā)現(xiàn)新建文檔的時
    • Dreamweaver插件包西西整理

      01-08 / 2.7M

      推薦理由:西西小編整理的一些比較常用的Dreamweaver插件,希望能對大家有所幫助!persistent_layers 不管滾動條如何拉
    • Adobe Dreamweaver CS4中文精簡版

      04-11 / 84.5M

      推薦理由:使用業(yè)界領(lǐng)先的Web 創(chuàng)作工具之一構(gòu)建世界級的網(wǎng)站和應(yīng)用程序。Adobe® Dreamweaver® CS4 軟件是 W
    • Dreamweaver jQuery智能提示插件1.

      07-31 / 109KB

      推薦理由:1.2.0版本插件在1.0.0插件基礎(chǔ)上進(jìn)一步修改,版權(quán)信息僅保留致謝信息,刪除作者為了代碼整體提示美觀度,故

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)
    推薦文章

    沒有數(shù)據(jù)