最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript getElementsByClassName實(shí)現(xiàn)代碼

 更新時(shí)間:2010年10月11日 22:49:01   作者:  
根據(jù)元素clsssName得到元素集合的函數(shù),需要的朋友可以參考下。
先來(lái)看一下代碼:(支持多個(gè)class查詢和在某個(gè)范圍內(nèi)進(jìn)行查詢)
復(fù)制代碼 代碼如下:

/*
* 根據(jù)元素clsssName得到元素集合
* @param fatherId 父元素的ID,默認(rèn)為document
* @tagName 子元素的標(biāo)簽名
* @className 用空格分開的className字符串
*/
function getElementsByClassName(fatherId,tagName,className){
node = fatherId&&document.getElementById(fatherId) || document;
tagName = tagName || "*";
className = className.split(" ");
var classNameLength = className.length;
for(var i=0,j=classNameLength;i<j;i++){
//創(chuàng)建匹配類名的正則
className[i]= new RegExp("(^|\\s)" + className[i].replace(/\-/g, "\\-") + "(\\s|$)");
}
var elements = node.getElementsByTagName(tagName);
var result = [];
for(var i=0,j=elements.length,k=0;i<j;i++){//緩存length屬性
var element = elements[i];
while(className[k++].test(element.className)){//優(yōu)化循環(huán)
if(k === classNameLength){
result[result.length] = element;
break;
}
}
k = 0;
}
return result;
}

好,我們來(lái)測(cè)試一下:
復(fù)制代碼 代碼如下:

<div id="container">
<span class="aaa zzz ccc"></span>
<div class="aaa bbb ccc"></div>
</div>
<div class="aaa bbb ccc"></div>

復(fù)制代碼 代碼如下:

window.onload = function(){
alert(getElementsByClassName(document,"div","aaa ccc").length);//2
alert(getElementsByClassName("container","div","aaa ccc").length);//1
alert(getElementsByClassName("container","span","aaa zzz").length);//1
}

正確的得到了結(jié)果。
原生的getElementsByClassName
有人會(huì)問,原生的方法調(diào)用效率是最高的,有很多瀏覽器已經(jīng)將實(shí)現(xiàn)了getElementsByClassName這個(gè)方法,那為什這里沒有先調(diào)用原生的再調(diào)用自定義的呢?
對(duì),原生的效率是很高,它支持多個(gè)class條件的查詢,但是最大的問題是他不支持getElementsByClassName("container","div","aaa ccc"),這種在指定標(biāo)簽中查找指定元素為指定class的情況。
所以,這里舍棄了原生的方法調(diào)用。
關(guān)于循環(huán)優(yōu)化的問題
在代碼中,你會(huì)看到我將數(shù)組的length緩存了起來(lái),這樣可以提高效率。其實(shí)上,在這里有一個(gè)很隱蔽的問題,就是數(shù)組訪問length屬性和HtmlCollection訪問length有很在的區(qū)別。在數(shù)組中,length是一個(gè)普通的屬性,訪問時(shí)不會(huì)進(jìn)行額外的操作,在來(lái)看看HTMLCollection,我們常常將HTMLCollection當(dāng)作數(shù)組來(lái)使用,但實(shí)際上,它是一個(gè)根據(jù)DOM結(jié)構(gòu)自動(dòng)變化的實(shí)體對(duì)象。每次訪問一個(gè)HTMLCollection對(duì)象的屬性時(shí),他都會(huì)對(duì)DOM內(nèi)所有的節(jié)點(diǎn)進(jìn)行一次完整的匹配。也就是說(shuō),每次訪問HtmlCollection對(duì)象的length時(shí),都會(huì)更新一次集合對(duì)象,性能上消耗很大。所以一般情況之下,這種HtmlCollection的循環(huán)操作,都是建議緩存length的。
額外的收獲
這是關(guān)于往數(shù)組里放元素的方式間,效率比較的問題
來(lái)看一下代碼:
復(fù)制代碼 代碼如下:

//方式一
var arr = [];
var start = new Date();
for(var i=0;i<100000;i++){
arr.push(i);
}
//方式二
var arr = [];
var start = new Date();
for(var i=0;i<100000;i++){
arr[arr.length]=i;
}

