使用jQuery和Masked Input插件进行电话号码掩码

31

我有一个问题,如何使用 jQuery 和 Masked Input Plugin 对电话号码进行掩码处理。

这里有两种可能的格式:

  1. (XX)XXXX-XXXX
  2. (XX)XXXXX-XXXX

是否有一种方法可以接受这两种情况并进行掩码处理?

编辑:

我尝试过:

$("#phone").mask("(99) 9999-9999"); 
$("#telf1").mask("(99) 9999*-9999");    
$("#telf1").mask("(99) 9999?-9999"); 

但它并不像我想要的那样工作。

最接近的是(xx)xxxx-xxxxx。

当我输入第十个数字时,我想得到(xx)xxxx-xxxx,当我输入第11个数字时,我想得到(xx)xxxxx-xxxx。这可能吗?


2
JHispa:请编辑您的答案,而不是将代码添加为评论。 - Ortiga
@JHispa 你在使用哪个插件? - Mike Perrenoud
Zoltan,我试过了,但不行。用这个方法,我得到的是(11) 11111-111而不是(11)xxxx-xxxx。 - JHispa
你是什么意思,Mike?我正在一个 HTML 表单上使用 jQuery。 - JHispa
请尝试使用 https://unmanner.github.io/imaskjs/。 - uNmAnNeR
显示剩余2条评论
15个回答

52

试试这个 - http://jsfiddle.net/dKRGE/3/

$("#phone").mask("(99) 9999?9-9999");

$("#phone").on("blur", function() {
    var last = $(this).val().substr( $(this).val().indexOf("-") + 1 );

    if( last.length == 3 ) {
        var move = $(this).val().substr( $(this).val().indexOf("-") - 1, 1 );
        var lastfour = move + last;
        var first = $(this).val().substr( 0, 9 );

        $(this).val( first + '-' + lastfour );
    }
});

@OscarJara 你可以在JSFiddle上进行测试。 - Zoltan Toth
+1 鼓励您的努力,但它所做的与插件所做的没有区别。$("#phone").mask("(999) 99999 - 999?9") - Ram
@Raminson - 有所不同。该掩码仍使最终数字为XXXXX-XXX,而不是XXXX-XXXX http://jsfiddle.net/dKRGE/8/ - Zoltan Toth
为什么用户需要按右键?他们怎么知道呢? - antiqe
可以通过插件实现,也可以实现自己的占位符,例如 $.mask.definitions['@']='[0-9 ]'; - lifecoder
显示剩余2条评论

26
这里是一个jQuery电话号码掩码,不需要插件。 格式可以根据您的需求进行调整。 更新的JSFiddle HTML
<form id="example-form" name="my-form">
    <input id="phone-number" name="phone-number" type="text" placeholder="(XXX) XXX-XXXX">
</form>

JavaScript

$('#phone-number', '#example-form')

.keydown(function (e) {
    var key = e.which || e.charCode || e.keyCode || 0;
    $phone = $(this);

    // Don't let them remove the starting '('
    if ($phone.val().length === 1 && (key === 8 || key === 46)) {
        $phone.val('('); 
        return false;
    } 
    // Reset if they highlight and type over first char.
    else if ($phone.val().charAt(0) !== '(') {
        $phone.val('('+$phone.val()); 
    }

    // Auto-format- do not expose the mask as the user begins to type
    if (key !== 8 && key !== 9) {
        if ($phone.val().length === 4) {
            $phone.val($phone.val() + ')');
        }
        if ($phone.val().length === 5) {
            $phone.val($phone.val() + ' ');
        }           
        if ($phone.val().length === 9) {
            $phone.val($phone.val() + '-');
        }
    }

    // Allow numeric (and tab, backspace, delete) keys only
    return (key == 8 || 
            key == 9 ||
            key == 46 ||
            (key >= 48 && key <= 57) ||
            (key >= 96 && key <= 105)); 
})

.bind('focus click', function () {
    $phone = $(this);

    if ($phone.val().length === 0) {
        $phone.val('(');
    }
    else {
        var val = $phone.val();
        $phone.val('').val(val); // Ensure cursor remains at the end
    }
})

.blur(function () {
    $phone = $(this);

    if ($phone.val() === '(') {
        $phone.val('');
    }
});

这并没有考虑到用户退格到输入的开头。它也不允许用户使用cmd+a或ctrl+a选择整个内容(以便删除或复制)。 - Joshua Soileau
更新了代码和fiddle,因此禁止一直使用退格键。 - Justin
1
@Cooleshwar - 这只是因为包含的jQuery版本太旧了。我将jQuery更新到v3.3.1,现在在IE 11中可以正常工作了。 - Justin
它运行得非常好。比添加新的依赖关系要好得多! - Nour Lababidi

5
你需要一个jQuery插件来实现遮罩效果。
-- HTML --
<input type="text" id="phone" placeholder="(99) 9999-9999">
<input type="text" id="telf1" placeholder="(99) 9999*-9999">
<input type="text" id="telf2" placeholder="(99) 9999?-9999">

-- JAVASCRIPT --

<script src="https://raw.githubusercontent.com/igorescobar/jQuery-Mask-Plugin/master/src/jquery.mask.js"></script>
<script>
$(document).ready(function($){
    $("#phone").mask("(99) 9999-9999"); 
    $("#telf1").mask("(99) 9999*-9999");    
    $("#telf2").mask("(99) 9999?-9999"); 
});
</script>

