获取当前聚焦元素在父元素中的下标--原生JavaScript

1、场景

在做关于el-date-picker时间控件的enter键切换时,type="datetimerange"时,在开始时间的input中按enter键,会直接切换到下个控件,不会聚焦到结束时间的input中,这是因为开始和结束时间的input是在同一个控件里。如下所示:
在这里插入图片描述

2、处理跳转不到结束日期的问题

实现思路:
【1】时间控件中会有两个input元素,如下图:在这里插入图片描述
在这里插入图片描述
【2】获取当前聚焦的元素,看它是否是结束日期所在的input,若是,则跳转到下一个控件,若不是,则聚焦到结束日期的input上。代码如下:

if(keyObj.key==='enter'&&currentComponet.type==='daterange') {
  if([].indexOf.call(document.activeElement.parentNode.querySelectorAll(document.activeElement.tagName),document.activeElement)===1) {
      event.preventDefault();
      return 'next'; //返回'next',跳转到下一个控件
  }else{
      currentComponet.refInput[1].focus(); //聚焦到结束日期的input框中
      return false; //返回false,阻止跳转行为
  }
}

上面代码有两个知识点:
(1)如何获取聚焦的元素:使用原生方法document.activeElement,activeElement 属性能返回文档中当前获得焦点的元素。
(2)如何获取聚焦元素在父元素中的下标[].indexOf.call(document.activeElement.parentNode.querySelectorAll(document.activeElement.tagName),document.activeElement)
document.activeElement.parentNode:获取父节点
document.activeElement.tagName:当前聚焦元素的标签名
document.activeElement:当前聚焦元素
querySelectorAll:querySelectorAll() 方法返回文档中匹配指定 CSS 选择器的所有元素,返回 NodeList 对象。NodeList 对象表示节点的集合。
注意:[].indexOf.call(document.activeElement.parentNode.querySelectorAll(document.activeElement.tagName),document.activeElement) 等价于
document.activeElement.parentNode.querySelectorAll(document.activeElement.tagName).indexOf(document.activeElement)
最后实现的效果如下图所示:
在这里插入图片描述

<think>好的,我现在需要解决用户的问题:如何在JavaScript获取元素的索引以及其文本内容。首先,我得回忆一下相关的知识,并结合提供的引用内容来组织答案。 用户提到“下标文本”,可能是指元素在父容器中的索引位置以及该元素的文本内容。引用中提到了几种方法,比如indexOf和lastIndexOf用于数组元素的索引查找,还有通过jQuery的index()方法获取元素的索引。不过用户的问题是关于原生JavaScript的,所以可能需要用DOM方法。 根据引用3,JavaScript获取元素的方法有很多种,比如getElementById、getElementsByClassName等,这些方法返回的是元素元素集合。例如,使用getElementsByClassName获取到的元素集合,可以通过索引来访问单个元素,如document.getElementsByClassName('div1')[1],这里[1]就是索引。这可能和用户的问题相关,但用户需要的是如何获取元素在其父元素中的索引,而不是直接通过索引访问元素。 引用5提到jQuery中使用index()方法获取元素在兄弟元素中的索引。但用户需要的是原生JavaScript的方法。这时候,可能需要遍历父元素的子节点,比较每个子元素直到找到目标元素,从而确定其索引。 关于获取文本内容,可以使用textContent属性或者innerText。比如element.textContent可以获取元素的文本内容。 接下来需要分步骤说明如何实现: 1. 获取元素的索引: - 首先,获取父元素的所有子元素,比如使用parent.children得到一个HTMLCollection。 - 然后遍历这个集合,找到目标元素的位置,即索引。 2. 获取元素的文本内容: - 使用textContent属性即可。 需要举例说明,比如有一个列表,点击列表项时,显示其索引和文本内容。代码部分需要包括如何绑定事件,如何获取索引和文本。 可能还要注意childNodes和children的区别,因为childNodes会包含文本节点等,而children只包含元素节点,所以用children更准确。 另外,用户提供的引用中有提到数组的indexOf方法,但这里是针对DOM元素的索引,所以不能用数组的方法,需要手动遍历。 最后,确保回答结构清晰,步骤明确,并给出代码示例,同时生成相关问题。</think>在JavaScript获取元素索引及文本内容可通过以下方法实现: ### 一、获取元素索引的三种方法 1. **遍历兄弟元素法**(原生JS实现) ```javascript function getElementIndex(element) { return Array.from(element.parentElement.children).indexOf(element); } // 示例:获取第三个li的索引 const lis = document.querySelectorAll('ul li'); console.log(getElementIndex(lis[2])); // 输出:2 ``` 2. **事件委托法**(适合动态元素) ```javascript document.querySelector('ul').addEventListener('click', function(e) { const index = Array.from(this.children).indexOf(e.target); console.log('索引:', index); }); ``` 3. **自定义属性法**(预存储索引) ```html <ul> <li data-index="0">Item 1</li> <li data-index="1">Item 2</li> </ul> ``` ```javascript document.querySelectorAll('li').forEach(item => { item.addEventListener('click', function() { console.log(parseInt(this.dataset.index)); }); }); ``` ### 二、获取文本内容的两种方式 1. **标准方法**(包含隐藏内容) ```javascript element.textContent ``` 2. **兼容旧浏览器** ```javascript element.innerText ``` ### 三、综合应用示例 ```html <ul id="list"> <li>苹果</li> <li>香蕉</li> <li>橙子</li> </ul> <script> document.getElementById('list').addEventListener('click', function(e) { if (e.target.tagName === 'LI') { const index = Array.from(this.children).indexOf(e.target); const text = e.target.textContent; console.log(`索引:${index}, 内容:${text}`); } }); </script> ``` ### 四、注意事项 1. `children`与`childNodes`区别: - `children`只返回元素节点(推荐使用) - `childNodes`包含所有节点类型(文本节点、注释节点等) 2. 动态元素处理建议使用事件委托方式,避免重复绑定[^3][^5] 3. 表格等结构化数据推荐使用`data-*`属性存储索引值[^5]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值