You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将jQuery动态切换required属性代码转为原生JS遇问题求助

问题分析与解决方案

先拆解你代码里的几个核心问题:

1. 元素获取时机不对

你在DOMContentLoaded事件外部就尝试获取rtk5_selection,这时候页面DOM可能还没完全渲染好,导致rtk5_selection大概率是null,后续的事件绑定自然会失效甚至报错。

2. 逻辑判断对象完全搞反了

原jQuery代码的逻辑是切换目标元素(.rtk5ReqField)的required状态,但你的原生JS代码错误地去判断复选框本身的required属性,这完全偏离了原本的业务逻辑。

3. 布尔属性的操作方式不够严谨

用getAttribute判断required这类布尔属性并不靠谱——布尔属性只要存在就会生效,不管它的值是""还是"required"。更推荐用hasAttribute或者直接操作DOM元素的required布尔属性。


修正后的代码(完全匹配原jQuery逻辑)

下面的代码会1:1复刻原jQuery的功能:每次复选框触发change事件,就切换目标元素的required状态:

document.addEventListener('DOMContentLoaded', () => {
  // 必须在DOM加载完成后再获取元素
  const rtk5Selection = document.getElementById('rtk5');
  // 注意:原jQuery操作的是类名为rtk5ReqField的元素,你后来改成了id为rtk5Declaration的元素,这里统一用id版本
  const targetElement = document.getElementById('rtk5Declaration');

  // 先判断元素是否存在,避免控制台报错
  if (rtk5Selection && targetElement) {
    rtk5Selection.addEventListener('change', () => {
      // 切换目标元素的required状态
      if (targetElement.hasAttribute('required')) {
        targetElement.removeAttribute('required');
      } else {
        targetElement.setAttribute('required', 'required');
      }
    });
  }
});

更简洁的写法(利用布尔属性特性)

因为required是DOM元素的原生布尔属性,我们可以直接修改它的布尔值,代码会更简洁直观:

document.addEventListener('DOMContentLoaded', () => {
  const rtk5Selection = document.getElementById('rtk5');
  const targetElement = document.getElementById('rtk5Declaration');

  if (rtk5Selection && targetElement) {
    rtk5Selection.addEventListener('change', () => {
      // 直接反转required的布尔值
      targetElement.required = !targetElement.required;
    });
  }
});

如果你实际需求是“复选框勾选时必填,取消勾选时不必填”

如果原jQuery的逻辑其实是笔误,你真正想要的是根据复选框的勾选状态来控制目标元素的必填性(而非每次切换都反转状态),可以改成这个更符合常规表单场景的版本:

document.addEventListener('DOMContentLoaded', () => {
  const rtk5Selection = document.getElementById('rtk5');
  const targetElement = document.getElementById('rtk5Declaration');

  if (rtk5Selection && targetElement) {
    rtk5Selection.addEventListener('change', () => {
      // 复选框勾选时,目标元素必填;否则不必填
      targetElement.required = rtk5Selection.checked;
    });

    // 页面加载时初始化状态,避免初始显示和逻辑不一致
    targetElement.required = rtk5Selection.checked;
  }
});

你可以根据自己的实际业务需求选择对应的代码版本。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:47:43