【问题标题】:"Ctrl+A" and "del" button aren't working with ssn validation input field“Ctrl+A”和“del”按钮不适用于 ssn 验证输入字段
【发布时间】:2021-09-22 13:46:24
【问题描述】:

在这个 jsfiddle 中,如果您尝试在输入字段中输入一些数字,则尝试“ctrl+A”并删除您输入的内容,或者尝试使用“del”(删除)按钮,预期不会发生删除内容的行为。关于为什么的任何想法?我觉得我需要告诉 replace() 方法中的正则表达式值不要包含“ctrl”(或 Mac 上的命令)或“del”,但我不确定如何实现。

jsfiddle:http://jsfiddle.net/eujzh10n/2/

<div id="u22" class="ax_text_field">
    <input id="u22_input" class="ssn" type="text" value="" data-label="ssn1" maxlength="11"/>
</div>
// SSN validation
// trap keypress - only allow numbers
$('input.ssn').on('keypress', function(event){
    // trap keypress
    var character = String.fromCharCode(event.which);
    if(!isInteger(character)){
        return false;
    }    
});

// checks that an input string is an integer, with an optional +/- sign character
function isInteger (s) {
    if(s === '-') return true;
   var isInteger_re     = /^\s*(\+|-)?\d+\s*$/;
   return String(s).search (isInteger_re) != -1
}

// format SSN 
$('input.ssn').on('keyup', function(){
   var val = this.value.replace(/\D/g, '');
   var newVal = '';
    if(val.length > 4) {
        this.value = val;
    }
    if((val.length > 3) && (val.length < 6)) {
        newVal += val.substr(0, 3) + '-';
        val = val.substr(3);
    }
    if (val.length > 5) {
        newVal += val.substr(0, 3) + '-';
        newVal += val.substr(3, 2) + '-';
        val = val.substr(5);
    }
    newVal += val;
    this.value = newVal;   
});

【问题讨论】:

  • hmm - 当我注释掉除“//format SSN”部分之外的所有内容时,我会遇到相同的行为。会不会是别的?
  • 是的 - 这是另一回事。这是因为您将输入替换为 newVal,这会清除用户所做的任何选择。

标签: javascript regex validation input


【解决方案1】:

在您的 keyup 处理程序中,仅当值已更改时才替换输入(使用 Ctrl-A 等不会)

// SSN validation
// trap keypress - only allow numbers
$('input.ssn').on('keypress', function(event){
    // trap keypress
    var character = String.fromCharCode(event.which);
    if(!isInteger(character)){
        return false;
    }    
});

// checks that an input string is an integer, with an optional +/- sign character
function isInteger (s) {
    if(s === '-') return true;
   var isInteger_re     = /^\s*(\+|-)?\d+\s*$/;
   return String(s).search (isInteger_re) != -1
}

// format SSN 
$('input.ssn').on('keyup', function(){
   var val = this.value.replace(/\D/g, '');
   var newVal = '';
   // I'm not sure what this is for, but it updates the field perhaps unnecessarily
//    if(val.length > 4) {
//        this.value = val;
//    }
    if((val.length > 3) && (val.length < 6)) {
        newVal += val.substr(0, 3) + '-';
        val = val.substr(3);
    }
    if (val.length > 5) {
        newVal += val.substr(0, 3) + '-';
        newVal += val.substr(3, 2) + '-';
        val = val.substr(5);
    }
    newVal += val;
    if (this.value != newVal) { // only update the field if its content has changed
        this.value = newVal;   
    }
});
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    /* display: none; <- Crashes Chrome on hover */
    -webkit-appearance: none;
    margin: 0; /* <-- Apparently some margin are still there even though it's hidden */
}
.error-border {
    border: 2px solid #dadada;
    border-radius: 7px;
}

.error-border:focus { 
    outline: none;
    border-color: #F00;
    box-shadow: 0 0 10px #F00;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="u22" class="ax_text_field">
    <input id="u22_input" class="ssn" type="text" value="" data-label="ssn1" maxlength="11"/>
</div>

【讨论】:

  • 谢谢,James - 它负责“全选”功能。关于如何让“删除”按钮按预期工作的任何想法?
  • 我觉得如果删除键被按下,我需要避免'keydown'功能......
  • Delete 对我有用,但如果您尝试在数字中间删除一些数字,光标会跳转。也许this question 有用。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多