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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)不對(duì)勁的地方:對(duì)于$,每次調(diào)用,都會(huì)給返回的dom元素上添加一個(gè)addClass方法,這對(duì)空間來(lái)說(shuō)是極大的浪費(fèi)。當(dāng)然,可以將addClass方法抽取出來(lái):

function addClass(className){

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

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

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

同樣不必賣關(guān)子,這里說(shuō)的就是原型方法,我們?cè)倏聪耲query的調(diào)用方式

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

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

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

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

擁有一堆原型方法,如常見(jiàn)的addClass、removeClass、bind等

根據(jù)上面三點(diǎn),很容易對(duì)我們之前寫的代碼進(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');

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

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

function $(id){

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

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

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

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

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

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

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

(function( window, undefined ) {

//去掉無(wú)關(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 );
    },

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

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

    return jQuery;

})();

window.jQuery = window.$ = jQuery;

})( window );

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

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

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

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

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

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

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

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

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

      06-29 / 19.5M

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

      11-10 / 4.7M

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

      04-21 / 7.8M

      推薦理由:快手aauto是由一鶴軟件耗時(shí)四年開發(fā)新一代編程語(yǔ)言。完美支持靜態(tài)類型、動(dòng)態(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)頁(yè)設(shè)計(jì)軟件,是最優(yōu)秀的可視化
    • Adobe Dreamweaver CS5官方簡(jiǎn)體中文

      05-15 / 436.8M

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

      11-19 / 279.7M

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

      07-05 / 834KB

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

      06-22 / 5.7M

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

      01-08 / 2.7M

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

      04-11 / 84.5M

      推薦理由:使用業(yè)界領(lǐng)先的Web 創(chuàng)作工具之一構(gòu)建世界級(jí)的網(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)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

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

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

    沒(méi)有數(shù)據(jù)