Як виявити натискання клавіші Enter на клавіатурі за допомогою jQuery?


731

Я хотів би визначити, чи натиснув користувач Enterза допомогою jQuery.

Як це можливо? Чи потрібен плагін?

EDIT: Схоже, мені потрібно використовувати keypress()метод.

Мені хотілося дізнатись, чи хтось знає, чи є проблеми з браузером з цією командою - як, чи є якісь проблеми сумісності браузера, про які я повинен знати?



5
Одна з найкращих речей у структурах Javascript - це те, що вони за замовчуванням повинні бути сумісними між браузерами. Вони обробляють перевірки сумісності браузера, щоб користувачеві не довелося. Я не читав вихідний код JQuery, але сумніваюся, що функція натискання клавіш в цьому сенсі відрізняється.
miek

2
Єдине питання сумісності браузера полягає в тому, що ви повинні використовувати e.which замість e.keyCode для виявлення коду ascii.
Даніель

Відповіді:


1330

Вся суть jQuery полягає в тому, що вам не доведеться турбуватися про відмінності браузера. Я впевнений, що ви можете сміливо переходити з enter13 в усіх браузерах. Отже, маючи на увазі, ви можете це зробити:

$(document).on('keypress',function(e) {
    if(e.which == 13) {
        alert('You pressed enter!');
    }
});

