【问题标题】:jQuery to Javascript adding required attributejQuery 到 Javascript 添加必需的属性
【发布时间】:2020-04-27 06:20:28
【问题描述】:

因此,我构建了以下 jQuery 代码,用于检查是否在 #rtk5 上触发了 on change 事件,然后删除或添加“必需”属性。

在 jQuery 中完美运行

// Make checkbox textboxes not required unless checked
$(document).ready(function() {
    $('#rtk5').change(function() {
        if ($('.rtk5ReqField').attr('required')) {
            $('.rtk5ReqField').removeAttr('required');
        }
        else {
            $('.rtk5ReqField').attr('required','required');
        }
    });
});

我想通过函数调用将其转换为 JavaScript,但我似乎无法弄清楚如何正确执行此操作。

错误:
TypeError: rtk5req.getAttribute is not a function

这是我的尝试:

var rtk5req = document.getElementsByClassName('rtk5ReqField');
function rtk5Required() {
    rtk5req.addEventListener('change', (e) => {
        if (rtk5req.getAttribute('required')) {
            rtk5req.removeAttribute('required');
        } else {
            rtk5req.getAttribute('required', 'required');
        }
    });
}
rtk5req.addEventListener('change', rtk5Required());
document.addEventListener('DOMContentLoaded', rtk5Required);
rtk5Required();

更新的代码:删除了重复的更改调用

var rtk5req = document.getElementsByClassName('rtk5ReqField');
function rtk5Required() {
        if (rtk5req.getAttribute('required')) {
            rtk5req.removeAttribute('required');
        } else {
            rtk5req.getAttribute('required', 'required');
        }
}
rtk5req.addEventListener('change', rtk5Required());
document.addEventListener('DOMContentLoaded', rtk5Required);
rtk5Required();

更新代码#2

感谢所有的辛勤工作,我仍然遇到一个小问题,必须进行一些调整 - 当我取消选中该复选框时,它不会删除放置在 rtk5Declaration 上的所需标签在 jQuery 中做了。

var rtk5_selection = document.getElementById('rtk5');

document.addEventListener('DOMContentLoaded', () => {
    rtk5_selection.addEventListener('change', () => {
        if (rtk5_selection.getAttribute('required')) {
            document.getElementById('rtk5Declaration').removeAttribute('required');
        } else {
            document.getElementById('rtk5Declaration').setAttribute('required', 'required');
        }
    });
});

非常感谢!

【问题讨论】:

  • .getElementsByClassName 返回元素的HTMLCollection,而不是单个元素。您需要对其进行迭代。
  • 在您解决 rtk5req 是一个伪数组而不是单个元素这一事实之前,它不会起作用。
  • 已知有多少元素存在于这个特定的类中?它会影响任何答案的书写方式。
  • 对,在这种情况下,我看到了问题所在 - 您应该将第二个代码更改为使用 var rtk5req = document.getElementById('rtk'); 而不是使用其类和更复杂的 getElementsByClassName() 函数。
  • 并且不要使用更新的代码 - 正如@ajuni880 指出的那样,它有缺陷。

标签: javascript jquery


【解决方案1】:

由于你只有一个元素,你应该使用它的 ID 而不是它的类,并避免 document.getElementsByClassName 返回一个元素的伪数组而不是单个元素所导致的复杂性。

注意:使用setAttribute 来更改属性的值,或者更好(如下面的代码所示)使用反映元素属性的直接布尔属性 .

document.addEventListener('DOMContentLoaded', () => {

    const rtk_sel = document.getElementById('rtk5');
    const rtk_dec = document.getElementById('rtk5Declaration');

    rtk_sel.addEventListener('change', () => {
        rtk_dec.required = !rtk_sel.checked;
    });
});

【讨论】:

  • 感谢@Alnitak 的指导,但我想我可能需要做一些调整,因为它会检查 ID #rtk5 是否触发了 on change 事件,而不是使用 .rtk5ReqField 类,我将使用 ID rtk5Declaration 在此处应用所需的属性。
  • 假设基于您的 cmets 有一个 .rtkReqField 元素并且它是具有 #rtk ID 的元素,这里的代码应该完全复制您现有的 jQuery 代码。如果你需要调整它,那就是另一个问题了。
  • 谢谢@Alnitak,我用我遇到的一个小问题更新了答案。
【解决方案2】:

感谢大家的贡献,下面是我调整的工作版本:

var rtk5_selection = document.getElementById('rtk5');
var rtk5declaration = document.getElementById('rtk5Declaration');

function rtd3Declaration() {
    if (!rtk5_selection.checked) {
        rtd3declaration.removeAttribute('required');
    } else {
        rtd3declaration.setAttribute('required', 'required');
    }
}
rtk5_selection.addEventListener('change', rtd3Declaration);
document.addEventListener('DOMContentLoaded', rtd3Declaration);
rtd3Declaration();

【讨论】:

  • 啊,所以这是两个不同的元素?你没有在问题中提到这一点。就我个人而言,我仍然会使用 rtd3declaration.required 作为属性(就像你对 rtk5_selection.checked 所做的那样,而不是搞乱对 removeAttribute 的调用。事实上你可以这样做:rtd3declaration.required = !rtk5_selection.checked。(请参阅我的更新答案)
  • 感谢@Alnitak 的指导,我仍然会接受它作为最终答案,因为它帮助铺平了道路。
  • 注意:您不应该单独调用rtd3Declaration,而应该将getElementById 调用移到该函数内部,以确保它们确实成功。如果在加载 DOM 之前调用它们,它们将不会保存正确的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2015-05-09
相关资源
最近更新 更多