【问题标题】:javascript check key is clickedjavascript 检查键被点击
【发布时间】:2014-11-11 12:01:35
【问题描述】:

我想创建当我点击 CTRL 键时调用的代码。

这是我的代码:

var ready = true;
$("document").ready(function(){
     readShift()
 });
 function readShift(){
    if (ready){
        $(window).keydown(function (e){
            if (e.ctrlKey){
                alert("clicked");
            }
        });
    }
    readShift();
}

点击 CTRL 键后,警报会一直循环,尽管之后我没有点击 CTRL

我需要的是当我按下 CTRL 时调用的警报。

【问题讨论】:

  • 您在页面中遇到了无限递归调用的问题 - 您应该在控制台中看到类似 Uncaught RangeError: Maximum call stack size exceeded 的错误
  • 你为什么在readShift里面打电话给readShift
  • 哦,我误解了 JS 的工作原理,我认为我应该永远循环,以便我的代码永远工作。谢谢

标签: javascript jquery key ctrl


【解决方案1】:

这没用:

if (ready){

文档已经准备好,因为您在 jQuery.ready 中调用。

它正在经历一个无限循环,因为您正在调用 readShift();递归地。 这是正确的代码:

$(document).ready(function(){
     readShift()
 });
 function readShift(){
        $(window).keydown(function (e){console.log("ciao");
            if (e.ctrlKey){
                alert("clicked");
            }
        });

}

编辑:我也忘了提到 $("document") 没有得到任何结果,你应该使用 $(document)。 jQuery 在 DOM 中进行“查询”。除非 DOM 中有“document”标签,否则 $("document") 不会找到任何东西

【讨论】:

    【解决方案2】:

    函数在倒数第二行递归调用自身

    function readShift(){
        ...
        readShift();
    }
    

    这意味着即使方法完成,它也会被一遍又一遍地调用。

    阅读this article 上的回复以了解发生了什么。

    【讨论】:

      【解决方案3】:

      试试这个代码:

      $("document").ready(function(){
          $(window).keydown(function (e) {
              if (e.ctrlKey){
                  alert("clicked");
              }
          });
      });
      

      【讨论】:

        【解决方案4】:

        当您调用 readShift() 时,函数内部还有另一个 readShift()。

        如果你调用这个函数,你的 keydown 事件会有很多监听器。所以当你点击它时,会有数百个警报,因为触发了数百个监听器。

        从函数中删除 readShift() 以使其工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-16
          • 2021-03-08
          • 1970-01-01
          • 2013-05-09
          • 2013-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多