按Enter键

时间:2016-07-19 20:33:25

标签: javascript preventdefault

这是我的初始问题的完整修订版,所有不必要的资源和参考资料都已删除

我将同一个事件监听器绑定到两个不同的元素:一个按钮和一个Enter键,它看起来如下所示:

var funcelement = function(){
    //function code
};


$('#buttonID').click(funcelement);


$('#inputID').keyup(function () {
   if (event.which == 13) {
      $('#buttonID').trigger('click');
   }
})

我想要做的是,如果使用preventDefault()将焦点放在提交按钮(#buttonID)上,则阻止传入按键传播。

所以我尝试了各种组合使它工作。以下是我尝试的最新结果

$('#inputID').keyup(function () {
   var hasfocus = $('#buttonID').is(':focus') || false;

   if (event.which == 13) {
      if (!hasfocus) {
         event.preventDefault();
         $('#buttonID').trigger('click');
         //hasfocus = true;
      }

      else {
         //event.preventDefault();
         //$('#buttonID').trigger('click');
     }

   }
})

在输入框中输入文本并按Enter键后,会弹出一个带有是/取消按钮的确认窗口,并将焦点放在是按钮上。一旦我再次按下Enter键,另一个确认已进行更改的窗口会弹出,并按下Ok按钮。一旦我再次按Enter键,我需要的一切都在制作中。

然而,有一个问题:在完成最后一步之后,我将回到 if(!hasfocus)行。

如何防止这种情况发生?一旦我需要的东西完成了 - 我不想再次进入那条线。

1 个答案:

答案 0 :(得分:1)

您可以将参数传递给函数并停止传播,如下所示:

var funcelement = function(event, wasTriggeredByEnterKey){
   if (wasTriggeredByEnterKey && $('#buttonID').is(':focus')) {
       event.stopPropagation;
   }

    //function code
};


$('#buttonID').click(funcelement);



$('#inputID').keyup(function () {
    if (event.which == 13) {
        $('#buttonID').trigger('click', [true]);
    }
  }
)

<强>更新

为了回答您修改过的问题,您应该在处理警报时使用“keydown”事件而不是“keyup”。这是因为警报以“keydown”事件关闭,但是当您释放回车键时仍然会触发“keyup”事件。只需更改一个单词:

$('#inputID').keydown(function () {
   var hasfocus = $('#buttonID').is(':focus') || false;

   if (event.which == 13) {
      if (!hasfocus) {
         event.preventDefault();
         $('#buttonID').trigger('click');
         //hasfocus = true;
      }

      else {
         //event.preventDefault();
         //$('#buttonID').trigger('click');
     }

   }
})