JS封装通过className获取元素的函数示例

那么我们来详细讲解一下如何通过JS封装函数来操作DOM元素并获取元素集合。

函数目的

我们希望封装一个函数,用于通过class名称来获取DOM元素,返回一个DOM元素或DOM元素集合.

函数实现

首先,我们需要知道获取DOM元素的方法,通常我们使用document的getElementsByClassName方法,但是这个方法返回的是一个HTMLCollection(一个含有所有类名匹配的元素集合)。我们希望返回一个类似于jQuery返回的element或element-length数组,因此需要对HTMlCollection进行处理。

接下来来看一下基于原生JS的实现:

function getByClass(clsName, parent) {
  parent = parent || document;
  if (parent.getElementsByClassName) {
    return parent.getElementsByClassName(clsName);
  } else {
    var arr = [];
    var reg = new RegExp('(^|\\s)' + clsName + '(\\s|$)');
    var eles = parent.getElementsByTagName('*');
    for (var i = 0, l = eles.length; i < l; i++) {
      if (reg.test(eles[i].className)) {
        arr.push(eles[i]);
      }
    }
    return arr;
  }
}

上面这段代码实现了一个通过className获取元素的函数,其中传入了两个参数:

  • clsName: 需要获取元素的className。
  • parent: 父元素节点,可以为任意元素,默认是document。

如果传入的父元素节点有原生的getElementsByClassName方法,那么直接调用。否则,通过正则表达式来筛选class匹配的元素节点,采用遍历方式。

函数的调用

接下来,我们来看一下如何调用上述函数。

var boxs = getByClass('box');
console.log(boxs[0].innerHTML);

我们可以看到输出的是所有匹配到的节点集合,通过下标可以获取要访问的特定节点。需要注意的是,返回的是一个对象集合,我们需要对其进行遍历或者访问特定子元素来完成具体操作。

示例一:实现深度优先遍历

我们来看一个示例,来实现如何使用上面封装的方法来实现对DOM树的遍历。

(function () {
  function preOrder(root) {
    var res = [],
      stack = [];
    if (root) {
      stack.push(root);
      while (stack.length) {
        var item = stack.shift();
        res.push(item);
        if (item.children) {
          var children = getByClass(item.children, item);
          for (var i = children.length - 1; i >= 0; i--) {
            stack.unshift(children[i]);
          }
        }
      }
    }
    return res;
  }
  var root = document.getElementById('root');
  var nodes = preOrder(root);
  console.log(nodes);
})();

这里我们使用了上面封装的方法getByClass,将其传入item.children,这样就能够获取到item下的所有子节点元素,并将其放入stack队列中。接下来我们就可以通过遍历的方式来遍历整棵DOM树。

示例二:添加新元素、删除已有元素

接下来我们来看一个示例,通过调用封装好的函数来实现添加元素到指定的元素下面,或者根据类名删除已有的元素。

function addNewElem(parentClsName, tag, html) {
  var parent = getByClass(parentClsName)[0];
  var newElem = document.createElement(tag);
  newElem.innerHTML = html;
  parent.appendChild(newDiv);
}

function removeElemByClass(elemClsName) {
  var eles = getByClass(elemClsName);
   for(var i=0; i<eles.length; i++){
     var parent = eles[i].parentNode;
     parent.removeChild(eles[i]);
   }
}

我们可以看到,addNewElem函数接受三个参数,分别是父元素的类名,需要添加的标签类型和HTML内容。通过调用getByClass函数获取到父元素节点,通过 document.createElement方法来创建新元素,最后调用appendChild方法将其追加至父元素节点。

removeElemByClass函数接受一个参数,即需要删除元素的类名。通过调用getByClass函数获取到所有指定的元素节点,遍历每一个节点判断其父节点,调用removeChild方法从DOM树中删除指定元素。该方法应用广泛,可以根据类名实现快速删除和替换元素。

