【问题标题】:If checbox/disable element not working properly如果复选框/禁用元素无法正常工作
【发布时间】:2016-02-11 20:01:30
【问题描述】:

我正在尝试制作一个脚本,以便如果您选中/取消选中复选框输入,它将启用/禁用目标输入文本框。我的代码 if 语句似乎无法正常运行,有时会同时触发两个 if,有时根本不会触发。我已经完成调试并尝试了许多变体,但它仍然无法正常工作。这是我所拥有的,非常感谢任何帮助!

function disable(elem) {
    var obj = document.getElementById(elem);
    status = obj.disabled;
    console.log(status);
    if (status = true) {
        console.log("test");
        obj.disabled = false;
        obj.style.backgroundColor = "white";
    }
    if (status = false) {
        console.log("test2");
        obj.disabled = true;
        obj.style.backgroundColor = "bfbfbf";
    }
}

【问题讨论】:

  • 您确定在条件表达式中应该使用赋值运算符吗?另外,你也应该声明status,它是一个全局变量可能会导致麻烦。

标签: javascript if-statement disabled-input


【解决方案1】:

由于多种原因,此代码没有表现出正确的行为。

第一个原因是您的 if 语句是内联的,而不是 if-else 形式。更好的组织如下:

function disable(elem) {
    var obj = document.getElementById(elem);
    status = obj.disabled;
    console.log(status);
    if (status == true) {
        console.log("test");
        obj.disabled = false;
        obj.style.backgroundColor = "white";
    } else {
        console.log("test2");
        obj.disabled = true;
        obj.style.backgroundColor = "#bfbfbf";
    }
}

这意味着即使您正在检查的变量在块中的代码执行时发生更改,它也不会执行相对块中的代码,无论其新值如何。如您所见,如果在第一个 if 语句中的代码运行时值发生变化,那么两个控制块都可以运行。

它行为不正确的第二个原因是您的 if 语句中的语法不正确。您当前正在使用 = 运算符,这意味着将变量设置为您要检查的内容。如果您想以这种方式编写它们,则必须使用 ===== 相等检查(后者是严格类型)。更好的方法是通过检查值是否为真来完全省略该运算符,如下所示:

function disable(elem) {
    var obj = document.getElementById(elem);
    status = obj.disabled;
    console.log(status);
    if (status) {
        console.log("test");
        obj.disabled = false;
        obj.style.backgroundColor = "white";
    } else {
        console.log("test2");
        obj.disabled = true;
        obj.style.backgroundColor = "#bfbfbf";
    }
}

这应该会为您提供预期的控制行为 :) 如前所述,请确保正确格式化您的值(例如“#bfbfbf”而不是“bfbfbf”)

【讨论】:

  • obj.style.backgroundColor = "bfbfbf"; 还需要一个# 就像#bfbfbf 一样
  • 好点。我只查看了控制语句本身。我也会为他解决这个问题
  • 有趣的是,颜色的东西工作得很好,但是布尔运算符== 解决了我的问题,以及您的组织调整。非常感谢
  • 代码执行时变量如何变化? Javascript是单线程的。我同意使用if/else,因为它更容易理解,但它不应该解决这样的问题。
  • 当然,如果他在代码块中设置它 :) 像这样使用的布尔开关并不少见。
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多