【问题标题】:Adding new classes when user changes type [duplicate]用户更改类型时添加新类[重复]
【发布时间】:2020-01-21 08:34:37
【问题描述】:

我昨天发布了一个类似的问题并得到了一些有用的回复,但我现在遇到的问题略有不同。当用户在 UI 上更改 type 时,会将类添加到 html 元素(这只是在元素周围添加一个蓝色边框)。我没有收到任何错误消息,但它什么也没做。

document.querySelector(DOM.inputType).addEventListener('change', function() {
  if (usersInput.type === "Health") {
    document.querySelector('.input_type').className += " blue";
    document.querySelector('.input_activity').className += " blue";
    document.querySelector('.input_time').className += " blue";
    document.querySelector('.input_end').className += " blue";
    document.querySelector('.input_btn').className += " blue_btn";
  }
});
.blue {
  border: 2px solid blue !important;
}

.blue_btn {
  color: blue;
}
<div class="input">
  <select class="input_type" id="input_type" name="input_type" style="height:36px" placeholder="Type" required>
  </select>
  <input class="input_activity" type="text" name="activity" placeholder="What do you need to do?" size="60" style="height:32px" required>
  <select class="input_time" name="Time" style="height:36px" required>
    <option value="Start">Start</option>
  </select>
  <select class="input_end" name="end" style="height:36px" required>
    <option value="End">End</option>
  </select>
  <input class="input_btn" type="button" value="Submit!">
</div>

这是usersInput 的来源:

var usersInput = UICtrl.getInput();

这里是 'getInpu' 的来源:

return {
    getInput: function() {
        return {
            type: document.querySelector(DOMstrings.inputType).value,
            activity: document.querySelector(DOMstrings.inputActivity).value,
            startTime: document.querySelector(DOMstrings.inputStart).value,
            endTime: document.querySelector(DOMstrings.inputEnd).value
        };
    },
},

这些是从“类型”下拉菜单中选择的选项:

<select class="input_type" id="input_type" name="input_type" style="height:36px" placeholder="Type" required>
    <option value="">Type</option>
    <option value="health">Health</option>
    <option value="work">Work</option>
    <option value="leisure">Leisure</option>
</select>

请注意,我在论坛上检查过类似的问题,但我发现没有一个真正回答了我的问题。提前感谢您的支持!

【问题讨论】:

  • DOM.inputType 不存在
  • 使用.classList.add('blue') 代替.className += " blue" 并将document.querySelector(DOM.inputType) 修复为@Gerard 警告。
  • DOM.inputType 包含用户输入的 DOM 字符串“类型”。我没有包含所有的 Javascript 代码,否则我的帖子会很长!
  • @BraDev 我已经实施了您建议的更改,但仍然不起作用?还有其他想法吗? DOM.inputType 包含用户输入的类型
  • @PaulBailey dns_nx 对我所说的做了一个完整的回答。

标签: javascript html css


【解决方案1】:

这应该可以满足您的需求,但这取决于您的&lt;option&gt;&lt;select&gt; 元素中的外观。 在我的示例中,它们看起来像这样。但我只是假设这一点,因为原始帖子中的这些信息:

<option value="">Please select</option>
<option value="Health">Health</option>
<option value="Soemthing">Soemthing</option>

在下面的代码中,我使用

