【问题标题】:How to change Phone number format in input as you type?如何在输入时更改输入中的电话号码格式?
【发布时间】:2013-08-01 13:11:59
【问题描述】:

我的 CodePen: http://codepen.io/leongaban/pen/cyaAL

我有一个电话号码输入字段,最多允许 20 个字符(国际号码)。

我还使用Josh BushMasked input jQuery plugin 来格式化输入中的电话号码,使其“漂亮”。



  • 我的问题是在电话是10位数或者 less,它应该使用 Masked 输入格式。

  • 但是,当电话号码超过 10 位时, 格式应该被删除。



这是我当前的:CodePen,手机是我尝试完成此操作的输入字段。工作电话是Mask input plugin 的默认功能的一个示例。

你会如何解决这个问题?

手机输入框的jQuery:

case '2':
    console.log('created phone input');
    $('.new_option').append(myphone);
    $('.added_mobilephone').mask('(999) 999-9999? 9');
    $('.added_mobilephone').keypress(function(event){

      if (this.value.trim().length > 10) {
        console.log('this.value = '+this.value.trim());
        console.log('greater then 10');
        $('.added_mobilephone').mask('99999999999999999999');
      }

      /*if (this.value.length < 9) {
        console.log(this.value);
        console.log('less then 10');
        $('.added_mobilephone').mask('(999) 999-9999? 9999999999');
      } else if (this.value.length > 9) {
        console.log(this.value);
        console.log('greater then 10');
        $('.added_mobilephone').mask('99999999999999999999');
      }*/
    });
    break;

【问题讨论】:

  • 你检查过这个问题了吗? stackoverflow.com/questions/2580550/… 从用户体验的角度来看,该问题检查表示国际#的框的方法也可能很好(在您当前的版本中,国际用户在最初使用默认的美国电话格式时可能会感到困惑)
  • 非常感谢您的链接!现在检查一下,看看我是否可以让它更好地工作
  • 谢谢。我能够让这个插件为我的表单输入工作:)
  • $("#pr_phone").inputmask("+9 999 999 9999", { onKeyValidation: function (key, result) { } });我已经像这个例子一样添加了它。但我想为国家代码设置“+1”,这样任何人都无法更改它。请建议。谢谢。

标签: jquery input formatting phone-number maskedinput


【解决方案1】:
$("input[name='phone']").keyup(function() {
    $(this).val($(this).val().replace(/^(\d{3})(\d{3})(\d+)$/, "($1)$2-$3"));
});

这肯定会起作用,并且会立即正确处理填充完整字符串(例如,1234567890)。

/* example jquery use */

$("input[name='phone']").keyup(function() {
    $(this).val($(this).val().replace(/^(\d{3})(\d{3})(\d+)$/, "($1)$2-$3"));
});
/* use your css to beautify the form */
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!-- form input for example user -->
<form>
  <input type="text" name="phone" placeholder="Phone Number" />
</form>

【讨论】:

  • 我希望我能投票 100 次。最佳解决方案。
【解决方案2】:

您可能已经解决了这个问题,但值得注意的是,其他任何需要对控件应用多个掩码的人都可能想探索这个inputmask plugin

它有更多回调、设置和许多开箱即用的掩码类型(请务必查看扩展文件)。您还可以为一个控件定义多个掩码,插件将尝试根据值应用适当的掩码。

Here is a fiddle演示上一条语句:

