【问题标题】:How to use JQuery InputMask with HTML pattern如何使用带有 HTML 模式的 JQuery InputMask
【发布时间】:2017-05-05 13:58:32
【问题描述】:

我有电话号码的 HTML 输入框。

我在输入时使用InputMask 来格式化输入8600000008 600 00 000 之后。

$(window).load(function()
{
   var phones = [{ "mask": "# ### ## ###"}, { "mask": "# ### ## ###"}];
    $('#phone').inputmask({ 
        mask: phones, 
        greedy: false, 
        definitions: { '#': { validator: "[0-9]", cardinality: 1}} });
});

我也在使用 HTML 模式来检查数字是否以 86 开头并且总共有 9 位数字,但是 InputMask 它停止工作,并且无法以任何方式实现它:

<label for="phone" class="first-col">Mobile No.:</label>
<input type="text" id="phone" placeholder="8 600 00 000" required pattern="(86)\d{7}" />

如果有效,CSS 会添加绿色边框:

input:required:valid {
    box-shadow: 0 0 5px #5cd053;
    border-color: #28921f;
}

你有什么想法吗?

JS Fiddle

【问题讨论】:

    标签: javascript jquery html regex input-mask


    【解决方案1】:

    你使用的掩码正在格式化输入值,所以如果你写一个数字,它将使用这个掩码进行格式化,这意味着它将不再匹配你的模式。

    解决方案:

    所以你只需要编辑你的模式Regex,让它匹配新的格式化值,所以使用(8 6)\d{2} \d{2} \d{3}作为模式:

    <input type="text" id="phone" placeholder="8 600 00 000" required pattern="(8 6)\d{2} \d{2} \d{3}" />
    

    演示:

    这是一个有效的 sn-p:

    input:required:valid {
    	box-shadow: 0 0 5px #5cd053;
    	border-color: #28921f;
    }
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.1.62/jquery.inputmask.bundle.js"></script>
    <script> 
    $(window).load(function()
    {
       var phones = [{ "mask": "# ### ## ###"}, { "mask": "# ### ## ###"}];
        $('#phone').inputmask({ 
            mask: phones, 
            greedy: false, 
            definitions: { '#': { validator: "[0-9]", cardinality: 1}} });
    });
    </script>
    <label for="phone" class="first-col">Mobile No.:</label>
    <input type="text" id="phone" placeholder="8 600 00 000" required pattern="(8 6)\d{2} \d{2} \d{3}" />

    这是updated working Fiddle

    【讨论】:

      【解决方案2】:

      无需使用RegEx

      该插件提供了一种使用data-inputmask 属性在元素本身上添加掩码的方法。在掩码值中9 将匹配任何数字,而86 将仅匹配这些数字。通过使用它,我们可以满足以下条件。

      在 HTML 中添加:

      <input id="phone" data-inputmask="'mask': '8 699 99 999'" />
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      

      掩码8 699 99 999 将匹配以86 开头后跟任意七位数字的数字。

      在 JavaScript 中,添加:

      $('#phone').inputmask();
      

      就是这样!

      $(document).ready(function() {
        $('#phone').inputmask();
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.1.62/jquery.inputmask.bundle.js"></script>
      <input id="phone" data-inputmask="'mask': '8 699 99 999'" />

      【讨论】:

        【解决方案3】:

        您必须使用keyup 事件和regex,如下所示
        无需使用库

        document.getElementById("phone").addEventListener("keyup", function(){
            // restart the match
            this.value = this.value.replace(/\s/g, "");
            // Assess the amount needed
            var v = this.value.match(/(\d)(\d{1,3})?(\d{1,2})?(\d+)?/);
            if(v){
              // Save the desired value depending on its existence
              v =  (v[1]?v[1]+(v[2]?" "+v[2]+(v[3]?" "+v[3]+(v[4]?" "+v[4]:""):""):""):"");
              // and yea!
              this.value = v;
            }
        });
        &lt;input  type="text" id="phone" placeholder="8 600 00 000" required onkeypress='return event.charCode &gt;= 48 &amp;&amp; event.charCode &lt;= 57 &amp;&amp; this.value.length &lt; 12' pattern="\b86" title="description" value="8 6"/&gt;

        【讨论】:

        • 谢谢你的回答,但是点击按钮后会更新,我需要在直接输入时实现它,而不需要按下按钮。
        • 您可以添加 onkeyup 事件并在那里完成工作,而不是在表单提交上
        • @avrilalejandro 最好加个解释。
        • 很好,但我认为这段代码在尝试删除输入的字符时存在问题。 :)
        猜你喜欢
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 2014-05-02
        • 2015-07-28
        • 2011-07-30
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多