封裝一個(gè)自己的js庫

仿照jQuery封裝一個(gè)自己的js庫

接下來,我講封裝一個(gè)仿jQuery的庫夕晓,主要包含jQuery中綁定宛乃,css,等方法蒸辆,我講它定義為 "HQuery"

$符號(hào)的封裝

jQuery中的 $ 符號(hào)意味著什么征炼?
先思考一下jQuery庫中alert(typeof $)的結(jié)果,它是一個(gè)對(duì)象吁朦,也是一個(gè)函數(shù)
所以美元符$字面上是jQuery柒室,其實(shí)就是一個(gè)jq對(duì)象,里面可以接受函數(shù)逗宜,字符串雄右,還要一種是對(duì)象(比如this)
給自己的Hquery填加$符號(hào):

function $(arg) {
    return new Hquery(arg)
}

Hquery是基于面向?qū)ο髮?shí)現(xiàn)的,所以我們需要先寫構(gòu)造函數(shù)纺讲,為了方便遍歷和其他方法的操作擂仍,所有內(nèi)容返回到一個(gè)數(shù)組中,這個(gè)數(shù)組衣服于Hquery對(duì)象存在熬甚,之后將為這個(gè)Hquery對(duì)象屬性添加方法

function Hquery(arg){ //參數(shù)是變體變量
 this.elements = [] // 選擇器選擇的元素放到這個(gè)數(shù)組中
}
選擇器的封裝:

我們使用Hquery操作DOM等實(shí)現(xiàn)一系列的功能逢渔,選擇器是必不可少的,所有我們首先封裝好選擇器乡括,這樣就可以能省去document.getElementsByClass等等麻煩的操作

// 通過class選擇元素 因?yàn)閏lass可以有多個(gè)肃廓,所以我們需要push一下
function getByClass(oParent, sClass) {
    var aClass = [];
    var elems = oParent.getElementsByTagName('*')
    for (var i=0; i<elems.length; i++){
        if (elems[i].className == sClass){
            aClass.push(elems[i])
        }
    }
    return aClass
}

// 構(gòu)造函數(shù)
function Hquery(arg) {
    this.elements = [];

    switch (typeof arg){
        case 'function': // 如果傳進(jìn)來的是function智厌,那么window.onload
          /*  window.onload = arg; // 通過on的方式綁定事件會(huì)產(chǎn)生覆蓋,*/
            bindEvent(window, 'load', arg)
            break;

        case 'string':
            switch (arg.charAt(0)){
                case '#': //id 選擇器
                    this.elements.push(document.getElementById(arg.substring(1)))
                    break;

                case '.':
                    this.elements=getByClass(document, arg.substring(1))
                    break;

                default:
                    this.elements = toArray(document.getElementsByTagName(arg))
                    break;
            }
            break;
        case 'object':
            this.elements.push(arg)
            break;
    }
}
封裝事件:
function bindEvent(obj, event, fn) {
    if (obj.addEventListener){ //在標(biāo)準(zhǔn)瀏覽器下
        obj.addEventListener(event, fn, false)
    } else { // IE瀏覽器下
        obj.attachEvents('on' + event, fn)
    }
}

// click方法
Hquery.prototype.click=function (fn) {
    // for (var i=0;i<this.elements.length;i++){
    //     bindEvent(this.elements[i], 'click', fn)
    // }

    this.on('click', fn) // 上面兩行是本來寫法盲赊, 我這里改成了事件委托铣鹏,更高效
}

// mouseover方法
Hquery.prototype.mouseover=function (fn) {
    // for (var i=0;i<this.elements.length;i++){
    //     bindEvent(this.elements[i], 'mouseover', fn)
    // }

    this.on('mouseover', fn)// 上面兩行是本來寫法, 我這里改成了事件委托哀蘑,更高效
}

// on方法
Hquery.prototype.on=function (event, fn) {
    for (var i=0;i<this.elements.length;i++){
        bindEvent(this.elements[i], event, fn)
    }
}
hide和show也是比較常用的方法:
// hide
Hquery.prototype.hide = function () {
    for (var i=0;i<this.elements.length;i++){
        this.elements[i].style.display = 'none'
    }
}

// show
Hquery.prototype.show = function () {
    for (var i=0;i<this.elements.length;i++){
        this.elements[i].style.display = 'block'
    }
}
eq方法
// eq
Hquery.prototype.eq = function (index) {
    //返回出來的是元素對(duì)象诚卸,原生下面沒有css(),肯定沒有,所以此時(shí)需要換為$下的對(duì)象
    return $(this.elements[index])
}

其他的方法绘迁,我就不一一介紹了合溺,下面直接給大家上一個(gè)多種方法封裝好的,大家k'y

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缀台,一起剝皮案震驚了整個(gè)濱河市棠赛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌将硝,老刑警劉巖恭朗,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異依疼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)而芥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門律罢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棍丐,你說我怎么就攤上這事误辑。” “怎么了歌逢?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵巾钉,是天一觀的道長。 經(jīng)常有香客問我秘案,道長砰苍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任阱高,我火速辦了婚禮赚导,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赤惊。我一直安慰自己吼旧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布未舟。 她就那樣靜靜地躺著圈暗,像睡著了一般掂为。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上员串,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天勇哗,我揣著相機(jī)與錄音,去河邊找鬼昵济。 笑死智绸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的访忿。 我是一名探鬼主播瞧栗,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼海铆!你這毒婦竟也來了迹恐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤卧斟,失蹤者是張志新(化名)和其女友劉穎殴边,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珍语,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锤岸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了板乙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片是偷。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖募逞,靈堂內(nèi)的尸體忽然破棺而出蛋铆,到底是詐尸還是另有隱情,我是刑警寧澤放接,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布刺啦,位于F島的核電站,受9級(jí)特大地震影響纠脾,放射性物質(zhì)發(fā)生泄漏玛瘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一乳乌、第九天 我趴在偏房一處隱蔽的房頂上張望捧韵。 院中可真熱鬧,春花似錦汉操、人聲如沸再来。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芒篷。三九已至搜变,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間针炉,已是汗流浹背挠他。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篡帕,地道東北人殖侵。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像镰烧,于是被迫代替她去往敵國和親拢军。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容