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 相关文章推荐
(JS实现)MapBar中坐标的加密和解密的脚本
May 16 Javascript
jquery控制listbox中项的移动并排序
Nov 12 Javascript
javascript实现动态加载CSS
Jan 26 Javascript
jQuery siblings()用法实例详解
Apr 26 Javascript
深入理解Node.js 事件循环和回调函数
Nov 02 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
Jul 24 Javascript
Vue 动态设置路由参数的案例分析
Apr 24 Javascript
Vue拖拽组件开发实例详解
May 11 Javascript
vue 点击按钮实现动态挂载子组件的方法
Sep 07 Javascript
原生js实现trigger方法示例代码
May 22 Javascript
Vue中keep-alive的两种应用方式
Jul 15 Javascript
jQuery实现回到顶部效果
Oct 19 jQuery
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 include,include_once,require,require_once
2008/09/05 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
深入浅析php json 格式控制
2015/12/24 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python基于DES算法加密解密实例
2015/06/03 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
学生打架检讨书
2014/02/14 职场文书
优秀毕业生推荐信范文
2014/03/07 职场文书
市场策划求职信
2014/08/07 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书