【问题标题】:Ignore keypress when alert shown on Javascript在 Javascript 上显示警报时忽略按键
【发布时间】:2012-05-05 05:34:05
【问题描述】:

当光标聚焦在文本框中并按下回车键时,我有一个函数 X 在做某事,但是有可能(使用其他 JS 函数)如果我专注于这个文本框,我会收到警报。

问题发生在这里,有时我通过按enter“忽略”错误,当警报出现时如何不调用此函数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(我不想要最后一个动作,因为在显示警报时按 Enter)。

【问题讨论】:

  • 你能说得清楚点吗?或者你能提供一个 jsfiddle 更好吗?
  • @Jivings: 完成,抱歉我之前太懒了:)
  • 请任何投反对票的人,删除投反对票(我不介意不投反对票)
  • 是我,既然你编辑了,我可以删掉它:)
  • 请粘贴实际有效的代码;这两个函数都有错误,所以我很惊讶它完全可以工作。另外它只适用于 IE,但我认为这是有意的?

标签: javascript dom-events alert keypress


【解决方案1】:

你可以在 if(key == 13) 条件中的 arrowHandler 中使用 count 函数,并在 count 函数中添加 return false

(有时间我会改进我的答案)

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    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,但还有更好的方法来进行验证。

    【讨论】:

    • 迄今为止最好的答案...第二个建议不要使用警报,我开始考虑这个...
    • 嘿,你可能想把那个 window.event.keyCode - 4th line
    • @ParthThakkar:是的,我弄错了,但这不是重点:)
    【解决方案3】:

    这是一个更简单的版本。处理焦点是在一个单独的函数中完成的。不需要计时器等等。希望这会有所帮助。

    正如其他人所说,请避免使用警报,如果你发现这样的东西真的很烦人,不是吗?考虑一下。

    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);
        }
    };
    

    【讨论】:

    • 还是不明白...当有警报并且我按Enter键时,会执行arrowHandler吗?如果有,有什么区别?
    • 没有。它不会。但是我们不需要调用它,不是吗?因为我们将处理焦点的工作委托给一个单独的函数——handleFocus()。这种分离的原因是,否则代码会重复,一件坏事。
    • 那么代码将如何出现在 html 页面上?哪个叫哪个?
    • 好的。 arrowHandler() 绑定到 keyup/down 任何你想要的。 count() 必然会改变()。而 handleFocus 不绑定任何东西,它只是由前两者使用。
    • 那么,既然“enter”是在keyup/down上,那么在alert的时候也会执行,对吧?
    【解决方案4】:

    理想情况下,您不使用alert(),而是弹出一个样式很好的&lt;div&gt;,以获取焦点,或者显示一个&lt;span&gt;,指示失败消息而不强制用户确认。

    如果您选择坚持使用alert() 解决方案,@gopi1410 是正确的:在之前设置 var 并在之后清除它,这意味着“不过滤击键”。

    【讨论】:

    • 由于我选择坚持alert(),我认为该解决方案不起作用。问题是,当我在警报中单击OK 时,变量的值不会改变。因此,enter 在那之后就无法正常工作了
    【解决方案5】:

    试试这个,我想它应该可以工作:

    当您发出“错误!”警报时,您可以使用全局临时变量 t 并将其设置为 1。然后在您的 arrowHandler 函数中将 if 条件更改为 if(key==13 && t==0) 后跟您的代码并在其中添加一个 else 部分来更改 t=0。

    另外,我猜你的parseInt(document.getElementById("col" + i))&gt;20 语句应该替换为parseInt(document.getElementById("col" + i).value)&gt;20

    【讨论】:

    • 关于 .value,是的,我确实有过,抱歉,这是因为我只拿了一些代码,可能会忘记一些东西(真正的代码太长,无法复制)...是的,代码有效!谢谢
    • 我不想这么说,但这并不是一直有效...所以,现在我在警报之后添加 t=0,并在 t=0 时按 enter 后添加 t=1 .如果我通过按回车“单击”确定(当警报出现时),这将起作用,但如果我实际单击确定按钮(之后 t 值仍然为 0),这将不起作用
    • 附加,我解决了问题,t==1 有效,t==0 无效
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2017-04-09
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多