7
Я посилаюся на це, тому що я прочитав це і залишився чухати голову, чому натискання клавіш не працює з IE. (не пов'язуватиметься $(window)під IE) quirksmode.org/dom/events/keys.html
інкогніто

17
e.keyCode не є 100% перехресним браузером. використовуйте, наприклад, як показано нижче
Даніель,

15
З документації jQuery "Властивість event.wich нормалізує event.keyCode та event.charCode. Рекомендується переглянути event.which для клавіш клавіатури".
Ріккардо Галлі

20
$ (document) .on ('keypress', function (e) {
user956584

5
Я отримую кілька виконань даної функції завдяки розповсюдженню подій (тобто попередження скидається двічі). Щоб зупинити це, додайте e.stopPropagation () наприкінці функції
dpb

129

Я написав невеликий плагін, щоб полегшити зв'язування події "при натисканні клавіші введення":

$.fn.enterKey = function (fnc) {
    return this.each(function () {
        $(this).keypress(function (ev) {
            var keycode = (ev.keyCode ? ev.keyCode : ev.which);
            if (keycode == '13') {
                fnc.call(this, ev);
            }
        })
    })
}

Використання:

$("#input").enterKey(function () {
    alert('Enter!');
})

Це не працює для мене (я потрапив #inputна <input>поле)
Rápli András

1
Що робити, якщо #input елемент буде динамічним?
Jigar7521

@mplungjan не впевнений, що ви маєте на увазі під "делегуванням"
Андреа

$("#input").on("someevent","someselector",function () {})
mplungjan

62

Я не міг змусити код, опублікований @Paolo Bergantino, працювати, але коли я змінив його $(document)і e.whichзамість e.keyCodeцього, я зрозумів, що він працює безвідмовно.

$(document).keypress(function(e) {
    if(e.which == 13) {
        alert('You pressed enter!');
    }
});

Посилання на приклад на JS Bin


Для мене, наприклад, який не працює з IE. Чи працює це для інших?
Умеш Раджбхандарі

Яка версія IE? Для мене добре працює на IE7.
Ян Рок

З документації jQuery "Властивість event.wich нормалізує event.keyCode та event.charCode. Рекомендується переглянути event.which для клавіш клавіатури".
Ріккардо Галлі

52

Я вважав, що це більше сумісність між браузерами:

$(document).keypress(function(event) {
    var keycode = event.keyCode || event.which;
    if(keycode == '13') {
        alert('You pressed a "enter" key in somewhere');    
    }
});

1
Ваш термінальний IF може бути скорочений до: var keycode = event.keyCode || подія.який;
пістолет-піт

29

Це можна зробити за допомогою ручки події jquery 'keydown'

   $( "#start" ).on( "keydown", function(event) {
      if(event.which == 13) 
         alert("Entered!");
    });


9

Я витратив колись, придумуючи це рішення, сподіваюся, що він комусь допоможе.

$(document).ready(function(){

  $('#loginforms').keypress(function(e) {
    if (e.which == 13) {
    //e.preventDefault();
    alert('login pressed');
    }
  });

 $('#signupforms').keypress(function(e) {
    if (e.which == 13) {
      //e.preventDefault();
      alert('register');
    }
  });

});


7

Невелике розширення відповіді Андреа вище робить допоміжний метод більш корисним, коли ви також можете захопити модифіковані клавіші введення (тобто ctrl-enter або shift-enter). Наприклад, цей варіант дозволяє зв'язувати такі:

$('textarea').enterKey(function() {$(this).closest('form').submit(); }, 'ctrl')

подати форму, коли користувач натискає ctrl-enter з акцентом на текстовій області цієї форми.

$.fn.enterKey = function (fnc, mod) {
    return this.each(function () {
        $(this).keypress(function (ev) {
            var keycode = (ev.keyCode ? ev.keyCode : ev.which);
            if ((keycode == '13' || keycode == '10') && (!mod || ev[mod + 'Key'])) {
                fnc.call(this, ev);
            }
        })
    })
}

(див. також Ctrl + Введіть jQuery в TEXTAREA )


4

У деяких випадках може знадобитися придушити ENTERключ для певної області сторінки, але не для інших областей сторінки, як-от сторінка нижче, що містить заголовок <div> із полем SEARCH .

Мені знадобилося трохи розібратися, як це зробити, і я публікую цей простий, але повний приклад для громади.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Test Script</title>
  <script src="/lib/js/jquery-1.7.1.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    $('.container .content input').keypress(function (event) {
      if (event.keyCode == 10 || event.keyCode == 13) {
        alert('Form Submission needs to occur using the Submit button.');
        event.preventDefault();
      }
    });
  </script>
</head>
  <body>
    <div class="container">
      <div class="header">
        <div class="FileSearch">
          <!-- Other HTML here -->
        </div>
      </div>
      <div class="content">
        <form id="testInput" action="#" method="post">
        <input type="text" name="text1" />
        <input type="text" name="text2" />
        <input type="text" name="text3" />
        <input type="submit" name="Submit" value="Submit" />
        </form>
      </div>
    </div>
  </body>
</html>

Посилання на JSFiddle Playground : [Submit]кнопка нічого не робить, але натискання ENTERодного з елементів текстового поля не подасть форму.



2

Оскільки keypressподія не охоплена жодною офіційною специфікацією, реальна поведінка, що виникає при її використанні, може відрізнятися в браузерах, версіях браузера та платформах.

$(document).keydown(function(event) {
  if (event.keyCode || event.which === 13) {
    // Cancel the default action, if needed
    event.preventDefault();
    //call function, trigger events and everything tou want to dd . ex : Trigger the button element with a click
    $("#btn").trigger('click');
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<button id="btn" onclick="console.log('Button Pressed.')">&nbsp</button>

Сподіваюся, це було б корисно!


Зауважимо, причина, чому keypressїї немає в специфікаціях (більше), полягає в тому, що вона застаріла ( MDN ).
YellowAfterlife

так, я відредагував ... tnx <3
Zoe_NS

0

Найпростіший спосіб визначити, чи натиснув користувач клавішу Enter, - це використовувати номер ключа, номер ключа Enter = 13 для перевірки значення ключа у вашому пристрої

$("input").keypress(function (e) {
  if (e.which == 32 || (65 <= e.which && e.which <= 65 + 25)
                    || (97 <= e.which && e.which <= 97 + 25)) {
    var c = String.fromCharCode(e.which);
    $("p").append($("<span/>"))
          .children(":last")
          .append(document.createTextNode(c));
  } else if (e.which == 8) {
    // backspace in IE only be on keydown
    $("p").children(":last").remove();
  }
  $("div").text(e.which);
});

натиснувши клавішу введення, ви отримаєте результат як 13. використовуючи ключове значення, ви можете викликати функцію або робити все, що завгодно

        $(document).keypress(function(e) {
      if(e.which == 13) {
console.log("User entered Enter key");
          // the code you want to run 
      }
    });

якщо ви хочете націлити кнопку після натискання клавіші введення, ви можете використовувати код

    $(document).bind('keypress', function(e){
  if(e.which === 13) { // return
     $('#butonname').trigger('click');
  }
});

Сподіваюся, це допоможе



0
$(function(){
  $('.modal-content').keypress(function(e){
    debugger
     var id = this.children[2].children[0].id;
       if(e.which == 13) {
         e.preventDefault();
         $("#"+id).click();
       }
   })
});

3
Чи можете ви додати трохи пояснювальних коментарів, щоб пояснити запитувачеві, як працює ваш код - дякую.
SaschaM78

0
$(document).keyup(function(e) {
    if(e.key === 'Enter') {
        //Do the stuff
    }
});

Це виглядає як адаптація інших відповідей - чи можете ви додати трохи пояснень, щоб зробити вашу такою ж цікавою, як і інші?
Ніко Хааз

0

Я звик $(document).on("keydown").

У деяких браузерах keyCodeне підтримується. Те саме з whichтак, якщо keyCodeвін не підтримується, вам потрібно використовувати whichі навпаки.

$(document).on("keydown", function(e) {
  const ENTER_KEY_CODE = 13;
  const ENTER_KEY = "Enter";
  var code = e.keyCode || e.which
  var key = e.key
  if (code == ENTER_KEY_CODE || key == ENTER_KEY) {
    console.log("Enter key pressed")
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.