亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript通過HTML的class來獲取HTML元素的方法總結(jié)

 更新時間:2016年05月24日 18:27:55   投稿:goldensun  
除了getElementsByClassName()函數(shù),我們可以自己動手編寫程式來通過class獲取元素,接下來我們整理了一下JavaScript通過HTML的class來獲取HTML元素的方法總結(jié),需要的朋友可以參考下

對于js來說,我想每一個剛接觸它的人都應(yīng)該會抱怨:為什么沒有一個通過class來獲取元素的方法。盡管現(xiàn)在高版本的瀏覽器已經(jīng)支持getElementsByClassName()函數(shù),但是對于低版本瀏覽器來說,還是無法兼容,在脫離其他庫的時候,還是得自己封裝一個方法。

方法一

function getByClass1(parent, cls){
  var res = [];  //存放匹配結(jié)果的數(shù)組
  var ele = parent.getElementsByTagName('*');
  for(var i = 0; i < ele.length; i++){
    if(ele[i].className == cls){
      res.push(ele[i]);
    }
  }
  return res;
}

當(dāng)然class里的值只有一個時,上面的方法沒問題,但當(dāng)值為多個時,就會出現(xiàn)問題。

<div class="test"></div>
<div class="test box"></div>
<script>
  getByClass1(document, 'test');  //只獲取到第一個div
</script>

方法二

出現(xiàn)問題的時候,我們會嘗試著改進(jìn),對于多類名的情況我們可以用正則去匹配是否包含所要查找的class名,于是就出現(xiàn)了下面這種寫法:

function getByClass2(parent, cls){
  var res = [];
  var reg = new RegExp('\\b' + cls + '\\b', 'i');  //匹配cls是一個獨立的單詞
  var ele = parent.getElementsByTagName('*');
  for(var i = 0; i < ele.length; i++){
    if(reg.test(ele[i].className)){
      res.push(ele[i]);
    }
  }
  return res;
}

這種方法看似可以,解決了getByClass1()的問題,我也用了好長一段時間,但是還會有一個隱藏的bug??聪旅娴睦樱?/p>

<div class="test"></div>
<div class="test_box"></div>
<div class="test-box"></div>
<script>
  getByClass2(document, 'test');  //結(jié)果獲取到了第一個div和第三個div
</script>  

理論上應(yīng)該只獲取到第一個,但是卻和我們預(yù)期不一樣。這個bug源于下面這段代碼里的\b

var reg = new RegExp('\\b' + cls + '\\b', 'i');

我們先來看下\b在正則中的表示的意思

\b是正則表達(dá)式規(guī)定的一個特殊代碼,代表著單詞的開頭或結(jié)尾,也就是單詞的分界處。

通俗點說:\b就是匹配一個單詞(從左邊界到右邊界)。

而問題也就出在這里,\b把除字母、數(shù)字、下劃線外的其他字符都當(dāng)成是邊界,對于上面的例子中第三個class值為test-box,\b匹配時,把連字符(-)當(dāng)作單詞邊界,所以也匹配了第三個div。

方法三

因此我們還需要對上面方法進(jìn)行進(jìn)一步改進(jìn),這里參考了stackoverflow上提到的一種方法:

How to Get Element By Class in JavaScript?

改進(jìn)后的代碼如下:

function getByClass3(parent, cls){
  var res = [];
  var reg = new RegExp(' ' + cls + ' ', 'i');  //匹配cls時,兩邊需要有空格
  var ele = parent.getElementsByTagName('*');
  for(var i = 0; i < ele.length; i++){
    if(reg.test(' ' + ele[i].className + ' ')){
      res.push(ele[i]);
    }
  }
  return res;
}

這種方法舍去了用\b而采用空格來匹配邊界,先在獲取到的className值兩邊加上空格,這樣就保證了className里的每個值兩邊都會有空格,然后再用正則去匹配。

用這種方法暫時還未發(fā)現(xiàn)問題,但是使用時,方法中的單引號內(nèi)的空格一定不能落下。

方法四

function getByClass3(parent, cls){
  var res = [];
  var reg = new RegExp('(^|\\s)' + cls + '($|\\s)', 'i');
  var ele = parent.getElementsByTagName('*');
  for(var i = 0; i < ele.length; i++){
    if(reg.test(ele[i].className)){
      res.push(ele[i]);
    }
  }
  return res;
}

