javascript - 如何获得所有文本框的焦点?使用 javascript 事件而不是使用 jquery

标签 javascript events this focusout focusin

Hello Guys, I need help a little bit. Can anyone help me, how to use this keyword in my case?

<form>
    <div class="form-group">
        <label for="txtFirstName">Your name</label>
        <input id="txtFirstName" name="txtFirstName" type="text" autocomplete="off" class="inputBox" />
    </div>              
    <div class="form-group">
        <label for="txtEmail">Email address</label>
        <input id="txtEmail" name="txtEmail" type="email" autocomplete="off" class="inputBox" />
    </div>
    <div class="form-group">                            
        <select id="drpPosition" name="drpPosition">
            <option>I would describe my user type as </option>
            <option>Web developer </option>
            <option>Web designer </option>
        </select>
    </div>
    <div class="form-group">
        <label for="txtPassword">Password</label>
        <input id="txtPassword" type="password" class="cool" autocomplete="off" class="inputBox" />
        <small>Minimum 8 characters</small>
    </div>       
    <div class="form-group">
        <input type="submit" name="btnSubmit" id="btnSubmit" value="Next" />
    </div>
</form>

This is my JavaScript Code:

var inputFirstName = document.querySelector('.inputBox');
console.log(inputFirstName);
this.addEventListener('focusin', inputAddClassFunc);
this.addEventListener('focusout', inputRemoveClassFunc);

function inputAddClassFunc(event){ 
    console.log(this);     
    this.previousElementSibling.classList.add('active');    
}
function inputRemoveClassFunc(event){    
    var hasValue = this.value;    
    if(!hasValue) {
        this.previousElementSibling.classList.remove('active');
    }    
}

When I focusin into the textbox, active class will be added to it's sibling's lable And in my case, It only works in first textbox but not for all textbox. How can I use "this" to works for all textbox?

最佳答案

我会使用事件委托(delegate) - 将 focusinfocusout 监听器添加到表单中,并且当事件触发时,如果事件的目标是其中之一.inputBoxes,执行更改 event.target.previousElementSibling 的类的逻辑:

const form = document.querySelector('form');
form.addEventListener('focusin', inputAddClassFunc);
form.addEventListener('focusout', inputRemoveClassFunc);

function inputAddClassFunc(event) {
  if (event.target.matches('.inputBox')) {
    event.target.previousElementSibling.classList.add('active');
  }
}

function inputRemoveClassFunc(event) {
  if (event.target.matches('.inputBox')) {
    var hasValue = event.target.value;
    if (!hasValue) {
      event.target.previousElementSibling.classList.remove('active');
    }
  }
}
.active {
  background-color: yellow;
}
<form>
  <div class="form-group">
    <label for="txtFirstName">Your name</label>
    <input id="txtFirstName" name="txtFirstName" type="text" autocomplete="off" class="inputBox" />
  </div>
  <div class="form-group">
    <label for="txtEmail">Email address</label>
    <input id="txtEmail" name="txtEmail" type="email" autocomplete="off" class="inputBox" />
  </div>
  <div class="form-group">
    <select id="drpPosition" name="drpPosition">
      <option>I would describe my user type as </option>
      <option>Web developer </option>
      <option>Web designer </option>
    </select>
  </div>
  <div class="form-group">
    <label for="txtPassword">Password</label>
    <input id="txtPassword" type="password" autocomplete="off" class="inputBox" />
    <small>Minimum 8 characters</small>
  </div>
  <div class="form-group">
    <input type="submit" name="btnSubmit" id="btnSubmit" value="Next" />
  </div>
</form>

另请注意,如果您希望 txtPassword 元素具有 inputBox 类,则应更改

<input id="txtPassword" type="password" class="cool" autocomplete="off" class="inputBox" />

<input id="txtPassword" type="password" autocomplete="off" class="inputBox" />

(删除重复的 cool 属性)

关于javascript - 如何获得所有文本框的焦点?使用 javascript 事件而不是使用 jquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59798308/

相关文章:

javascript - 如何只选择特定父级下的一个div

javascript - 从 Javascript 查找 HTML 元素像素尺寸

javascript - select2 multiple 防止其他输入在输入时提交表单

javascript - 如果 deviceready 事件已经触发,我如何检查 cordova 是否准备就绪?

PHP: `array(&$this)` 是什么意思?

javascript - 如何将按钮高度设置为视口(viewport)高度

c# - 没有调用的C#事件

javascript - ionicPopup 完成加载后运行代码/事件?

c# - Stylecop 告诉我添加这个关键字,但它是多余的 - 对性能有影响吗?

c++ - 将对象的 'this'指针更改为指向不同的对象