2015-05-05 5 views
2

У меня есть поле ввода в теле моего документа, и мне нужно отформатировать его как пользовательский тип. Он должен иметь скобки вокруг кода области и тире между тремя и четырьмя цифрами после этого.Отформатируйте номер телефона как пользовательский тип с использованием чистого JavaScript

Ex: (123) 456 - 7890

В пользовательских типов он должен выглядеть примерно так:

(12
(123)
(123) 456
(123) 456 - 78
(123) 456 - 7890

+0

Если вам необходимо применять эту конвенцию, а не играть вокруг с тем, что они печатая, рассмотреть вопрос о предоставлении пользователю 3 поля ввода, '() - ' с парой _placeholders_, чтобы дать им намеки о что писать (т.е.ваш '123 456 7890') –

+0

Чтобы добавить к чему @PaulS. сказал, даже лучше было бы позволить им входить в ценность, как им нравится, и, пока они ввели 10 цифр, автоформатируйте их ввод в желаемый формат, на 'blur' (или' change'. ваше предпочтение). Ex. Вход: ** 1234567890 ** или ** 123-456-7890 ** или ** 123 456!? @ # 7890 **. , , Вывод (во всех случаях): ** (123) 456 - 7890 ** – talemyn

ответ

13

Вы можете сделать это, используя быстрый JavaScriptфункция.

Если ваш HTML выглядит следующим образом:
<input type="text" id="phoneNumber"/>

Ваша функция JavaScript может быть просто:

// A function to format text to look like a phone number 
function phoneFormat(input){ 
     // Strip all characters from the input except digits 
     input = input.replace(/\D/g,''); 

     // Trim the remaining input to ten characters, to preserve phone number format 
     input = input.substring(0,10); 

     // Based upon the length of the string, we add formatting as necessary 
     var size = input.length; 
     if(size == 0){ 
       input = input; 
     }else if(size < 4){ 
       input = '('+input; 
     }else if(size < 7){ 
       input = '('+input.substring(0,3)+') '+input.substring(3,6); 
     }else{ 
       input = '('+input.substring(0,3)+') '+input.substring(3,6)+' - '+input.substring(6,10); 
     } 
     return input; 
} 

Конечно, вы будете нуждаться в прослушиватель событий:

document.getElementById('phoneNumber').addEventListener('keyup',function(evt){ 
     var phoneNumber = document.getElementById('phoneNumber'); 
     var charCode = (evt.which) ? evt.which : evt.keyCode; 
     phoneNumber.value = phoneFormat(phoneNumber.value); 
}); 

И если вы не сохраните телефонные номера в виде отформатированных строк (я не рекомендую это делать), вы захотите очистить нечисловой символ актеры перед отправкой значение что-то вроде:
document.getElementById('phoneNumber').value.replace(/\D/g,'');

Если вы хотите, чтобы увидеть это в действии с бонусом фильтрации входных данных, проверить эту скрипку:
http://jsfiddle.net/rm9vg16m/

+0

Вы должны хранить номера телефонов как _String_, да, это потребует больше памяти, но оно будет надежным в будущем, когда вы начнете нуждаться в номерах, начиная с, например. '0' или' + ' –

+0

@PaulS Я думаю, что он имел в виду _форматированную строку _... и я согласен с этим. Не нужно сохранять форматирование в базе данных (или где угодно). Это все еще строка, она просто не будет содержать символы '[(-]'. – canon

+2

Я действительно имел в виду форматированную строку. Я отредактировал ответ, чтобы отразить это. –

0

Я не фанат нарезка. Я бы посоветовал использовать .replace(), передать ему регулярное выражение, захватить фрагменты номера телефона и затем выводить его так, как вам нужно. Если вы можете читать регулярное выражение, это гораздо лучший программный способ подойти к проблеме, а мертвый просто изменить формат.

var phoneNumber = "1234567899"; 

var formatted = phoneNumber.replace(/(\d{1,2})(\d{1})?(\d{1,3})?(\d{1,4})?/, function(_, p1, p2, p3, p4){ 
    let output = "" 
    if (p1) output = `(${p1}`; 
    if (p2) output += `${p2})`; 
    if (p3) output += ` ${p3}` 
    if (p4) output += ` ${p4}` 
    return output; 
}); 

Примечание: Я не добавил каких-либо пробелов, не номер вскрыши, но вы можете добавить, что, как хорошо.

0

Чтобы добавить некоторую дополнительную легкость для пользователя, я бы фактически обновил строку, чтобы автоматически включать «)» или «-», когда пользователь достигает определенных символов, чтобы они не добавляли, скажем, две тире. (555) 555--5555

if(size === 0) { 
    input = input; 
} 
else if (size === 3) { 
    input = '('+input.substring(0,3)+') ' 
} 
else if (size < 4) { 
    input = '('+input; 
} 
else if (size === 6) { 
    input = '('+input.substring(0,3)+') '+input.substring(3,6)+' -'; 
} 
else if (size > 6) { 
    input = '('+input.substring(0,3)+') '+input.substring(3,6)+' - '+input.substring(6,10); 
} 
return input 
1

Ранее ответы не считают, что происходит, когда пользователь совершает ошибку и удаляет некоторые из введенных цифр.

Для тех, кто ищет решение jQuery, это переформатирует на каждом событии keyup и удаляет дополнительные символы и пробелы, когда пользователь редактирует номер.

$('#phone').keyup(function(e){ 
    var ph = this.value.replace(/\D/g,'').substring(0,10); 
    // Backspace and Delete keys 
    var deleteKey = (e.keyCode == 8 || e.keyCode == 46); 
    var len = ph.length; 
    if(len==0){ 
     ph=ph; 
    }else if(len<3){ 
     ph='('+ph; 
    }else if(len==3){ 
     ph = '('+ph + (deleteKey ? '' : ') '); 
    }else if(len<6){ 
     ph='('+ph.substring(0,3)+') '+ph.substring(3,6); 
    }else if(len==6){ 
     ph='('+ph.substring(0,3)+') '+ph.substring(3,6)+ (deleteKey ? '' : '-'); 
    }else{ 
     ph='('+ph.substring(0,3)+') '+ph.substring(3,6)+'-'+ph.substring(6,10); 
    } 
    this.value = ph; 
});