jQuery原理系列-css选择器的简单实现


Posted in Javascript onJune 07, 2016

jQuery最强大的功能在于它可以通过css选择器查找元素,它的源码中有一半是sizzle css选择器引擎的代码,在html5规范出来之后,增加了document.querySelector和document.querySelectorAll直接查找元素,如果是做移动端开发的,使用jQuery的必要性大大降低。

用js代码实现css选择器,必然是用正则表达式来识别字符串了,当然浏览器提供的原生api 效率更高,以下代码只做原理性展示,并未优先性能,

例如

1)查找id显然是用document.getElementById更高效,浏览器已经做了hash,一次性找到元素不用遍历每个节点。

2)查找 name用document.getElementsByName更高效,浏览器已经做了一个含有该name的集合,

3)查找标签名 用document.getElementsByTagName更高效,浏览器已经做了一个含有该tag集合,从这个集合中再查找子集显然可以少遍历很多的元素,至于浏览器是不是在元素创建的时候就更新了缓存的集合就不得而知了,但是从这个集合中判断是不是目标元素的子节点还要用contains也会有性能损耗。

好了,我们先不考虑用原生api优化选择器的问题,只用纯正则表达式来做一个简单的实现,先用正则判断如果含有#就是id选择器,如果含有点号就是class选择器,如果含有[]就是属性选择器,设定好查找目标后开始遍历子节点,要用递归函数遍历childNodes子节点的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) { //查找子节点,用法类似jquery的find函数,仅支持id,class,attr选择器,仅支持返回匹配的第一个元素
    var m = selector.match(/([#\.\[])([\w\W]+)/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选择器的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 基础篇之运算符、语句(二)
Apr 07 Javascript
jquery 删除cookie失效的解决方法
Nov 12 Javascript
提交按钮的name='submit'引起的js失效问题及原因
Feb 25 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
Dec 02 Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 Javascript
二维码图片生成器QRCode.js简单介绍
Aug 18 Javascript
使用JavaScript破解web
Sep 28 Javascript
vue移动端屏幕适配详解
Apr 30 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
Sep 21 Javascript
Vue的双向数据绑定实现原理解析
Feb 17 Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 Javascript
javascript实现抽奖程序的简单实例
Jun 07 #Javascript
浅谈javascript中new操作符的原理
Jun 07 #Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
Jun 07 #Javascript
jQuery原理系列-常用Dom操作详解
Jun 07 #Javascript
浅析BootStrap栅格系统
Jun 07 #Javascript
浅谈jQuery 选择器和dom操作
Jun 07 #Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
Jun 07 #Javascript
You might like
PHP 5.0对象模型深度探索之对象复制
2008/03/27 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
node跨域请求方法小结
2017/08/25 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
使用python编写udp协议的ping程序方法
2018/04/22 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
经典大学生求职信范文
2014/01/06 职场文书
机关单位动员会主持词
2014/03/20 职场文书
2015年党小组工作总结
2015/05/26 职场文书
正规欠条模板
2015/07/03 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python