总体来说,通过JS中的DOM操作,我们可以实现更加自由的前端界面构建和交互。函数的封装可以帮助我们在多个页面中重复利用代码,同时提高整个工程代码的可读性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS封装通过className获取元素的函数示例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 详解vue中async-await的使用误区

    下面是“详解Vue中async-await的使用误区”的完整攻略。 前言 作为一门现代前端框架,Vue中的异步编程是不可避免的。而在进行异步编程时,async/await已经成为了主流的解决方案。但是,async/await也有一些常见的误区,在使用中需要特别注意。本文将从实际应用出发,详细讲解Vue中async/await的使用误区。 慎用async/aw…

    Vue 2023年5月28日
    00
  • 快速掌握Vue Router使用方法

    快速掌握 Vue Router 使用方法 Vue Router 是 Vue.js 官方提供的路由管理器。它可以轻松地实现 SPA(单页应用)应用的路由跳转、参数传递、路由嵌套等功能,同时集成了浏览器的前进、后退等操作。 以下是 Vue Router 的完整攻略,帮助你快速掌握 Vue Router 的使用方法。 安装与使用 我们需要通过 npm 安装 vue…

    Vue 2023年5月27日
    00
  • vue实现自定义H5视频播放器的方法步骤

    下面我将详细讲解如何使用Vue实现自定义H5视频播放器。 1. 安装视频播放器组件库 首先,需要安装Vue的视频播放器组件库,常用的有video.js和vue-video-player。这里以vue-video-player为例进行讲解,可在Vue项目中通过以下命令进行安装: npm install vue-video-player –save 2. 导入…

    Vue 2023年5月28日
    00
  • vue常用知识点整理

    Vue常用知识点整理 1. Vue实例 Vue实例是Vue的基本模块,用它来创建Vue应用。一个Vue应用可以有多个Vue实例。 创建Vue实例的语法如下: var vm = new Vue({ // 选项 }) 其中,vm 是Vue实例,选项包括 el, data, template 等等。 2. 数据绑定 Vue实现了双向数据绑定,当数据改变时,视图也会…

    Vue 2023年5月28日
    00
  • vue demi支持sfc方式的vue2vue3通用库开发详解

    下面是关于“vue demi支持sfc方式的vue2vue3通用库开发详解”的完整攻略: 什么是vue demi Vue demi 是一个开源库,它可以让你使用 Vue.js 同时支持 Vue.js 2.x 和 Vue.js 3.x。Vue demi 内部通过条件编译定义了两份代码,以便在不同版本的 Vue.js 之间切换。当构建库时,可以使用 Vue de…

    Vue 2023年5月28日
    00
  • 浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑

    下面是针对“浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑”的完整攻略。 标题 第一步:Hbuilder安装与使用 在Hbuilder官网中下载对应系统的Hbuilder软件 去Hbuilder的官方文档中找打包流程并根据官方文档进行打包操作 打包完成之后,在运行的手机或者模拟器上测试APP的效果,确保APP在打包过程中没有出现问题 第二步…

    Vue 2023年5月27日
    00
  • 公共Hooks封装文件下载useDownloadFile实例详解

    我会为你详细讲解“公共Hooks封装文件下载useDownloadFile实例详解”的完整攻略。 什么是公共Hooks 公共Hooks是指在React项目中,可以被多个组件共享的可重用代码片段。它们通常被封装在统一的模块中,以便于其他组件引用和使用。 useDownloadFile Hook useDownloadFile Hook是一个公共Hooks封装文…

    Vue 2023年5月28日
    00
  • vue 动态表单开发方法案例详解

    Vue 动态表单开发方法案例详解 什么是动态表单? 动态表单是指可以根据不同的需求动态生成不同的表单。在前端开发中,我们通常使用 Vue 来实现动态表单的开发。 开发步骤 1. 定义数据格式 在 Vue 中定义动态表单的数据格式非常重要,因为这将决定你的表单如何渲染和交互。通常使用 JSON 或者 JavaScript 对象来存储表单数据。 2. 构建表单模…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部