【问题标题】:Checking color of an input to disable or enable a submit button检查输入的颜色以禁用或启用提交按钮
【发布时间】:2020-12-31 14:43:57
【问题描述】:

我已经根据输入的有效性设置了不断变化的输入背景颜色。

然后我用这段代码检查颜色:

let elem = document.getElementById("UserInput");
console.log(elem);

let theStyle = window.getComputedStyle(elem, "").getPropertyValue("background-color");


if (theStyle === "rgb(234, 198, 198)") {
  document.getElementById("Submit").disabled = true;
}

if (theStyle === "rgb(251, 250 ,245)") {
  document.getElementById("Submit").disabled = false;
}
input[type="number"]+div {
  display: none;
}

input[type="number"]:valid {
  background-color: #fbfaf5;
}

input[type="number"]:invalid {
  background-color: #eac6c6;
}

input[type="number"]:invalid+div {
  display: block;
  color: #c66464;
}
<input type="number" id="UserInput" class="form-control" autocomplete="off" min="0" max="99999" step="0.01" value="" required />
<input type="submit" id="Submit" />

我唯一缺少的是如何在活动时连续检查颜色(它已经在被调用的函数中)。目前“禁用”是真的,因为 rgb 是红色的。但是当我改变颜色时,即我使用正确的输入,然后我想启用提交按钮。所以,我想我需要一个 eventListener,但我无法完全了解上下文。

【问题讨论】:

  • 你能展示一下 HTML 结构吗?所以我们会知道事件监听器应该是什么样子,以防这是您问题的正确解决方案?知道您可以添加一个代码 sn-p,这将使您更容易回答您的问题:meta.stackoverflow.com/questions/269753/…
  • 好的,我会加进去的。谢谢。

标签: javascript html css validation input


【解决方案1】:

我想既然您已经在使用有效属性来更改 CSS 样式,我认为您也可以使用相同的属性来启用/禁用提交按钮。

let elem = document.getElementById("UserInput");
//listen to input and disable the submit based on the validity of input
elem.addEventListener('keyup',checkValidity);
elem.addEventListener('change',checkValidity);

function checkValidity(){
if(elem.validity.valid){
document.getElementById("Submit").disabled = false;
}else{
document.getElementById("Submit").disabled = true;
}
}

let theStyle = window.getComputedStyle(elem, "").getPropertyValue("background-color");
console.log(theStyle)

if (theStyle === "rgb(234, 198, 198)") {
  document.getElementById("Submit").disabled = true;
}

if (theStyle === "rgb(251, 250 ,245)") {
  document.getElementById("Submit").disabled = false;
}
input[type="number"]+div {
  display: none;
}

input[type="number"]:valid {
  background-color: #fbfaf5;
}

input[type="number"]:invalid {
  background-color: #eac6c6;
}

input[type="number"]:invalid+div {
  display: block;
  color: #c66464;
}
<input type="number" id="UserInput" class="form-control" autocomplete="off" min="0" max="99999" step="0.01" value="" required />
<input type="submit" id="Submit" />

