如何添加 类 专注于结帐和产品评论表单的输入?

How to add classes input focused on checkout and product review forms?

如果输入处于焦点或具有值,我想将 class 添加到所有输入父 .field div。例如在产品页面评论表或结帐页面发货表上。如果输入在焦点上,我会添加一个 "active" class,如果输入有一个值,我会添加 class "hasavalue."

当我尝试使用 jquery 时,产品页面评论表单输入或结帐页面输入没有任何反应。

这是我正在使用的jquery:

requirejs(['jquery'],function($){

   $(document).ready(function(){


    $('.field input').focus(function () {
        $(this).parent().parent().addClass('active');
    }).blur(function () {
        $(this).parent().parent().removeClass('active');
    });



    $('.field input').blur(function(){

        if ( $(this).val() ) {
              $(this).parent().parent().addClass('hasavalue');
        } else{
            $(this).parent().parent().removeClass('hasavalue');
        }

     });

  });
});

我需要使用敲除吗?如果是这样,我怎样才能将这个简单的 jquery 翻译成适用于 Magento 中的所有输入?

如果尚未加载字段,则需要委托事件处理程序。但是'focus'和'blur'不冒泡,所以需要用jQuery的.on('focusin').on('focusout')

$(document).ready(function() {

  $('body').on('focusin', '.field input', function() {

    $(this).closest('.field').addClass('active');

  }).on('focusout', '.field input', function() {

    let fieldDiv = $(this).closest('.field');
    fieldDiv.removeClass('active');
    // toggleClass eliminates need for if else, just put the test as second parameter, true adds class while false removes it
    fieldDiv.toggleClass('hasavalue', ($(this).val() !== ''));

  })


  // adding a field afterwards just for demonstration to show it still works
  $('<div class="field"><label>loaded after document ready</label><br><input></div>').appendTo('body')

});
/* just example for visual verification */

.field {
  padding: 1em;
  border: 1px solid white;
  background: orange;
}

.field.active {
  border: 1px solid black;
}

.field.hasavalue {
  background: green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!-- structure does not matter as long as there is an input inside .field -->
<div class="field">
  <input>
</div>
<div class="field">
  <div>
    <input>
  </div>
</div>
<div class="field">
  <div>
    <div>
      <div>
        <input>
      </div>
    </div>
  </div>
</div>