空格完全用正則來處理,這樣省去了空格容易落下的問題,代碼也更美觀精簡。

那么這種方法是否就是比較完美的呢,其實不然,下面來看下更優(yōu)的方案。

方法五(完美版)

文章開頭已經(jīng)提到,高版本的瀏覽器已經(jīng)支持getElementsByClassName()方法。出于性能考慮,對支持的瀏覽器使用原生方法勢必會更好。而對于低版本的瀏覽器使用上面的方法四。

function getByClass(parent, cls){
  if(parent.getElementsByClassName){
    return parent.getElementsByClassName(cls);
  }else{
    var res = [];
    var reg = new RegExp(' ' + cls + ' ', 'i')
    var ele = parent.getElementsByTagName('*');
    for(var i = 0; i < ele.length; i++){
      if(reg.test(' ' + ele[i].className + ' ')){
        res.push(ele[i]);
      }
    }
    return res;
  }
}

當(dāng)然方法五自認(rèn)為是相對較好的方案,如果有更優(yōu)秀的方法歡迎留言補充。

相關(guān)文章

  • javascript一個無懈可擊的實例化XMLHttpRequest的方法

    javascript一個無懈可擊的實例化XMLHttpRequest的方法

    由于IE新舊版本以及與其他瀏覽器在ajax技術(shù)上的不同,往往需要對不同的瀏覽器做不同的處理,除了笨拙的瀏覽器嗅探技術(shù),大約也就是對象檢測技術(shù)可用了。
    2010-10-10
  • 詳解微信小程序開發(fā)之下拉刷新 上拉加載

    詳解微信小程序開發(fā)之下拉刷新 上拉加載

    本篇文章主要介紹了微信小程序開發(fā)之下拉刷新 上拉加載,具有一定的參考價值,有興趣的可以了解一下。
    2016-11-11
  • JS實現(xiàn)針對給定時間的倒計時功能示例

    JS實現(xiàn)針對給定時間的倒計時功能示例

    這篇文章主要介紹了JS實現(xiàn)針對給定時間的倒計時功能,結(jié)合具體實例形式分析了javascript日期時間的正則判定與動態(tài)運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • javascript事件委托的方式綁定詳解

    javascript事件委托的方式綁定詳解

    我們在學(xué)習(xí)JavaScript中,難免都會去網(wǎng)上查一些資料。也許偶爾就會遇到“事件委托”,但是,大多數(shù)時說的是“事件綁定”,對于“事件委托”,或是不提,或是淺嘗輒止。對于我這個比較好奇的人來說,實在很蛋疼。尤其是想更多的了解“事件委托”的時候。
    2015-06-06
  • JSON格式的鍵盤編碼對照表

    JSON格式的鍵盤編碼對照表

    這篇文章主要介紹了JSON格式的鍵盤編碼對照表,本文給出英文鍵名、對應(yīng)數(shù)值和中文注釋,需要的朋友可以參考下
    2015-01-01
  • javascript實現(xiàn)的右下角彈窗實例

    javascript實現(xiàn)的右下角彈窗實例

    這篇文章主要介紹了javascript實現(xiàn)的右下角彈窗,實例分析了javascript實現(xiàn)右下角彈窗的完整實現(xiàn)步驟與技巧,需要的朋友可以參考下
    2015-04-04
  • JS構(gòu)造函數(shù)與原型prototype的區(qū)別介紹

    JS構(gòu)造函數(shù)與原型prototype的區(qū)別介紹

    下面小編就為大家?guī)硪黄狫S構(gòu)造函數(shù)與原型prototype的區(qū)別介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 原生JS實現(xiàn)表單checkbook獲取已選擇的值

    原生JS實現(xiàn)表單checkbook獲取已選擇的值

    本文為大家介紹下采用原生JS實現(xiàn)從一個表單checkbox獲取到已選中的數(shù)據(jù)值,具體的實現(xiàn)如下,感興趣的朋友可以參考下哈,希望對大家有所幫助
    2013-07-07
  • Javascript for in的缺陷總結(jié)

    Javascript for in的缺陷總結(jié)

    這篇文章主要介紹了Javascript for in的缺陷總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 基于js 各種排序方法和sort方法的區(qū)別(詳解)

    基于js 各種排序方法和sort方法的區(qū)別(詳解)

    下面小編就為大家分享一篇基于js 各種排序方法和sort方法的區(qū)別(詳解),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評論