【讨论】:

    【解决方案2】:

    这是一个监听输入字段变化的代码 sn-p。 我不确定输入值与背景值的确切关系,所以我将这部分留给你决定 但是您可以使用我添加的 2 个按钮对其进行测试,当背景颜色为红色时更改值会禁用提交按钮 当 bg 颜色为正确的绿色时更改值使其启用

    如果没有合适的事件可供您监听以使其正常工作,您可以使用 setTimeout 代替事件监听器(我检查过的所有其他解决方案都会损害网站性能 - 会显着降低速度)

    还有一个重要的注意事项: 你有一个放错位置的逗号'theStyle === "rgb(251, 250 ,245)"' 在第三个参数(蓝色)值之前,逗号应该紧跟在第二个参数之后,然后是空格,然后是第三个值。

    let elem = document.getElementById("UserInput");
    
    elem.addEventListener('change', () => {
      let theStyle = window.getComputedStyle(elem, "").getPropertyValue("background-color");
      let submitBtn = document.getElementById("Submit");
    
      if (theStyle === "rgb(234, 198, 198)") {
        submitBtn.disabled = true;
      } else if (theStyle === "rgb(251, 250, 245)") {
        submitBtn.disabled = false;
      }
    
    });
    
    document.querySelector("#valid-btn").addEventListener('click', () => {
      elem.style.backgroundColor = "#fbfaf5";
    });
    
    document.querySelector("#invalid-btn").addEventListener('click', () => {
      elem.style.backgroundColor = "#eac6c6";
    });
    input[type="number"]+div {
      display: none;
    }
    
    
    
    input[type="number"]:invalid+div {
      display: block;
      color: #c66464;
    }
    <input type="number" id="UserInput" class="form-control" autocomplete="off" min="0" max="99999" step="0.01" value="" required />
    <input type="submit" id="Submit" disabled/>
    
    <button id="valid-btn">change bg to green</button>
    <button id="invalid-btn">change bg to red</button>

    【讨论】:

    • 我感觉这会起作用,但禁用按钮不起作用。我要检查我的拼写等......可能是这样。不过谢谢,这有一定的潜力。
    • 点击“更改为红色”后它确实有效。原因是您通过使用 :valid 装饰器设置 bg 将 bg 显式设置为绿色输入实际上从一开始就有效,因此 bg 在第一次更改时设置为绿色并且按钮保持启用
    • 我删除了任何值,所以初始值为红色,即使这样按钮也没有被禁用。我认为我目前的问题之一是我太菜鸟了,看不出我的错误在哪里,我相信你做对了,但我看不出哪里没有;)
    • 你在哪里使用 bgstyle 变量?
    • 我的意思是,它更接近工作。但它在“改变”中采取了一些行动——它确实需要对所有事情进行事件监听。所以我想我在这里遗漏了一些东西。
    【解决方案3】:

    为了解决这个问题,我在将颜色转换为十六进制之前,这样可以确保我们不必处理 rgb 表示法中的空格。

    const form = document.querySelector('form')
    
    const allowedColor = '#00ff00'
    const forbiddenColor = '#ff0000'
    
    const inputField = document.querySelector('#name')
    inputField.style.backgroundColor = forbiddenColor // change this color to test
    
    function componentToHex(c) {
      var hex = c.toString(16);
      return hex.length == 1 ? "0" + hex : hex;
    }
    
    function rgbToHex(channels) {
      return "#" + componentToHex(Number(channels[0])) + componentToHex(Number(channels[1])) + componentToHex(Number(channels[2]));
    }
    
    function handleOnSubmit(e) {
      e.preventDefault()
      
      const stringColor = window.getComputedStyle(inputField, null).getPropertyValue("background-color");
      
      const channelsColor = stringColor.substring(stringColor.indexOf('(') + 1, stringColor.indexOf(')')).split(',')
      
      const hexColor = rgbToHex(channelsColor)
      
      if (hexColor !== forbiddenColor) {
        console.log('submit')
        form.submit()
      }
    }
    
    form.addEventListener('submit', handleOnSubmit)
    <form action="#">
      <label for="name">Name: </label>
      <input id="name" type="text">
      <input type="submit">
    </form>

    【讨论】:

    • 我不需要转换 - 我使用了控制台日志,只有两种颜色,我已经复制并粘贴了两种颜色的控制台日志输出。我知道我得到了正确的两种颜色,因为控制台日志。但是,我遇到的问题不是那个,而是我无法让 eventListener 来监听颜色的变化:(
    • 不用担心转换。但是,无论如何,我认为您可以使用上面的逻辑来测试您的提交事件。
    【解决方案4】:

    您可以尝试 onchange 事件处理程序(html),但是每次您尝试更改输入值时都会发生这种情况,我不知道这会如何影响性能。不过现在想不出更好的解决方案。示例:

    <input onchange="someFunc()">
    

    【讨论】:

    • 如果我已经可以在正在运行的函数中执行此操作,那将是一个很大的帮助。另外,我并不是要向 HTML 添加任何 onchange,我必须通过 eventListeners 来执行此操作(谢谢,这个想法很好)。
    • selectElement.addEventListener('change', (event) 我只是不知道如何将其写入上面的语法中...我知道这大致是我需要的,我只是不知道知道怎么做。
    • var element = document.getElementById("UserInput"); element.addEventListener("改变", someFunc());试试看,把它放在代码的顶部。
    • 我试过了,好像不行。控制台认为元素未定义。
    • 对不起:未捕获的类型错误:元素为空
    猜你喜欢
    • 2015-02-08
    • 2010-12-08
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多