Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js退格并计算有多少位_Javascript_Onkeypress - Fatal编程技术网

Javascript js退格并计算有多少位

Javascript js退格并计算有多少位,javascript,onkeypress,Javascript,Onkeypress,我有这个代码来计算输入的数字 var tnnod=0; function telephone(e) { if (tnnod<10) { var key; var keychar; if (window.event) { key = window.event.keyCode; } else if (e) { key = e.which; }

我有这个代码来计算输入的数字

var tnnod=0;
function telephone(e) {
    if (tnnod<10) {
        var key;
        var keychar;

        if (window.event) {
            key = window.event.keyCode;
        }
        else if (e) {
            key = e.which;
        }
        else {
            return true;
        }
        keychar = String.fromCharCode(key);

if ((key==null) || (key==0) || (key==8) ||  (key==9) || (key==13) || (key==27) ) {
   return true;
}
else if ((("0123456789").indexOf(keychar) > -1)) {
    tnnod+=1;
   return true;
}
else if (keychar == "-") { 
  return true;
}
else
   return false;
}
    else
        return false
}
var tnnod=0;
功能电话(e){
如果(tnnod-1)){
tnnod+=1;
返回true;
}
如果(keychar==“-”){
返回true;
}
其他的
返回false;
}
其他的
返回错误
}
但是,如何在每次命中退格并且删除的字符是数字而不是“-”时从计数器中删除1呢

我已经试着让key==8做一些事情,但是由于某种原因,点击backspace并不会返回任何东西


有什么问题吗?

我认为计算这样的击键次数是个坏主意。我们说的是输入文本字段,对吗?如果用户从剪贴板粘贴一些字符串,您会怎么做?如果他用鼠标标记一些文本并删除它呢?用一个字符替换它

我认为只从文本字段中查看文本并(如果必要)进行一些修改以确保正确的语法会更有意义。让用户输入他想要的任何内容,如果您发现垃圾字符,您可以将文本替换为不包含这些字符的文本。此时还可以修剪字段(无前导空格或尾随空格)。此外,准确跟踪长度变得很容易,就像询问从字段返回的字符串的长度一样。

一些想法-

  • 是否可以使用3个字段而不是1个字段?然后您可以稍后添加破折号
  • 如果要使用当前方法,可以保留已键入破折号的计数器。然后,在每个关键点笔划上,检查还剩多少虚线。如果与上一次计数不同,您知道他们已删除破折号
  • 我认为它需要更强大一点。如果他们把破折号放在字符串中的一个奇怪的地方怎么办
  • 您还可以防止用户输入所有非数字字符,并在每个分隔点插入破折号。因此,在3号和6号后面插入破折号,因为他们正在键入

  • 您不必专门检测backspace按键。试试这个:

    var tn_count = 0;
    function telephone(ev) {
      var el = document.getElementById("telephone_number");
    
      if(tn_count < 10) {
        var key, keychar;
        if(window.event) {
          key = window.event.keyCode;
        } else {
          key = ev.which;
        }
    
        keychar = String.fromCharCode(key);
      }
    
      if(!keychar.match(/\d|-/)) {  // only allow digits or "-"
        return false;
      }
    
      // clean up any non-digit chars that get in here somehow
      el.value = el.value.replace(/[A-Za-z]+/, '');
      tn_count = el.value.replace("-",'').length; // get the digit length
      return true;
    }
    
    var tn_count=0;
    功能电话(ev){
    var el=document.getElementById(“电话号码”);
    如果(tn_计数<10){
    var键,keychar;
    if(window.event){
    key=window.event.keyCode;
    }否则{
    key=ev.which;
    }
    keychar=String.fromCharCode(键);
    }
    如果(!keychar.match(/\d |-/){//只允许数字或“-”
    返回false;
    }
    //清理任何以某种方式进入这里的非数字字符
    el.value=el.value.替换(/[A-Za-z]+/,'');
    tn_count=el.value.replace(“-”,“”).length;//获取数字长度
    返回true;
    }
    

    这里的基本区别是,不是每次按键都加1,而是更新
    tn_count
    为字段中所有数字字符的总计数。为了安全起见,您可能还可以进行一些清理,但这应该可以让您开始了。

    您可以只计算字符串的长度并使用该值吗?如下所示:

    function getLen(el) {
        return el.value.replace('-', '').length;
    }
    
    alert(getLen(document.getElementById('telephone_number')));
    

    我在提交时确实有一个正则表达式检查-我只是不想在不知道用户将在字段中使用多少破折号的情况下给出输入maxlength。所以我想计算10位数字,因为这里的电话可以是9或10,而thamplate可以是1,2或3 dashes1。这是不可能的。我想数一数破折号,但我只想知道字段是否超过了数字长度3。我有正则表达式提交任何方式4。但是,当他们将退格(删除)-我将不得不处理,以及明天我将尝试替换和长度-然后将能够与我的想法。。。谢谢,我用了一个小模型。。。el.value和tn_count行也应该在var el之后,因为它不会正确计数,在keychar.match行中,我添加了key==13,因此enter将提交表单great,很高兴您能够使用它!