【问题标题】:Binding arrow keys in jQuery except in input and textarea在 jQuery 中绑定箭头键,输入和文本区域除外
【发布时间】:2016-11-29 17:47:30
【问题描述】:

我发现了这个关于用 jQuery 绑定箭头键的绝妙问题:Binding arrow keys in JS/jQuerySygmoral 提供了一个很好的解决方案:

$(document).keydown(function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
});

EXCEPT:这可以防止箭头键按照焦点位于文本输入字段中时的正常工作方式工作。

当当前焦点位于输入、文本区域或其他内容可编辑区域时,如何修改此解决方案以允许箭头键正常工作?

【问题讨论】:

    标签: javascript jquery keyboard key-bindings


    【解决方案1】:

    把它放在一个条件中:

    $(document).keydown(function(e) {
        if(!$(e.target).is(':input, [contenteditable]')){
            switch(e.which){
               // the cases as is
            }
            e.preventDefault(); // prevent the default action (scroll / move caret)
        }
    });
    

    【讨论】:

    • 只是为了检查 -- .is(':input') 也涵盖文本区域?
    • 绝对! :input 涵盖所有输入元素,包括文本区域、选择、按钮等。
    • 我认为测试可以更简单:if(!$(e.currentTarget).is(':input,[contenteditable]')){,因为.is() 采用一个可以有OR 以逗号分隔的条件的选择器。对吗?
    • 我认为应该是e.target 而不是e.currentTarget currentTarget 将始终为 document,因为这是侦听器设置的元素。
    • 是的,我读过它,上面写着It always refers to the element the event handler has been attached to as opposed to event.target which identifies the element on which the event occurred.,这意味着在这种情况下,currentTarget 将永远是document
    【解决方案2】:

    你可以使用event.target来获取事件的目标元素,这样你可以检查

    var $target = $(e.target);
    if($target.is("input") || $target.is("textarea")) {
        //
    }
    

    【讨论】:

      【解决方案3】:

      你的可编辑元素可能有一些共同的类

      $('.input').keypress(function(event) {
      
          var charCode = (evt.which) ? evt.which : event.keyCode
      
          switch(charCode) {
              case 37: // left
              break;
      
              case 38: // up
              break;
      
              case 39: // right
              break;
      
              case 40: // down
              break;
      
              default: return; // exit this handler for other keys
          }
          e.preventDefault();  
      });
      

      【讨论】:

      • 那将与我想要的相反。我想将键绑定到上一个和下一个功能,除非焦点在输入中(箭头键用于移动光标)。
      猜你喜欢
      • 1970-01-01
      • 2019-10-21
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      相关资源
      最近更新 更多