$(window).load(function()
{
   var phones = [{ "mask": "(###) ###-####"}, { "mask": "(###) ###-##############"}];
    $('#textbox').inputmask({ 
        mask: phones, 
        greedy: false, 
        definitions: { '#': { validator: "[0-9]", cardinality: 1}} });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.1.62/jquery.inputmask.bundle.js"></script>
<input type='text' id='textbox' />

【讨论】:

  • 我是否必须添加您通过 jsfiddle 共享的整个粘贴?
  • @KhanShahrukh 这是一种方法。我刚刚用一个包含输入掩码 CDN 的 sn-p 更新了答案。您应该在该捆绑包中拥有所需的一切。
  • 我知道这个答案已经过时了。 @Roop Kumar 在下面给出了更好的答案。
  • OP 询问如何在一个非常具体的库中执行此操作。我推荐的图书馆是他正在使用的一个分支。如果您需要做的只是格式化文本,那么 RoopKumars 答案更适合。正在使用的插件更重,但不仅仅是格式化文本。非常棒,我的最爱之一。如果您能够使用它,我仍然会推荐它。
  • $("#pr_phone").inputmask("+9 999 999 9999", { onKeyValidation: function (key, result) { } });我已经像这个例子一样添加了它。但我想为国家代码设置“+1”,这样任何人都无法更改它。请建议。谢谢。
【解决方案3】:

这很有帮助,我只添加了一些代码以使其在用户删除某些字符时起作用,我提供了仅输入数字和最大长度的选项。这对我有用:)

$(document).ready(function(){
  /***phone number format***/
  $(".phone-format").keypress(function (e) {
    if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
      return false;
    }
    var curchr = this.value.length;
    var curval = $(this).val();
    if (curchr == 3 && curval.indexOf("(") <= -1) {
      $(this).val("(" + curval + ")" + "-");
    } else if (curchr == 4 && curval.indexOf("(") > -1) {
      $(this).val(curval + ")-");
    } else if (curchr == 5 && curval.indexOf(")") > -1) {
      $(this).val(curval + "-");
    } else if (curchr == 9) {
      $(this).val(curval + "-");
      $(this).attr('maxlength', '14');
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="phone-format"  type="text" placeholder="Phone Number">

【讨论】:

  • 这应该是最好的答案了。
  • 非常感谢。河流
  • 这在尝试擦除您所写的内容时效果不佳!
  • @Leti 非常感谢。
  • @BernieCarpio 非常感谢
【解决方案4】:

你的情况

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jasny-bootstrap/3.1.3/js/jasny-bootstrap.min.js"></script>

<input type="text" class="form-control" data-mask="(999) 999-9999">

带有jasny bootstrap插件

【讨论】:

    【解决方案5】:

    我尝试了一些非插件答案,但不幸的是,它们在编辑电话号码时产生了不良的副作用。这是我最终创建的一个简单的解决方案,并且没有特殊的外部 3rd 方库依赖项:

    • 不需要任何插件 --> 只需要 JS 和 JQuery
    • 自动过滤掉非数字(即噪音)
    • 删除数字时向左移动电话号码数字
    • 保持格式/删除时不会崩溃
    • 如果没有任何变化,则不执行任何操作,例如允许光标向左/向右移动以进行更改,而不是其他将光标固定在末尾的解决方案

    CAVEAT:考虑的电话号码只是北美,在我的情况下这很好,因为这是用于加拿大当地社区足球注册的。

    $("input[name='phone_num']").keyup(function() {
      var val_old = $(this).val();
      var val = val_old.replace(/\D/g, '');
      var len = val.length;
      if (len >= 1)
        val = '(' + val.substring(0);
      if (len >= 3)
        val = val.substring(0, 4) + ') ' + val.substring(4);
      if (len >= 6)
        val = val.substring(0, 9) + '-' + val.substring(9);
      if (val != val_old)
        $(this).focus().val('').val(val);
    });
    

    【讨论】:

    • 我希望我能投票 1000 次。谢谢@nikolaosinlight,这是完美的。
    【解决方案6】:

    输入类型文本以输入类型电话号码。最大长度,使用 jquery 的占位符。

    // Used to format phone number and add placeholder and max-length
    function phoneFormatter() {
     $(' input[type="text"]').attr({ placeholder : '(___) ___-____' });
      $('input[tabindex="111"]').on('input', function() {
        var number = $(this).val().replace(/[^\d]/g, '')
        if (number.length == 7) {
          number = number.replace(/(\d{3})(\d{4})/, "$1-$2");
        } else if (number.length == 10) {
          number = number.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
         
        }
        $(this).val(number)
        $('input[type="text"]').attr({ maxLength : 10 });
        
      });
    };
    
    $(phoneFormatter);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" name="input_111[]" value="" tabindex="111">

    【讨论】:

    • 在jQuery之上轻松维护在页面中
    • 完美!这就是我要找的东西。 ?
    【解决方案7】:

    检查以下答案。

    我为 TSP 代码(我的项目之一)创建,但类似的结构适用于电话号码。解决方案相当简单。
    我正在将 KeyCode 用于以下解决方案。更多关于密钥代码的信息可以在here找到。

     $(function () {
        $('#txtphonenumber').keydown(function (e) {
        var key = e.charCode || e.keyCode || 0;
        $text = $(this); 
           if (key !== 8 && key !== 9) {
              if ($text.val().length === 3) {
                 $text.val($text.val() + '-');
              }
              if ($text.val().length === 7) {
                 $text.val($text.val() + '-');
              }
           }
           return ((key >= 48 && key <= 57) || (key >= 96 && key <= 105) || key == 46 || key == 8 || key == 9 );
          // KeyCode from 48 to 57 are the Numeric characters
          // KeyCode from 96 to 105 are the numpad 0 to numpad 9
          // KeyCode delete 46
          // KeyCode backspace 8
          // KeyCode tab 9
      })
    });
    

    【讨论】:

      【解决方案8】:

      这是我的解决方案(适用于美国号码),在您输入时可以使用

      const maskPhoneNumber = (s) => {
        let o = '';
        o += s.length >= 3 ? `(${s.substring(0, 3)}` : s;
        o += s.length >= 4 ? `) ${s.substring(3, 6)}` : s.substring(3);
        o += s.length >= 7 ? `-${s.substring(6)}` : '';
        return o;
      };
      

      【讨论】:

        【解决方案9】:

        与上述类似的解决方案,但在此脚本中,格式是在用户输入的同时应用的。 在电话号码中添加掩码 - 巴西电话格式 (00) ?0000-0000。 它也可以对其他人有所帮助。

            //Add mask (00) ?0000-0000 in the phone number - Brazil Format
            $('#iTel').on("keyup blur", function(e){
            	var v = $(this).val();
            	v = v.replace(/[^\d]/g,'');
            	if(v.length < 6){
            		v = v.replace(/(\d{2})/, '($1) ');
            	}else if(v.length < 10){
            		v = v.replace(/(\d{2})(\d{4})/, '($1) $2-');
            	}else if(v.length < 11){
            		v = v.replace(/(\d{2})(\d{4})(\d{4})/, '($1) $2-$3');				
            	}else {
            		v = v.replace(/(\d{2})(\d{5})(\d{4})/, '($1) $2-$3');
            	}
            $(this).val(v);		
               });
            <!DOCTYPE html>
             <html lang="en">
             <head>
               <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
            </head>
            <body>
            <form method="post" id="cadForm" action="incluir.php">
            <div class="form-row">
             <div class="form-group col-md-12">
            	<label for="iTel" class="col-form-label">Phone</label>
            	<div class="input-group">
            	<span class="input-group-addon"><i class="fa fa-phone" aria-hidden="true"></i></span>
            	<input type="text" class="form-control" name="iTel" id="iTel" maxlength="15" placeholder="(xx) ?xxxx-xxxx..." pattern="[(][0-9]{2}[)][\s][0-9]{4,5}[-][0-9]{4}$" title="Please, type only number: (00) ?0000-0000">
            	</div>			
            </div>
              </body>
             </html>

        【讨论】:

          【解决方案10】:

          如果只想保留数字,请扩展至Roop Kumar 回答

          比添加 replace(/\D/g,'')

          $(this).val($(this).val().replace(/\D/g,'').replace(/^(\d{3})(\d{3})(\d+)$/, "($1)$2-$3"));
          

          希望有帮助

          【讨论】:

            猜你喜欢
            • 2022-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-12
            • 1970-01-01
            相关资源
            最近更新 更多