猜猜看,哪種效率更高呢!經(jīng)過(guò)測(cè)試,第二種方式的效率要高于第一種。
提醒:
這個(gè)版本是不兼容IE5的,以下是我給出的解釋:
1.當(dāng)你從那千分之幾的統(tǒng)計(jì)數(shù)據(jù)里,再去瘋錢的IE5測(cè)試人員的點(diǎn)擊和專業(yè)程序員對(duì)IE5的好奇心,估計(jì)就只剩IE5被焚燒后的灰燼了。
2.你要想信灰燼的利用價(jià)值趨于零
3.如果到現(xiàn)在還沒能說(shuō)服你,那我想說(shuō),你很專業(yè)!即然這樣,那還有IE3,IE2,IE?FF1,NN4...,我想你應(yīng)該一并實(shí)現(xiàn)了。
一些坦白:我也不怎么說(shuō)服得了我自已,唉,還是給一個(gè)IE5的解決方案吧:
IE5并不支持getElementByTagName("*")的形式,所以在這里要處理一下:
var elements = (tagName==='*'&&node.all)?node.all:node.getElementsByTagName(tagName);
好了,不多說(shuō)的,這個(gè)函數(shù)簡(jiǎn)單實(shí)用,代碼上我也寫了注釋,看明白應(yīng)該已經(jīng)沒有什么問題了

相關(guān)文章

  • js中[]、{}、()區(qū)別示例淺析

    js中[]、{}、()區(qū)別示例淺析

    很多人都知道在js中[]表示的是數(shù)組對(duì)象,{}表示的是對(duì)象,但是這兩者的區(qū)別卻說(shuō)不出來(lái),下面這篇文章主要給大家介紹了關(guān)于js中[]、{}、()區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 微信小程序?qū)崿F(xiàn)底部彈窗

    微信小程序?qū)崿F(xiàn)底部彈窗

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)底部彈窗,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 微信小程序骨架屏的實(shí)現(xiàn)方法

    微信小程序骨架屏的實(shí)現(xiàn)方法

    本文主要介紹了微信小程序骨架屏的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • JavaScript實(shí)現(xiàn)時(shí)鐘功能

    JavaScript實(shí)現(xiàn)時(shí)鐘功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)時(shí)鐘功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JavaScript 新手24條實(shí)用建議[TUTS+]

    JavaScript 新手24條實(shí)用建議[TUTS+]

    本文列出了24條能讓你的代碼編寫過(guò)程更為輕松高效的建議。也許您還是JavaScript初學(xué)者,剛剛寫完自己的Hello World,那這里有很多對(duì)您的工作將十分有用的小貼士;也許有些技巧您已經(jīng)知道,那就試試快速瀏覽一下,看能不能發(fā)現(xiàn)一點(diǎn)新東西吧!
    2009-06-06
  • 基于layui實(shí)現(xiàn)高級(jí)搜索(篩選)功能

    基于layui實(shí)現(xiàn)高級(jí)搜索(篩選)功能

    這篇文章主要為大家詳細(xì)介紹了基于layui實(shí)現(xiàn)高級(jí)搜索、篩選功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 淺談js函數(shù)中的實(shí)例對(duì)象、類對(duì)象、局部變量(局部函數(shù))

    淺談js函數(shù)中的實(shí)例對(duì)象、類對(duì)象、局部變量(局部函數(shù))

    下面小編就為大家?guī)?lái)一篇淺談js函數(shù)中的實(shí)例對(duì)象、類對(duì)象、局部變量(局部函數(shù))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • JS中使用gulp實(shí)現(xiàn)壓縮文件及瀏覽器熱加載功能

    JS中使用gulp實(shí)現(xiàn)壓縮文件及瀏覽器熱加載功能

    這篇文章主要介紹了JS中使用gulp實(shí)現(xiàn)壓縮文件及瀏覽器熱加載功能,需要的朋友可以參考下
    2017-07-07
  • Raphael帶文本標(biāo)簽可拖動(dòng)的圖形實(shí)現(xiàn)代碼

    Raphael帶文本標(biāo)簽可拖動(dòng)的圖形實(shí)現(xiàn)代碼

    Javascript和Raphael順便學(xué)習(xí)了一下,主要是為了實(shí)現(xiàn)一個(gè)可拖動(dòng)的矩形同時(shí)矩形上還得顯示標(biāo)簽,網(wǎng)上關(guān)于這方面的知識(shí)提的很是于是本人自不量力寫了一下,感興趣的你可不要錯(cuò)過(guò)了哈,希望可以幫助到你
    2013-02-02
  • 講兩件事:1.this指針的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件處理上的區(qū)別

    講兩件事:1.this指針的用法小探. 2.ie的attachEvent和firefox的addEventListene

    講兩件事:1.this指針的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件處理上的區(qū)別...
    2007-04-04

最新評(píng)論

祁连县| 临沭县| 通辽市| 博罗县| 景泰县| 灵石县| 沛县| 广东省| 长垣县| 会理县| 沾化县| 通城县| 启东市| 海淀区| 城市| 唐海县| 乌拉特前旗| 鱼台县| 广德县| 定西市| 湘阴县| 台安县| 廉江市| 清河县| 五指山市| 永川市| 林口县| 林周县| 金华市| 延长县| 五河县| 台湾省| 襄汾县| 深圳市| 达孜县| 阿鲁科尔沁旗| 特克斯县| 阳新县| 揭东县| 昌江| 托克托县|