js实现类选择器和name属性选择器的示例步骤


Posted in Javascript onFebruary 07, 2021

jQuery的出现,大大的提升了我们操作dom的效率,使得我们的开发更上一层楼,如jQuery的选择器就是一个很强大的功能,它包含了类选择器、id选择器、属性选择器、元素选择器、层级选择器、内容筛选选择器等等,很是方便快捷,并且这些选择器的兼容性都很好,可以说操作dom使用jq选择器一时爽,一直使用一直爽!只是,目前Vue、React、Angular三大框架的出现大大降低了JQuery的使用频率,而且JQuery在操作dom和绑定数据时确实存在一定的性能问题和各种坑,但依旧不可抹杀jq在操作dom方面的强大存在!

说了JQuery这么多的牛逼之处,那么它的很多内部原理是如何实现的呢?今天就来简单实现一个类似jQuery的类选择器和name属性选择器。

类选择器:

function getElementsByClass(className) {
   var classArr = [];
   var tags = document.getElementsByTagName("*");

   for (var i = 0; i < tags.length; i++) {
    if (tags[i].nodeType == 1) {
     if (tags[i].getAttribute("class") == className) {
      classArr.push(tags[i]);
     }
    }
   }
   return classArr;
}

其实name属性选择器跟类选择器一样,只是判断条件稍微变了一下而已:

function getElementsByName(name) {
   var nameArr = [];
   var num = 0;
   var tags = document.getElementsByTagName("*");

   for (var i = 0; i < tags.length; i++) {
    if (tags[i].nodeType == 1) {
     if (tags[i].getAttribute("name") == name) {
      nameArr.push(tags[i]);
     }
    }
   }

   return nameArr;
}

name属性选择器大多用在表单的操作方面。

以上代码中有一个nodeType的属性,它是用来判断节点的类型,nodeType共有12个值,1代表节点元素,2代表属性,3代表元素或属性中的文本内容。这三个数值用的是比较多的,其他9个用的不多,想了解的话可以去看一下API。在这里,我们需要得到元素节点,所以就会判断当前元素的nodeType是否为1。

再来贴一下用递归来实现获取元素的所有子节点(含孙子节点):

/** 
   * 递归获取所有子节点
   * 
   node代表想要获取所有子节点的父节点

   type取值:
   1  Element         代表元素
   2  Attr          代表属性
   3  Text          代表元素或属性中的文本内容
   4  CDATASection      代表文档中的 CDATA 部分(不会由解析器解析的文本)
   5  EntityReference     代表实体引用
   6  Entity         代表实体
   7  ProcessingInstruction  代表处理指令
   8  Comment         代表注释
   9  Document        代表整个文档(DOM 树的根节点)
   10 DocumentType      向为文档定义的实体提供接口
   11 DocumentFragment    代表轻量级的 Document 对象,能够容纳文档的某个部分
   12 Notation        代表 DTD 中声明的符号
  */
  var allChildNodes = function (node, type) {
   // 1.创建全部节点的数组
   var allCN = [];

   // 2.递归获取全部节点
   var getAllChildNodes = function (node, type, allCN) {
    // 获取当前元素所有的子节点nodes
    var nodes = node.childNodes;
    // 获取nodes的子节点
    for (var i = 0; i < nodes.length; i++) {
     var child = nodes[i];
     // 判断是否为指定类型节点
     if (child.nodeType == type) {
      allCN.push(child);
     }
     getAllChildNodes(child, type, allCN);
    }
   }
   getAllChildNodes(node, type, allCN);
   // 3.返回全部节点的数组
   return allCN;
  }

  // 调用:
  // 获取body中全部节点
  allChildNodes(document.querySelector('body'), 1);
  
  //获取body中全部纯文本节点
  allChildNodes(document.querySelector('body'), 3)

作者:小坏

出处:http://tnnyang.cnblogs.com

以上就是js实现类选择器和name属性选择器的示例步骤的详细内容,更多关于js实现类选择器和name属性选择器的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
HTML页面如何象ASP一样接受参数
Feb 07 Javascript
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
Aug 19 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
javascript根据像素点取位置示例
Jan 27 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
Jan 25 Javascript
jQuery中的siblings()是什么意思(推荐)
Dec 29 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
在vue中使用css modules替代scroped的方法
Mar 10 Javascript
vue.js数据绑定操作详解
Apr 23 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 Javascript
React-redux实现小案例(todolist)的过程
Sep 29 Javascript
如何在JavaScript中等分数组的实现
Dec 13 Javascript
vue如何使用rem适配
Feb 06 #Vue.js
如何管理Vue中的缓存页面
Feb 06 #Vue.js
JS中锚点链接点击平滑滚动并自由调整到顶部位置
Feb 06 #Javascript
一起深入理解js中的事件对象
Feb 06 #Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 #Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 #Vue.js
vue使用echarts画组织结构图
Feb 06 #Vue.js
You might like
有关PHP性能优化的介绍
2013/06/20 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
ie 调试javascript的工具
2009/04/29 Javascript
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
VSCode launch.json配置详细教程
2020/06/18 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
Python实现list反转实例汇总
2014/11/11 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
Python多线程原理与用法详解
2018/08/20 Python
tensorflow的计算图总结
2020/01/12 Python
tensorflow自定义激活函数实例
2020/02/04 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
班级学习计划书
2014/04/27 职场文书
电子商务专业求职信
2014/07/10 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
小学六年级毕业感言
2015/07/30 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python
vue3不同环境下实现配置代理
2022/05/25 Vue.js
Redis主从复制操作和配置详情
2022/09/23 Redis