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 相关文章推荐
Add a Formatted Table to a Word Document
Jun 15 Javascript
jQuery LigerUI 使用教程表格篇(1)
Jan 18 Javascript
js图片预加载示例
Apr 30 Javascript
jquery实现仿新浪微博评论滚动效果
Aug 06 Javascript
Bootstrap实现默认导航栏效果
Sep 21 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
Nov 26 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
vue滚动轴插件better-scroll使用详解
Oct 17 Javascript
angularjs http与后台交互的实现示例
Dec 21 Javascript
vue-router命名路由和编程式路由传参讲解
Jan 19 Javascript
微信小程序实现炫酷的弹出式菜单特效
Jan 28 Javascript
一文帮你理解PReact10.5.13源码
Apr 03 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
Syphon 秘笈
2021/03/03 冲泡冲煮
一个比较简单的PHP 分页分组类
2009/12/10 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
JavaScript 的方法重载效果
2009/08/07 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
浅析Vue自定义组件的v-model
2017/11/26 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
python显示天气预报
2014/03/02 Python
Ubuntu下安装PyV8
2016/03/13 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
你真的了解Python的random模块吗?
2017/12/12 Python
python组合无重复三位数的实例
2018/11/13 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
协议书的格式
2014/04/23 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书