You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于事件处理程序位置,原生JavaScript实现文档区域函数应用方案

原生JS替代jQuery .next()实现事件驱动的区域操作

没问题!既然你想摆脱jQuery的依赖,用原生JS实现类似.next()的效果来处理折叠框的切换,我来一步步给你讲清楚:

1. 基础替代:直接获取下一个元素节点

jQuery的.next()本质是获取当前元素的下一个兄弟元素节点(自动跳过空白文本节点),原生JS的nextElementSibling属性完全可以胜任——它会自动忽略换行、空格这类文本节点,直接返回下一个元素。

步骤1:修改内联事件传递触发元素

先把你的<a>标签点击事件改成传递当前元素,这样函数里能精准定位触发源:

<a onClick="collapseboxtoggle(this)">
  <div class="icon-collapse-box">
    <img class="icon-collapse-icon" src="/assets/img/pageimg/image.png" width="70px">
  </div>
</a>

步骤2:编写原生JS切换函数

function collapseboxtoggle(trigger) {
  // 这行等价于 jQuery 的 $(trigger).next()
  const targetElement = trigger.nextElementSibling;
  
  // 这里写你的折叠逻辑,比如切换类名控制显示/隐藏
  if (targetElement) {
    targetElement.classList.toggle('collapsed');
    // 也可以直接操作样式:
    // targetElement.style.display = targetElement.style.display === 'none' ? 'block' : 'none';
  }
}

2. 进阶:模拟jQuery .next(selector)的过滤功能

如果需要像$(trigger).next('.target-class')那样只匹配特定类名的下一个兄弟元素,可以在获取元素后做判断过滤:

function collapseboxtoggle(trigger) {
  let nextElement = trigger.nextElementSibling;
  
  // 遍历下一个兄弟元素,直到找到匹配选择器的目标
  while (nextElement) {
    // 用 matches() 方法判断是否符合目标选择器
    if (nextElement.matches('.target-class')) {
      break;
    }
    nextElement = nextElement.nextElementSibling;
  }
  
  if (nextElement) {
    // 对匹配到的元素执行折叠操作
    nextElement.classList.toggle('collapsed');
  }
}

3. 兼容旧浏览器(可选)

如果需要兼容IE11这类不支持nextElementSiblingmatches()的旧浏览器,可以自己封装一个工具函数:

function getNextSibling(element, selector) {
  let nextSibling = element.nextSibling;
  
  // 跳过非元素节点(文本、注释等)
  while (nextSibling && nextSibling.nodeType !== 1) {
    nextSibling = nextSibling.nextSibling;
  }
  
  // 如果有选择器,继续过滤匹配
  if (selector && nextSibling) {
    // 兼容旧浏览器的 matches 方法
    const matches = nextSibling.matches || nextSibling.msMatchesSelector;
    if (!matches.call(nextSibling, selector)) {
      return getNextSibling(nextSibling, selector);
    }
  }
  
  return nextSibling;
}

// 使用示例
function collapseboxtoggle(trigger) {
  const targetElement = getNextSibling(trigger, '.target-class');
  if (targetElement) {
    targetElement.classList.toggle('collapsed');
  }
}

小提示:推荐用事件委托替代内联事件

内联onClick虽然简单,但不利于代码维护,推荐用事件委托绑定事件,更灵活:

// 页面加载完成后绑定事件
document.addEventListener('DOMContentLoaded', function() {
  // 找到父容器,绑定点击事件
  const container = document.querySelector('.collapse-boxes-column');
  container.addEventListener('click', function(e) {
    // 判断点击的是折叠触发按钮
    const trigger = e.target.closest('a[data-toggle="collapse"]');
    if (trigger) {
      const targetElement = trigger.nextElementSibling;
      targetElement.classList.toggle('collapsed');
    }
  });
});

对应的HTML改成:

<a data-toggle="collapse">
  <div class="icon-collapse-box">
    <img class="icon-collapse-icon" src="/assets/img/pageimg/image.png" width="70px">
  </div>
</a>

内容的提问来源于stack exchange,提问作者Brendon Folsom

火山引擎 最新活动