【问题标题】:setAttribute function on checkbox not affecting target button复选框上的 setAttribute 函数不影响目标按钮
【发布时间】:2018-09-08 12:42:45
【问题描述】:

我知道这个问题已经被无休止地问过了,但是通过所有的答案我仍然无法让我的复选框/按钮功能完全起作用。我终于让它停止返回“不是一个函数”,但现在它根本不起作用。

目的是防止表单提交,除非选中法律免责声明框。标准的东西,没有结果...请帮助!

function chkThis() {
  var isChk = document.getElementsByName('agecert');
  var isSub = document.getElementById('submit');
  if (isChk.checked == true) {
    isSub.setAttribute("disabled", "false");
  } else {
    isSub.setAttribute("disabled", "disabled");
  }
}
<form>
  <input name="agecert" type="checkbox" onclick="chkThis();" style="float: left;height: 20px;width: 25px;border: 1px solid red;" tabindex="8">
  <p style="font-size: 10pt;left: 30px;position: absolute;text-align: justify;">Legal disclaimer stuffs...</p>
  </div>

  <div name="subres" style="width: 400px;height: 50px;top: 235px;left: 30px;position: relative;border: none;">
    <button name="submit" type="submit" id="submit" style="left: 65px;" tabindex="9" disabled="disabled">Review Order</button>
    <button name="reset" type="reset" style="left: 245px;" tabindex="10">Reset Form</button>
  </div>
</form>

【问题讨论】:

  • @Jeremy J Starcher 的回答是正确的,您应该尝试彻底理解这一点,因为它是绝对必要的。

标签: javascript checkbox disable


【解决方案1】:

首先getElementsByName返回一个nodeList,你不能直接访问.checked,并且在检查布尔值时你不需要==,我也编辑了禁用属性来禁用/启用按钮。
以下代码应该可以工作。

function chkThis() {
  var isChk = document.getElementsByName('agecert');
  var isSub = document.getElementById('submit');
  if (isChk[0].checked) {
    isSub.disabled = false;
  } else {
    isSub.disabled = true;
  }
}
<form>
  <input name="agecert" type="checkbox" onclick="chkThis();" style="float: left;height: 20px;width: 25px;border: 1px solid red;" tabindex="8">
  <p style="font-size: 10pt;left: 30px;position: absolute;text-align: justify;">Legal disclaimer stuffs...</p>
  </div>

  <div name="subres" style="width: 400px;height: 50px;top: 235px;left: 30px;position: relative;border: none;">
    <button name="submit" type="submit" id="submit" style="left: 65px;" tabindex="9" disabled="disabled">Review Order</button>
    <button name="reset" type="reset" style="left: 245px;" tabindex="10">Reset Form</button>
  </div>
</form>

【讨论】:

  • @Daellus 也可以去掉if/else语句,直接写isSub.disabled = !isChk[0].checked即可。
  • 谢谢你,克里斯!我不知道它基本上是一个数组。多年来,我一直在学习所有这些零碎的东西,因为我需要它。我尝试了 ById 和 ByName 的所有组合。我知道我不必把剩下的写成长篇大论,但我希望通过尽可能详细地写出所有内容来找到问题所在。谢谢!
  • nodeList 与数组并不完全相同,它是一个类似对象的数组,它没有.map 数组所具有的功能。但是您可以使用 Array.prototype.map.call(nodeList, ...) 之类的方法来使其工作。
【解决方案2】:

attributesproperties 是不同的东西,但它们有些相关。

attributes 来自 HTML,properties 设置在 DOM 上。

某些 情况下,更改属性也会更改底层属性,disabled 似乎就是其中之一。根据我的经验,这并不适用于所有属性,尽管我无法立即想到反例。

我提供了演示设置属性和删除属性的代码。我还清理了代码中的其他几个问题。

但实际上,Chris Li 的答案更好,因为它设置了properties,并且是一种更清洁的方法。

function chkThis() {
  // Note that we are getting the [0] -- the first matching name from the NodeList.
  var isChk = document.getElementsByName('agecert')[0];
  var isSub = document.getElementById('submit');
  if (isChk.checked) {
    isSub.removeAttribute("disabled");
  } else {
    isSub.setAttribute("disabled", "disabled");
  }
}
<form>
  <input name="agecert" type="checkbox" onclick="chkThis();" style="float: left;height: 20px;width: 25px;border: 1px solid red;" tabindex="8">
  <p style="font-size: 10pt;left: 30px;position: absolute;text-align: justify;">Legal disclaimer stuffs...</p>
  </div>

  <div name="subres" style="width: 400px;height: 50px;top: 235px;left: 30px;position: relative;border: none;">
    <button name="submit" type="submit" id="submit" style="left: 65px;" tabindex="9" disabled="disabled">Review Order</button>
    <button name="reset" type="reset" style="left: 245px;" tabindex="10">Reset Form</button>
  </div>
</form>

【讨论】:

  • 谢谢!克里斯的回答最有效,正如你所说,代码更干净。一旦我得到一些工作,我就会在代码方面变得整洁。我明白你在说什么,并会强调要更彻底地学习它。
猜你喜欢
  • 2011-06-26
  • 2012-07-12
  • 1970-01-01
  • 2012-10-16
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多