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 相关文章推荐
Jquery中LigerUi的弹出编辑框(实现方法)
Jul 09 Javascript
jQuery的deferred对象详解
Nov 12 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
Sep 18 Javascript
jquery层级选择器的实现(匹配后代元素div)
Sep 05 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
jQuery正则验证注册页面经典实例
Jun 10 jQuery
JQuery 获取Dom元素的实例讲解
Jul 08 jQuery
js和jQuery以及easyui实现对下拉框的指定赋值方法
Jan 23 jQuery
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 Javascript
关于AngularJS中几种Providers的区别总结
May 17 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
python用什么编辑器进行项目开发
2020/06/17 Python
python 实现两个npy档案合并
2020/07/01 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
经典c++面试题四
2015/05/14 面试题
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
《最可爱的人》教学反思
2014/02/14 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
关于颐和园的导游词
2015/01/30 职场文书
五四青年节活动总结
2015/02/10 职场文书
九年级化学教学反思
2016/02/22 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android