你的代码存在重大漏洞。不要直接从最新分支添加代码。他们可能会更新任何内容,并立即显示在你的网站上。版本控制是更好的方法,https://raw.githubusercontent.com/igorescobar/jQuery-Mask-Plugin/bb89c434e72030ce520764060f74b85b7ddce76e/dist/jquery.mask.min.js - Tim
他们说的完全相反。最新版本总是修复了上一个漏洞。现在大问题来了:先有鸡还是先有蛋? - Claudio Silva
不,你没有理解我的意思。这不是关于修复他们的漏洞的潜在风险,而是允许在你的网站上直接从库的作者处获取没有版本控制的代码。如果他们发布了一行恶意代码,你的网站就会崩溃。此外,如果他们的最新版本存在问题,你的网站也可能受到影响。这就是为什么使用有版本号的软件非常重要。 - Tim

5

实际上正确答案在http://jsfiddle.net/HDakN/

Zoltan的答案允许用户输入"(99) 9999",然后离开该字段未完成。

$("#phone").mask("(99) 9999-9999?9");


$("#phone").on("blur", function() {
    var last = $(this).val().substr( $(this).val().indexOf("-") + 1 );

    if( last.length == 5 ) {
        var move = $(this).val().substr( $(this).val().indexOf("-") + 1, 1 );

        var lastfour = last.substr(1,4);

        var first = $(this).val().substr( 0, 9 );

        $(this).val( first + move + '-' + lastfour );
    }
});​

4

您可以使用Inputmask v3与电话别名一起使用

$('#phone').inputmask({ alias: "phone", "clearIncomplete": true });

$(function() {
  $('input[type="tel"]').inputmask({ alias: "phone", "clearIncomplete": true });
});
<label for="phone">Phone</label>
    <input name="phone" type="tel">

<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@3.3.7/dist/inputmask/inputmask.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@3.3.7/dist/inputmask/inputmask.extensions.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@3.3.7/dist/inputmask/inputmask.numeric.extensions.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@3.3.7/dist/inputmask/inputmask.date.extensions.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@3.3.7/dist/inputmask/inputmask.phone.extensions.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@3.3.7/dist/inputmask/jquery.inputmask.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@3.3.7/dist/inputmask/phone-codes/phone.js"></script>

https://github.com/RobinHerbots/Inputmask#aliases


我开始使用这个插件。它的功能非常好,并且是最新的版本。感谢分享这个插件。 - vhugo

3

1
使用jquery.mask.js

http://jsfiddle.net/brynner/f9kd0aes/

HTML

<input type="text" class="phone" maxlength="15" value="85999998888">
<input type="text" class="phone" maxlength="15" value="8533334444">

JS

// Function
function phoneMask(e){
    var s=e.val();
    var s=s.replace(/[_\W]+/g,'');
    var n=s.length;
    if(n<11){var m='(00) 0000-00000';}else{var m='(00) 00000-00000';}
    $(e).mask(m);
}

// Type
$('body').on('keyup','.phone',function(){   
    phoneMask($(this));
});

// On load
$('.phone').keyup();

仅使用jQuery

http://jsfiddle.net/brynner/6vbrqe6z/

HTML

<p class="phone">85999998888</p>
<p class="phone">8599998888</p>

jQuery

$('.phone').text(function(i, text) {
    var n = (text.length)-6;
    if(n==4){var p=n;}else{var p=5;}
    var regex = new RegExp('(\\d{2})(\\d{'+p+'})(\\d{4})');
    var text = text.replace(regex, "($1) $2-$3");
    return text;
});

1
var $phone = $("#input_id");
var maskOptions = {onKeyPress: function(phone) {
    var masks = ['(00) 0000-0000', '(00) 00000-0000'];
    mask = phone.match(/^\([0-9]{2}\) 9/g)
        ? masks[1]
        : masks[0];
    $phone.mask(mask, this);
}};
$phone.mask('(00) 0000-0000', maskOptions);

0

最好的方法是使用change事件,像这样:

$("#phone")
.mask("(99) 9999?9-9999")
.on("change", function() {

    var last = $(this).val().substr( $(this).val().indexOf("-") + 1 );

    if( last.length == 3 ) {
        var move = $(this).val().substr( $(this).val().indexOf("-") - 1, 1 );
        var lastfour = move + last;
        var first = $(this).val().substr( 0, 9 ); // Change 9 to 8 if you prefer mask without space: (99)9999?9-9999

        $(this).val( first + '-' + lastfour );
    }
})
.change(); // Trigger the event change to adjust the mask when the value comes setted. Useful on edit forms.

0

在失去焦点时最好的方法是:

                        function formatPhone(obj) {
                        if (obj.value != "")
                        { 
                            var numbers = obj.value.replace(/\D/g, ''),
                            char = {0:'(',3:') ',6:' - '};
                            obj.value = '';
                            upto = numbers.length; 

                            if(numbers.length < 10) 
                            { 
                                upto = numbers.length; 
                            }
                            else
                            { 
                                upto = 10; 
                            }
                            for (var i = 0; i < upto; i++) {
                                obj.value += (char[i]||'') + numbers[i];
                            }
                        } 
                    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接