javascript 面向?qū)ο?標(biāo)簽的獲取-嵌套式編程)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"></head>
<body>
    <div>1</div>
    <div>2</div>
    <p>3</p>
    <p>4</p>
</body>
</html>

上面是一個(gè)簡(jiǎn)單的html頁(yè)面碘耳,現(xiàn)在我們要用原生的javascript來操作

  • 1.獲取所有div显设,并改變所有div的背景
  • 2.獲取所有p標(biāo)簽,并改變p標(biāo)簽的背景

var divs = document.getElementsByTagName('div');
var ps = document.getElementsByTagName('p');
for (var i = 0; i < divs.length ; i++) {
    divs[i].style.backgroundColor = 'red';
}
for (var l = 0; l < ps.length ; l++) {
    ps[l].style.backgroundColor = 'blue';
}

這樣寫可以達(dá)到滿足要求辛辨,但是代碼冗余捕捂,所以我們要進(jìn)行方法的封裝。(首先封裝獲取dom的方法)

var _gT = function(tag){
    return document.getElementsByTagName(tag);
};
var divs = _gT('div');
var ps = _gT('p');

for (var i = 0; i < divs.length ; i++) {
    divs[i].style.backgroundColor = 'red';
}
for (var l = 0; l < ps.length ; l++) {
    ps[l].style.backgroundColor = 'blue';
}

首先我們分析斗搞,寫了2個(gè)for循環(huán)指攒,是否可以把for循環(huán)也封裝起來。

var _gT = function(tag){
    return document.getElementsByTagName(tag);
};
var divs = _gT('div');
var ps = _gT('p');
var _each = function(arr, color){
    for (var i = 0; i < arr.length; i++) {
        arr[i].style.backgroundColor = color;
    }
};
_each(divs, 'red');
_each(ps, 'blue');

封裝完成僻焚,但是還有問題允悦,那如果我不想改變背景顏色了,我要改成背景圖片虑啤,這個(gè)時(shí)候怎么寫呢隙弛?(繼續(xù)在 _each 的方法里加架馋?當(dāng)然不行!)

var _gT = function(tag){
    return document.getElementsByTagName(tag);
};
var _each = function(arr, fn){
    for (var i = 0; i < arr.length; i++) {
        fn(i, arr[i]);
    }
};
var divs = _gT('div');
var ps = _gT('p');
_each(divs, function(i, v){
    v.style.backgroundColor = 'red';
});
_each(ps, function(i, v){
    v.style.backgroundColor = 'blue';
});

這樣就結(jié)束了嗎驶鹉,當(dāng)然沒有绩蜻,上面的代碼中,獲取dom的方法和循環(huán)的each方法我們都調(diào)用了2次室埋,還可以繼續(xù)優(yōu)化?(很明顯是可以的伊约。)隱式迭代

var _gT = function(tag, results){
    results = results || [];
    //將獲取的每一個(gè)元素保存到新數(shù)組中姚淆,若不使用 apply 則一個(gè) tag 下面的所有標(biāo)簽只會(huì)保存最后一個(gè)到新的結(jié)果數(shù)組中
    results.push.apply(results, document.getElementsByTagName(tag));

    return results;
};
var _each = function(arr, fn){
    for (var i = 0; i < arr.length; i++) {
        //返回當(dāng)前對(duì)象,定義跳出 for 循環(huán)的規(guī)則(在數(shù)組[1,2,3,4,3]中查找3若不使用break,則會(huì)一直查找到最后一個(gè)元素才會(huì)結(jié)束屡律,使用break后腌逢,發(fā)現(xiàn)滿足條件立刻終止循環(huán))
        if(fn.call(arr[i], i, arr[i]) === false){
            break;
        };
        //若按照下面的這種寫法,在each的方法里中打印 this 會(huì)得到 window 對(duì)象超埋。
        /*
        if(fn(i, arr[i]) === false){
            break;
        };*/
    }
};
_each(_gT('div', _gT('p')), function(){
    console.log(this);
    this.style.backgroundColor = 'red';
});

總結(jié):之前學(xué)js一直都是用的jquery庫(kù)搏讶,從來都沒有仔細(xì)考慮過著里面到底是怎么實(shí)現(xiàn)的,現(xiàn)在回過頭來學(xué)習(xí)霍殴,發(fā)現(xiàn)這里面的代碼也是可以千變?nèi)f化的媒惕,受益頗多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末来庭,一起剝皮案震驚了整個(gè)濱河市妒蔚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌月弛,老刑警劉巖肴盏,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異帽衙,居然都是意外死亡菜皂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門厉萝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恍飘,“玉大人,你說我怎么就攤上這事冀泻〕B拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵弹渔,是天一觀的道長(zhǎng)胳施。 經(jīng)常有香客問我,道長(zhǎng)肢专,這世上最難降的妖魔是什么舞肆? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任焦辅,我火速辦了婚禮,結(jié)果婚禮上椿胯,老公的妹妹穿的比我還像新娘筷登。我一直安慰自己,他們只是感情好哩盲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布前方。 她就那樣靜靜地躺著,像睡著了一般廉油。 火紅的嫁衣襯著肌膚如雪惠险。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天抒线,我揣著相機(jī)與錄音班巩,去河邊找鬼。 笑死嘶炭,一個(gè)胖子當(dāng)著我的面吹牛抱慌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眨猎,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼抑进,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了宵呛?” 一聲冷哼從身側(cè)響起单匣,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宝穗,沒想到半個(gè)月后户秤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逮矛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年鸡号,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须鼎。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲸伴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晋控,到底是詐尸還是另有隱情汞窗,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布赡译,位于F島的核電站仲吏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裹唆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一誓斥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧许帐,春花似錦劳坑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羡鸥,卻和暖如春蔑穴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惧浴。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奕剃,地道東北人衷旅。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纵朋,于是被迫代替她去往敵國(guó)和親柿顶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象操软,但只有一個(gè)實(shí)例嘁锯,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見的單例模式聂薪,...
    Obeing閱讀 2,073評(píng)論 1 10
  • oncontextmenu="window.event.returnValue=false" 將徹底屏蔽鼠標(biāo)右鍵 ...
    逍遙至尊灬寳閱讀 1,239評(píng)論 0 43
  • 《ijs》速成開發(fā)手冊(cè)3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,171評(píng)論 0 7
  • 如何控制alert中的換行家乘?\n alert(“p\np”); 請(qǐng)編寫一個(gè)JavaScript函數(shù) parseQu...
    heyunqiang99閱讀 1,086評(píng)論 0 6
  • U 分享的這首歌是我聽韓庚唱的第一首歌。 在一個(gè)綜藝節(jié)目中藏澳,韓庚帶領(lǐng)的組合super j...
    f961ff2e749a閱讀 287評(píng)論 2 0