【问题标题】:Dynamically initialise multiple input fields in plugin在插件中动态初始化多个输入字段
【发布时间】:2019-11-05 01:00:46
【问题描述】:

我在一页上有很多表格。每个表格都应该有一个电话号码字段。这些字段由 JS plug-in 驱动。

所以我得到了大量应该正确初始化的字段。 如果我手动完成,我会得到: 表单*电话输入字段=初始化次数。

目前我只有第一个现场工作。其他没有初始化。

我的标记看起来像

<input type="tel" class="phone_flag" name="phone_tab1[main]" required="">
<input type="tel" class="phone_flag" name="phone_tab2[main]" required="">
<input type="tel" class="phone_flag" name="phone_tab3[main]" required="">
xxx
...

我得到了一条建议:为了正常工作,我应该有 querySelectorAllforEach 循环。然后我应该调用PhoneDisplay 函数,不要传递类名,而是传递元素本身。然后,直接在该元素上初始化插件。

我只是来到了这个解决方案,但它只初始化了第一个元素。

JS 初始化代码

   document.querySelectorAll('.phone_flag').forEach(el => { 
        PhoneDisplay(el.className);     
    });

    function PhoneDisplay(ClassName){

      var input = document.querySelector('.' + `${ClassName}`);   
      var iti = window.intlTelInput(input, {
          hiddenInput: "full",
          initialCountry: "auto",
          geoIpLookup: function(callback) {
            $.get('proxy.php', function() {}).always(function(resp) {
              var countryCode = (resp && resp.country) ? resp.country : "";
              callback(countryCode);
            });
          },    
          hiddenInput: "full_phone",
          utilsScript: "intlTelInput/js/utils.js"
      });

        var reset = function() {
          input.classList.remove("error");
          errorMsg.innerHTML = "";
          errorMsg.classList.add("hide");
          validMsg.classList.add("hide");
        };

        input.addEventListener('blur', function() {
          reset();
          if (input.value.trim()) {
            if (iti.isValidNumber()) {
              validMsg.classList.remove("hide");
            } else {
              input.classList.add("error");
              var errorCode = iti.getValidationError();
              errorMsg.innerHTML = errorMap[errorCode];
              errorMsg.classList.remove("hide");
            }
          }
        });

        input.addEventListener('change', reset);
        input.addEventListener('keyup', reset);           
    }

【问题讨论】:

  • document.querySelector 返回第一个查询,因此您的 var input 始终是第一个输入。您应该只在 forEach 循环中传入元素本身:PhoneDisplay(el); 然后function PhoneDisplay(input) 并删除 'var input=' 行。
  • 谢谢!这部分有效,但有一个问题:验证部分不起作用。有什么线索吗?
  • 您在控制台中遇到什么错误?

标签: javascript dynamic initialization jquery-selectors selector


【解决方案1】:

document.querySelector 返回第一个查询,因此var input 始终是第一个输入。您应该只在 forEach 循环中传入元素本身:PhoneDisplay(el); 然后function PhoneDisplay(input) 并删除“var input=”行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多