如何仅在使用 JavaScript 聚焦特定输入时显示 div 块?

How to show a div block only when a particular input is focused using JavaScript?

我尝试使用 JavaScript 中的 onfocus 函数在密码字段集中在 .php 文件中时显示块(使用 bootstrap 4 设计)但是当我点击密码字段时没有任何反应。

我尝试使用 jQuery 相同的代码,仍然没有结果。

var myInput = document.getElementById("password");
var letter = document.getElementById("letter");
var capital = document.getElementById("capital");
var number = document.getElementById("number");
var length = document.getElementById("length");

myInput.onfocus = function() {
  document.getElementById("message").style.display = "block";
}


myInput.onblur = function() {
  document.getElementById("message").style.display = "none";
}
<div class="form-group">
  <div class="input-group-prepend">
    <span class="input-group-text">
                        <i class="fa fa-key"></i>
                    </span>
    <input required type="password" class="form-control" placeholder="Password" name="password" id="password">
  </div>

  <div id="message">
    <p id="letter" class="invalid">A <b>lowercase</b> letter</p>
    <p id="capital" class="invalid">A <b>capital (uppercase)</b> letter</p>
    <p id="number" class="invalid">A <b>number</b></p>
    <p id="length" class="invalid">Minimum <b>8 characters</b></p>
  </div>

您的代码可能存在三个问题。

1) form-group div 没有关闭,所以你的浏览器可能有 mis-interpreted 代码,弄乱了它的结构。

2) 页面加载时,没有触发任何事件;所以默认情况下,您的 message div 将可见。当您关注 password 然后关注 un-focus 时,message 会消失。要解决此问题,请将 style="display: none;" 添加到您的 message div.

3) 最重要的是,您的脚本需要在文档加载后执行。您可以通过将所有脚本放在 JQuery document.ready 函数中轻松地做到这一点:

$(function(){
    //Do everything here. This function will only execute after the document is ready.
}

或者像我一样,将您的 script 标记放在页面的底部。这样,您的脚本将在页面的其余部分加载后加载。

这背后的原因很简单。当您的浏览器加载页面时,它会或多或少地一个接一个地加载每个元素。脚本一加载就执行。因此,如果您的脚本在 HTML 的其余部分加载之前运行,则不会发生任何事情。

<div class="form-group">
 <div class="input-group-prepend">
  <span class="input-group-text">
   <i class="fa fa-key"></i>
  </span>
  <input required type="password" class="form-control" placeholder="Password" name="password" id="password">
 </div>

 <div id="message" style="display: none;">
  <p id="letter" class="invalid">A <b>lowercase</b> letter</p>
  <p id="capital" class="invalid">A <b>capital (uppercase)</b> letter</p>
  <p id="number" class="invalid">A <b>number</b></p>
  <p id="length" class="invalid">Minimum <b>8 characters</b></p>
 </div>
 <script>
  // this is my javascript code
  var myInput = document.getElementById("password");
  var letter = document.getElementById("letter");
  var capital = document.getElementById("capital");
  var number = document.getElementById("number");
  var length = document.getElementById("length");

  myInput.onfocus = function() {
   document.getElementById("message").style.display = "block";
  }


  myInput.onblur = function() {
   document.getElementById("message").style.display = "none";
  }
 </script>
</div>

这应该可以解决问题:

const $ = (selector) => document.querySelector(selector);
const input = $('#password');
const message = $('.message');

input.addEventListener('focus', (e) => {
    message.style.display = 'block';
});

input.addEventListener('blur', (e) => {
    message.style.display = 'none';
});
.message {
    display: none;
}
<div class="form-group">
    <div class="input-group-prepend">
        <span class="input-group-text">
            <i class="fa fa-key"></i>
        </span>
        <input required type="password" class="form-control" placeholder="Password" name="password" id="password">
    </div>

    <div class="message">
        <p class="letter invalid">A <b>lowercase</b> letter</p>
        <p class="capital invalid">A <b>capital (uppercase)</b> letter</p>
        <p class="number invalid">A <b>number</b></p>
        <p class="length invalid">Minimum <b>8 characters</b></p>
    </div>
</div>