当Javascript上显示警报时,忽略按键

问题描述 投票:1回答:5

我有一个函数X,当光标集中在一个文本框中时,我按了回车键,但是有一种可能性(与其他JS函数一起),如果我集中在这个文本框上,我得到了一个警报。

问题就发生在这里,有时我通过按回车键来 "忽略 "这个错误。进入当警报出现时,如何不调用这个函数X,但我希望当警报再次关闭时,它能再次工作。

在HTML页面上。

<input type='text' name='col0' id='col0' onkeyup='arrowHandler(0);'
onblur='count(0)' />
<input type='text' name='col1' id='col1' onkeyup='arrowHandler(1);' 
onblur='count(1)' />
<input type='text' name='col2' id='col2' onkeyup='arrowHandler(2);' 
onblur='count(2)' />
<input type='text' name='col3' id='col3' onkeyup='arrowHandler(3);' 
onblur='count(3)' />

在JS页面上:

function arrowHandler(i){
  var key = window.event.keyCode;
  if(key == 13){
    // moving to the next (or first, if last) text field
    var newcol = parseInt(i) + 1;
    if(newcol == col) newcol = 0;
    elmt = document.getElementById("col" + newcol);
    elmt.focus();
  }
}

function count(i){
  if(parseInt(document.getElementById("col" + i).value) > 20){
    alert("error!");
  }
}

在这里,当焦点在 col0,我写25,然后重点转移到。col1我得到了一个警报,然后我按了回车键,结果,焦点移到了......。col2 (我不希望最后一个动作是因为在显示警报时按下回车键)。

javascript dom-events alert keypress
5个回答
1
投票

你可以试试这样的方法。

var block = false;

function arrowHandler(evt, i){
  var key = window.event.keyCode;
  if(!block && key == 13){
    // moving to the next (or first, if last) text field
    var newcol = parseInt(i) + 1;
    if(newcol == col) newcol = 0;
    elmt = document.getElementById("col" + newcol);
    elmt.focus();
  }
}

function count(i){
  if(parseInt(document.getElementById("col" + i)).value > 20){
    block = true;
    alert("error!");
    setTimeout(function(){block=false;},100);
  }
}

其中,如 alert 停止JS的执行,忽略警报后的任何按键。

虽然,你可能应该重新考虑使用 alert,有更好的方法来进行验证。


0
投票

试试这个,我想应该可以。

你可以使用一个全局的临时变量,比如说t &amp;当你发出 "错误!"的警告时,把它设置为1。然后在你的arrowHandler函数中,将if条件改为if(key==13 &&t==0),然后在你的代码&添加一个else部分,在那里你改变t=0。

另外,我想你的 parseInt(document.getElementById("col" + i))>20 语句应替换为 parseInt(document.getElementById("col" + i).value)>20.


0
投票

理想情况下,你不会使用 alert() 反而冒出 <div> 风格很好,将获得焦点,或显示出一个。<span> 表示失败消息,而不强迫用户确认。

如果你选择坚持使用 alert() 解决方法,@gopi1410 是正确的:在前面设置一个var,后面清空,意思是 "不要过滤按键"。


0
投票

这里有一个更简单的版本。处理焦点是在一个单独的函数中完成的。不需要定时器和所有。希望能帮到你。

还有,就像其他人说的那样,请避免使用警报,请--如果你发现这样的东西,真的很恼火,不是吗?好好想想吧。

var handleFocus = function (i, error) {
    var id = "col" + (error ? i : ++i);
    if (id === 'col' + col) id = 'col0';
    alert(id + "  " + i + "  " + error)
    document.getElementById(id).focus();
};

var arrowHandler = function (evt, i) {
    var key = window.event.keyCode;
    if (key == 13) {
        handleFocus(i, false);
    }
};

var count = function (i) {
    if (parseInt(document.getElementById("col" + i).value) > 20) {
        alert("error!");
        handleFocus(i, true);
    }
};

0
投票

你可以使用 计数 内功 arrowHandler 在if(key == 13)条件中加入 回假 在计数函数中

(等我有时间的时候再改进我的回答)

© www.soinside.com 2019 - 2024. All rights reserved.