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

yizhihongxing

那么我们来详细讲解一下如何通过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日

相关文章

  • vuex存储数据的几种方法实例详解

    我为您详细讲解“Vuex存储数据的几种方法实例详解”的攻略。 什么是Vuex Vuex是Vue.js应用程序中的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 组件中存储数据的问题 在Vue.js应用程序中,对于一个组件来说,如果它的状态发生变化,这个变化对于其他组件是不可见的;如果多个组件共享同一…

    Vue 2023年5月28日
    00
  • Vue 获取数组键名的方法

    Vue 获取数组键名的方法主要有两种,分别是使用v-for循环数组时获取索引值与使用Object.keys()方法获取数组键名。 使用v-for获取数组索引值 在使用v-for循环渲染数组时可以通过指定两个参数来获取数组中每个元素的值和对应的索引值,通过获取索引值就可以获取数组的键名。示例代码如下: <ul> <li v-for=&quot…

    Vue 2023年5月28日
    00
  • vue中动态组件使用及传值方式

    接下来我会详细讲解“Vue中动态组件使用及传值方式”的完整攻略,包含以下内容: 动态组件的基本使用方法 在父组件中使用动态组件 在子组件中使用 props 传递数据 示例代码说明 1. 动态组件的基本使用方法 Vue中的动态组件可以让我们根据不同的情况加载不同的组件。在 Vue 中使用动态组件非常简单,只需要使用 component 标签,并将 is 属性指…

    Vue 2023年5月27日
    00
  • Vue首屏性能优化组件知识点总结

    当我们开发网站时,保证首屏性能优化是一个非常重要的问题。在Vue的开发中,也存在一些优化策略和技术,来帮助我们优化网站的首屏性能,其中组件是一个比较重要的方面。以下是Vue首屏性能优化组件知识点总结的完整攻略。 1. 异步组件 Vue允许我们将组件代码进行异步加载,这可以帮助我们解决首屏加载慢的问题。可以采用以下办法: 1.1 使用vue-cli创建项目时,…

    Vue 2023年5月28日
    00
  • Android面向切面基于AOP实现登录拦截的场景示例

    下面我来为您详细讲解“Android面向切面基于AOP实现登录拦截的场景示例”的完整攻略。 什么是AOP AOP(Aspect Oriented Programming),面向切面编程,是一种编程范式,它旨在解决开发中的横切关注点问题。横切关注点是指在整个应用中有多个不同的模块都需要共同解决的问题,比如日志、事务、缓存等。AOP可以帮助我们把这些横切关注点从…

    Vue 2023年5月28日
    00
  • vue打包项目版本号自加的操作步骤

    下面是对“Vue打包项目版本号自加的操作步骤”的完整攻略: 1. 在package.json中设置版本号 在进行打包操作之前,需要在package.json文件中对项目的版本号进行设置。 { "name": "my-project", "version": "1.0.0", //…

    Vue 2023年5月28日
    00
  • vue3使用keep alive实现前进更新后退销毁

    关于“Vue 3使用keep-alive实现前进更新后退销毁”的攻略,以下是具体步骤: 1. 确定路由结构 在使用keep-alive缓存路由时,为了避免某些路由被缓存,需要在路由配置中加上meta: {keepAlive: true}的标识。例如,我们的路由结构可能是这样的: const routes = [ { path: ‘/’, component:…

    Vue 2023年5月29日
    00
  • Vue自动构建发布脚本的方法示例

    下面我详细讲解一下“Vue自动构建发布脚本的方法示例”的完整攻略。 1. 确定需求 在实现自动构建发布脚本之前,我们需要先确定具体的需求,以便确定脚本的功能和实现方案。一般来说,自动构建发布脚本的主要功能包括: 构建前的准备工作,如环境依赖检查、代码检查等; 代码的自动构建和打包; 代码的自动部署和发布。 2. 创建脚本 第二步是开始创建脚本。Vue自动构建…

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