检查&lt;option&gt; 的值
...      
if (this.value === "Health") {
...

但您也可以使用

检查 &lt;option&gt; 值的文本
...
if (this.options[this.selectedIndex].text == "Health") {
...

查看并检查代码

var element = document.getElementById('input_type');
if(element !== null) {
  element.addEventListener('change', function() {
    if (this.value === "Health") {
      document.querySelector('.input_type').classList.add('blue');
      document.querySelector('.input_activity').classList.add('blue');
      document.querySelector('.input_time').classList.add('blue');
      document.querySelector('.input_end').classList.add('blue');
      document.querySelector('.input_btn').classList.add('blue');
    }
    else {
    	document.querySelector('.input_type').classList.remove('blue');
      document.querySelector('.input_activity').classList.remove('blue');
      document.querySelector('.input_time').classList.remove('blue');
      document.querySelector('.input_end').classList.remove('blue');
      document.querySelector('.input_btn').classList.remove('blue');
    }
  });
}
.blue {
    border: 2px solid blue !important;
}

.blue_btn {
    color: blue;
}
<div class="input">
  <select class="input_type" id="input_type" name="input_type" style="height:36px" placeholder="Type" required>
    <option value="">Please select</option>
    <option value="Health">Health</option>
    <option value="Soemthing">Soemthing</option>
  </select>
  <input class="input_activity" type="text" name="activity" placeholder="What do you need to do?" size="60" style="height:32px" required>
  <select class="input_time" name="Time"  style="height:36px" required>
    <option value="Start">Start</option>
  </select>
  <select class="input_end" name="end" style="height:36px" required>
    <option value="End">End</option>
  </select>
  <input class="input_btn" type="button" value="Submit!">
</div>

【讨论】:

  • 不幸的是,这对我不起作用!还是什么都不做
  • 请查看我的编辑
  • 如果答案解决了您的问题,请不要忘记将其标记为答案。谢谢!
【解决方案2】:

这是因为没有像usersInput 这样的东西。 usersInput 未定义,因此无法匹配您的 if 条件,这就是它不起作用的原因。为了获得用户选择的值,您可以使用this.value。因此,您的代码需要在这里稍作调整。而不是这个

if (usersInput.type === "Health") {

改成这个

if (this.value === "Health") {

【讨论】:

  • 我将编辑我的帖子以解释“usersInput”的来源
  • 为什么不直接从事件的目标属性中获取参数?
【解决方案3】:

很难确切地说出问题出在哪里,因为我看不到你的 JS 的不同部分在哪里运行......但是,我最好的猜测是:

  1. 您的select 元素上的值设置不正确(您的选项在提供的HTML 中不可见,我假设它们是通过一些JS 添加的?)。您的选项需要具有“健康”值:
    <option value="Health">Health<option>
  1. 你打错电话了:
   var usersInput = UICtrl.getInput();

尝试将此函数作为事件侦听器中的第一行调用,这是因为您想在特定时间获取 DOM 状态:

document.querySelector(DOM.inputType).addEventListener('change', function() {
  var usersInput = UICtrl.getInput();

  if (usersInput.type === "Health") {
    document.querySelector('.input_type').className += " blue";
    document.querySelector('.input_activity').className += " blue";
    document.querySelector('.input_time').className += " blue";
    document.querySelector('.input_end').className += " blue";
    document.querySelector('.input_btn').className += " blue_btn";
  }
});
  1. DomStrings 对象属性或DOM.inputType 属性存在拼写错误。

【讨论】:

  • 好像把 var usersInput = UICtrl.getInput();在偶数侦听器功能中起作用。事件侦听器函数是否不遵循与闭包相同的规则?我以为这个内部函数可以访问外部函数变量?
  • 它确实可以访问这些变量,但是您的 usersInput.type 将是陈旧的,除非您在实际更改值时获得值(这是您在 getInput 方法中所做的) ,如果这有意义吗?
  • 我想我明白了....所以当事件监听函数被调用时(当用户'改变'值时)'getInput'函数被调用,因此,用户输入被检索。对吗?
  • 是的,正是:)
【解决方案4】:

在大家的帮助下我已经解决了!我应该使用usersInput.type 而不是usersInput.valuevar usersInput = UICtrl.getInput(); 也需要在事件侦听器函数中。我一直认为事件侦听器函数本质上是闭包,因此应该可以访问外部函数变量...也许我错了!

这是新的 JS 代码:

var element = document.getElementById('input_type');
if (element !== "Type") {
    element.addEventListener('change', function() {
        var usersInput = UICtrl.getInput();
        if (usersInput.type === "health") {
            document.querySelector('.input_type').classList.add('blue');
            document.querySelector('.input_activity').classList.add('blue');
            document.querySelector('.input_time').classList.add('blue');
            document.querySelector('.input_end').classList.add('blue');
            document.querySelector('.input_btn').classList.add('blue');
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2014-06-07
    • 2017-10-09
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多