2013-06-20 3 views
1

Я пытаюсь создать поле, которое добавляет тире к числу, так что оно принимает форму номера телефона. Он добавляет тире, но если пользователь пытается вернуться обратно к началу, он не позволяет пользователю удалять тире. Ну, он удаляет его, но затем тире повторно заполняется.Backspace не удаляет тире

JavaScript, который позволяет только номера с исключениями, которые я в настоящее время с помощью:

function forceNumber(e) { 
    var keyCode = e.keyCode ? e.keyCode : e.which; 
    if((keyCode < 48 || keyCode > 58) && keyCode != 8 && keyCode != 188 && keyCode != 189) { 
     return false; 
    } 
    return true; 
} 

The JS, которая создает черточки:

function addDashes(n){ 
    n = n.replace(/,/g, ""); 
    var s=n.split('.')[1]; 
    (s) ? s="."+s : s=""; 
    n=n.split('.')[0]; 
    if(n.length == 3 || n.length == 7 || n.length == 13){ 
     s="-" 
    } 
    return n+s; 
} 

И PHP/HTML вызовов (Я не уверен, что если право выравнивания может быть причиной):

<p id="phone_number"> 
    <label for="phone_number"><?php _e('Phone Number','mydomain') ?><br /> 
     <input type="text" name="phone_number" id="phone_number" class="input" size="25" style="text-align:right" onkeypress="return forceNumber(event);" onkeyup="this.value=addDashes(this.value);"/> 
</p> 

ответ

0

Простое изменение в вашем HTML Я изменил эту строку, чтобы добавить информацию о событии:

<input ... onkeyup="this.value=addDashes(this.value, event);"/> 

в функции addDashes я изменил подпись принять событие и добавил, если обрабатывать забой

function addDashes(n, ev){ 
    // ... 
} 

Однако я заметил более фундаментальную проблему с вашим методом. Если кто-то вставляет символ, он нарушит логику. Так что если текст 123-45, и я вставляю число 6 между 2 & 3, результатом будет 1263-45.

Вот еще один подход к addDashes, который просто проверяет всю строку каждый раз.

function addDashes(n, ev){ 
    n = n.replace(/[^\d]/g, ""); 
    if (n.length > 3) { 
     n = insert(n, 3, '-'); 
     if (n.length > 7) { 
      n = insert(n, 7, '-'); 
      if (n.length > 13) { 
       n = insert(n, 13, '-'); 
      } 
     } 
    } 
    return n; 
} 

function insert(s1, index, s2) { 
    return s1.substring(0, index) + s2 + s1.substring(index); 
} 

Другие варианты дополнений, которые позволяют избежать условностей в пользу неуправляемого регулярного выражения.

function addDashes(n, ev){ 
    n = n.replace(/[^\d]/g, "") 
     .replace(/(\d{3}(?=\d))((\d{3}(?=\d))|(\d{0,3}$))((\d{4}(?=\d))|(\d{0,4}$))/, 
     function(m, $1, $2, $3, $4, $5, $6, $7) { 
      return (($1) ? $1 + '-' : m) + 
       (($3) ? $3 + '-' : $4) + 
       (($6) ? $6 + '-' : $7); 
     }); 
    return n; 
} 

Вы также можете настроить второй метод для выполнения различного форматирования, не беспокоясь о длинах строк. Например, вы можете изменить функцию замены вернуться в формате (ДДД) ддд-дддд

   return (($1) ? '(' + $1 + ') ' : m) + 
       (($3) ? $3 + '-' : $4) + 
       (($6) ? $6 + '-' : $7); 
+1

С последнего/регулярное выражение блока, как вы типа вы получаете следующее: '123-123',' 1231-231', '123-1231-2',' 123-1231-23', '123-1231-234'. Регулярное выражение может быть изменено на '/ (\ d {3} (? = \ D)) ((\ d {3} (? = \ D)) | (\ d {0,3} $)) ((\ d {4} (? = \ d)) | (\ d {0,4} $))/', и последняя конкатенация' return' может быть изменена на '(($ 6)? $ 6: $ 7)' to сделайте эту работу должным образом. – smerny

+0

