【问题标题】:Phone mask for text field with regex带有正则表达式的文本字段的电话掩码
【发布时间】:2013-03-25 23:45:18
【问题描述】:

我正在使用此功能进行电话屏蔽,并且几乎可以完美运行。

function mask(o, f) 
{ 
    v_obj = o; 
    v_fun = f; 
    setTimeout("execmask()", 1) 
};

function execmask() 
{ 
    v_obj.value = v_fun(v_obj.value) 
};

function mphone(v){
    v=v.replace(/\D/g,"");           
    v=v.substring(0, 11);
    v=v.replace(/^(\d{2})(\d)/g,"(OXX$1) $2"); 
    v=v.replace(/(\d)(\d{4})$/,"$1-$2"); 
    return v;
}

这里我在文本字段中运行掩码:

<input type="text" id="phone" name="phone" onkeypress="mask(this, mphone);" onblur="mask(this, mphone);" />

问题是我需要把这部分代码(OXX$1)改成(0XX$1)

目前情况:

No. Of Digits Input Field
9 digit (OXX99) 99999-9999
8 digit (OXX99) 9999-9999

我需要的正确格式:

No. Of Digits Input Field
9 digit (0XX99) 99999-9999
8 digit (0XX99) 9999-9999

8位或9位的数量是用户的选择。

O 更改为0,会导致掩码出错。

【问题讨论】:

标签: javascript regex mask


【解决方案1】:
function mask(o, f) {
    setTimeout(function () {
        var v = f(o.value);
        if (v != o.value) {
            o.value = v;
        }
    }, 1);
}

function mphone(v) {
    var r = v.replace(/\D/g,"");
    r = r.replace(/^0/,"");
    if (r.length > 10) {
        // 11+ digits. Format as 5+4.
        r = r.replace(/^(\d\d)(\d{5})(\d{4}).*/,"(0XX$1) $2-$3");
    }
    else if (r.length > 5) {
        // 6..10 digits. Format as 4+4
        r = r.replace(/^(\d\d)(\d{4})(\d{0,4}).*/,"(0XX$1) $2-$3");
    }
    else if (r.length > 2) {
        // 3..5 digits. Add (0XX..)
        r = r.replace(/^(\d\d)(\d{0,5})/,"(0XX$1) $2");
    }
    else {
        // 0..2 digits. Just add (0XX
        r = r.replace(/^(\d*)/, "(0XX$1");
    }
    return r;
}

http://jsfiddle.net/BBeWN/

【讨论】:

  • 好的,太好了。谢谢!但是我忘了指定一个细节:如果手机有8位,格式应该是这样的:(0XX99)9999-9999 如果手机有9位,看起来是这样的:(0XX99)99999-9999 8的数量或9位是用户的选择。我应该如何更改此功能?感激不尽
  • 我建议只在第一个字符之后开始使用掩码,因为我们可以清除整个值。我还建议仅在r.length &gt; 6 时添加-,因此逐个字符(退格)删除字符将保持此功能正常工作。
【解决方案2】:

我做了一些改动:

  1. 我将事件更改为 keyup(除了 keypress 已被弃用的事实之外),因为 keypress 总是使用少一个字符的字符串,并且我还需要 onblur,这是 keyup 不会发生的事情。需要调整代码来解决此问题
  2. 以及“-”的问题,当尝试使用退格键删除它时,它总是返回。

fiddle

  function mascaraFone(event) {
    var valor = document.getElementById("telefone").attributes[0].ownerElement['value'];
    var retorno = valor.replace(/\D/g, "");
    retorno = retorno.replace(/^0/, "");
    if (retorno.length > 10) {
      retorno = retorno.replace(/^(\d\d)(\d{5})(\d{4}).*/, "($1) $2-$3");
    } else if (retorno.length > 5) {
      if (retorno.length == 6 && event.code == "Backspace") { 
        // necessário pois senão o "-" fica sempre voltando ao dar backspace
        return; 
      } 
      retorno = retorno.replace(/^(\d\d)(\d{4})(\d{0,4}).*/, "($1) $2-$3");
    } else if (retorno.length > 2) {
      retorno = retorno.replace(/^(\d\d)(\d{0,5})/, "($1) $2");
    } else {
      if (retorno.length != 0) {
        retorno = retorno.replace(/^(\d*)/, "($1");
      }
    }
    document.getElementById("telefone").attributes[0].ownerElement['value'] = retorno;
  }
&lt;input id="telefone" onkeyup="mascaraFone(event)" /&gt;

【讨论】:

    【解决方案3】:

    我喜欢这个功能,我一直在使用它。如果有人需要,我已经添加了另外 2 个面具。我知道他们不会直接回答这个问题,但它们非常有用。

    //Social Security Number for USA
     function mssn(v) {
        var r = v.replace(/\D/g,"");
        r = r.replace(/^0/,"");
        if (r.length > 9) {
            r = r.replace(/^(\d\d\d)(\d{2})(\d{0,4}).*/,"$1-$2-$3");
            return r;
        }
        else if (r.length > 4) {
            r = r.replace(/^(\d\d\d)(\d{2})(\d{0,4}).*/,"$1-$2-$3");
        }
        else if (r.length > 2) {
            r = r.replace(/^(\d\d\d)(\d{0,3})/,"$1-$2");
        }
        else {
            r = r.replace(/^(\d*)/, "$1");
        }
        return r;
    }
    
    //USA date
    function mdate(v) {
       var r = v.replace(/\D/g,"");
       if (r.length > 4) {
        r = r.replace(/^(\d\d)(\d{2})(\d{0,4}).*/,"$1/$2/$3");
       }
       else if (r.length > 2) {
        r = r.replace(/^(\d\d)(\d{0,2})/,"$1/$2");
       }
       else if (r.length > 0){
             if (r > 12) {
               r = "";
             }
       }
       return r;
    }
    

    【讨论】:

    • 这不是 OP 问题的答案。
    • 真的。我只知道它对我真的很有用,我真的不知道在哪里添加这些
    • @NicolasGiszpencn 不妨写一篇关于这些功能的博文分享一下?
    • 我没有博客。我的提交在 StackOverflow 中是否有一个位置,这基本上是以前 [有些相关] 提交的附加组件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2015-09-17
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多