成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導(dǎo)航首頁 ? 技術(shù)教程 ? jQuery原理系列-css選擇器的簡單實(shí)現(xiàn)
全站頭部文字 我要出現(xiàn)在這里
jQuery原理系列-css選擇器的簡單實(shí)現(xiàn) 713 2024-02-29   

jQuery最強(qiáng)大的功能在于它可以通過css選擇器查找元素,它的源碼中有一半是sizzle css選擇器引擎的代碼,在html5規(guī)范出來之后,增加了document.querySelector和document.querySelectorAll直接查找元素,如果是做移動(dòng)端開發(fā)的,使用jQuery的必要性大大降低。

用js代碼實(shí)現(xiàn)css選擇器,必然是用正則表達(dá)式來識別字符串了,當(dāng)然瀏覽器提供的原生api 效率更高,以下代碼只做原理性展示,并未優(yōu)先性能,

例如

1)查找id顯然是用document.getElementById更高效,瀏覽器已經(jīng)做了hash,一次性找到元素不用遍歷每個(gè)節(jié)點(diǎn)。

2)查找 name用document.getElementsByName更高效,瀏覽器已經(jīng)做了一個(gè)含有該name的集合,

3)查找標(biāo)簽名 用document.getElementsByTagName更高效,瀏覽器已經(jīng)做了一個(gè)含有該tag集合,從這個(gè)集合中再查找子集顯然可以少遍歷很多的元素,至于瀏覽器是不是在元素創(chuàng)建的時(shí)候就更新了緩存的集合就不得而知了,但是從這個(gè)集合中判斷是不是目標(biāo)元素的子節(jié)點(diǎn)還要用contains也會有性能損耗。

好了,我們先不考慮用原生api優(yōu)化選擇器的問題,只用純正則表達(dá)式來做一個(gè)簡單的實(shí)現(xiàn),先用正則判斷如果含有#就是id選擇器,如果含有點(diǎn)號就是class選擇器,如果含有[]就是屬性選擇器,設(shè)定好查找目標(biāo)后開始遍歷子節(jié)點(diǎn),要用遞歸函數(shù)遍歷childNodes子節(jié)點(diǎn)的id,name,className,getAttribute是否匹配,如果匹配就返回該元素。完整的代碼如下:

html:

<body>
  <div>
    
    <span id="sp_id">hello,id</span>
    <span class="sp_class">hello,class</span>
     <span name="sp_name" >hello,name</span>
     <b>hello,tag</b>
  </div>
 </body>

javascript:

<script type="text/javascript">
   
   
   function find(el, selector) { //查找子節(jié)點(diǎn),用法類似jquery的find函數(shù),僅支持id,class,attr選擇器,僅支持返回匹配的第一個(gè)元素
    var m = selector.match(/([#.[])([wW]+)/i);
    var type, key,attrName, result;
    if (m) {
      if (m[1] == ".") {
        type = "class"; key = m[2];
      } else if (m[1] == "#") {
        type = "id"; key = m[2];
      } if (m[1] == "[") {
        type = "attr";
        m = m[2].match(/(w+)=(w+)/i);
        attrName = m[1];
        key = m[2];
      }
    } else {
      type = "tag"; key = selector;
    }
    
    function findChild(node) {
      var c;
      for (var i = 0; i < node.childNodes.length; i++) {
        c = node.childNodes[i];
        if (type == "class" && c.className == key) {
          result = c;
          return;
        } else if (type == "id" && c.id == key) {
          result = c;
          return;
        } else if (type == "attr" && c.getAttribute && c.getAttribute(attrName) == key) {
          result = c;
          return;
        } else if (type == "tag" && c.tagName && c.tagName.toLowerCase() == key) {
          result = c;
          return;
        }
        findChild(c);
      }
    }
    findChild(el);
    return result;
    
  }
  
  console.log(find(document.body,"#sp_id").innerHTML);
  console.log(find(document.body,".sp_class").innerHTML);
  console.log(find(document.body,"[name=sp_name]").innerHTML);
  console.log(find(document.body,"b").innerHTML);
    
  </script>

以上這篇jQuery原理系列-css選擇器的簡單實(shí)現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持綠夏網(wǎng)。


css

主站蜘蛛池模板: 髋关节置换术后护理ppt| 罗比威廉姆斯| 越战电影《天与地》| 大胆艺术| 小学三年级英语同步跟读app| 汽水音乐app官网| 冰之下| 王音棋的个人简历| 爱在记忆中找你歌词| 张颜齐| 同乐赛鸽公棚| 韩国 爱人| 罗云熙的新剧《尸语者》哪里能看 | 行尸走肉第六季| 斯维特拜克之歌电影| 小狗克罗历险记| 惊天十二小时| 牵牛花的生长变化记录| 张柏芝演的电视剧| 知否知否应是绿肥红瘦观看| 克拉之恋 电视剧| 97理伦| 光棍电影| 性欧美女同| 一级特黄新婚之夜| 按摩私处| 吴彦祖激情戏| hunger game| 嗯啊不要啊啊啊| 许嵩是哪里人| 黄日华版射雕英雄传| 天下第一楼演员表全部| 小数除法竖式50道带答案| 迷宫的十字路口讲了什么| 超级马里奥| 快播电影网| 迷宫1意大利劳尔| 周杰伦《退后》歌词| 北京1号线地铁站点线路图| 画江湖之不良人7季什么时候上映| remember11|

!!!站長長期在線接!!!

網(wǎng)站、小程序:定制開發(fā)/二次開發(fā)/仿制開發(fā)等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103