Вы были правы в том, что проблема заключалась в том, что я делал (\ d {4} (? = \ D)) | (\ d {0,3} $)) вместо \ d {0,4}. Первоначально у меня было это, добавляя тире сразу после того, как они 4-го нажатия клавиши, вместо того, чтобы ждать пятого. Я не знаю, почему возвращение нужно изменить. Также я даже не поймал, что это касается телефонных номеров. Благодаря! –

+0

Работал! Благодаря! У меня не было времени попробовать все эти методы сегодня днем, но после того, как первый метод все же привел к появлению тире, я дал вашему методу выстрел, и он отлично работал. Черточка не возвращается! Спасибо! – Helena

0
if(n.length == 3 || n.length == 7 || n.length == 13){ 
    s="-" 
} 

Когда вы перешагиваете тире, длина равна 3, поэтому черта добавляется. Вы будете иметь, чтобы проверить, если последний ключ пользователь нажал в забой, как

var lastKeyIsBackspace; 
if(!lastKeyIsBackspace && (n.length == 3 || n.length == 7 || n.length == 13)){ 
    s="-"; 
} 

Затем проверьте, если ключ был забой в вашей ключевой обработчик:

function forceNumber(e) { 
    var keyCode = e.keyCode ? e.keyCode : e.which; 
    if((keyCode < 48 || keyCode > 58) && keyCode != 8 && keyCode != 188 && keyCode != 189) { 
     return false; 
    } 
    // check if the key was backspace (key code 8) 
    if (keyCode == 8) lastKeyIsBackspace = true; 
    else lasyKeyIsBackspace = false; 
    return true; 
} 
+0

'forceNumber' запускается' keypress', забой не вызывает 'keypress' – smerny

0

Вот как я бы это сделать. Одна вещь, которую я делаю, - удалить javascript из фактических элементов dom. Таким образом, ваш вклад будет выглядеть следующим образом:

<input type="text" name="phone_number" id="phone_number" class="input" size="25" style="text-align:right" /> 

UPDATE: так как я заметил, вы JQuery источников, и вы предпочитаете черточки, чтобы показать, до 4-го и 7-й цифры набираются.следующее должно быть хорошо для вас:

http://jsfiddle.net/3e9XE/8/

$(document).ready(function() { 
    $("#phone_number").on("keypress", function (e) { 
     var keyCode = e.keyCode ? e.keyCode : e.which; 
     if ((keyCode < 48 || keyCode > 58) && keyCode != 8 && keyCode != 188 && keyCode != 189) { 
      e.preventDefault(); 
     } 
    }) 
    .on("keyup", function (e) { 
     var str = this.value; 
     if (e.keyCode == 8) { 
      if ("-" == str.charAt(str.length - 1)) { 
       str = str.substring(0, str.length - 1); 
      } 
     } else { 
      str = str.replace(/\D/g, '') 
       .replace(/(\d{3})(.*)/, "$1-$2") 
       .replace(/(\d{3}-\d{3})(.*)/, "$1-$2"); 
     } 
     this.value = str; 
    }); 
}); 
+0

Смерни - спасибо. Он работает фантастически в скрипке, но когда я вызываю код в php-файле, он работает не так. Есть ли какая-то разница, которую мне нужно будет использовать при использовании этого .js-файла, который вызывается? Я попробовал этот точный код (первая реализация) здесь: http://jannus.org/wp-login.php?action=register, вызвав файл phoneNumber.js, созданный с тем, что вы предложили, и вызвал с кодом ... – Helena

+0

вот код, который был вызван с помощью: '$ phone_number = (isset ($ _POST ['phone_number']))? $ _POST ['phone_number']: ''; ?>

<метка для = "PHONE_NUMBER">
<тип ввода = "текст" имя = "PHONE_NUMBER "id =" phone_number "class =" input "size =" 25 "style =" text-align: right "/> Helena

+0

Мне нравится вторая и как черта появляется перед цифрами! Он выглядит великолепно, теперь мне просто нужно посмотреть, смогу ли я его реализовать. Я собираюсь попробовать ваше предложение чуть позже сегодня днем ​​и посмотреть, смогу ли я это сделать. Кстати, мне нужно изменить положение этого кода, чтобы использовать этот обертку? – Helena

Смежные вопросы