JQuery подія для натискання користувачем клавіші enter у текстовому полі?


250

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

Відповіді:


446

Ви можете підключити власну власну подію

$('textarea').bind("enterKey",function(e){
   //do stuff here
});
$('textarea').keyup(function(e){
    if(e.keyCode == 13)
    {
        $(this).trigger("enterKey");
    }
});

http://jsfiddle.net/x7HVQ/


11
Варто зазначити, що в сценарії виявлення входу для запобігання надсилання форми подія "keyup" не є оптимальною, оскільки форма виявляє подання при натисканні клавіш. Таким чином, "клавіша" або "натискання клавіші" може бути кращою в цьому випадку.
TechNyquist

7
Примітка, bind () застаріло в jQuery 3.0.
Барт Фрідеріхс

У різних браузерах e.keyCodeдля деяких клавіш є різні , краще використовувати e.which, це гарантуватиме, що ви будете працювати з однією кнопкою у кожному браузері
Олег Шахов

99
   $('#textbox').on('keypress', function (e) {
         if(e.which === 13){

            //Disable textbox to prevent multiple submit
            $(this).attr("disabled", "disabled");

            //Do Stuff, submit, etc..

            //Enable the textbox again if needed.
            $(this).removeAttr("disabled");
         }
   });

8
Дякую - Це рішення підходило до мого випадку використання. Однак варто зауважити, що після будь-якої обробки буде потрібно додати `$ (this) .removeAttr (" вимкнено ");` для повторного включення текстового поля.
misterjaytee

39

Ось плагін для вас: (Fiddle: http://jsfiddle.net/maniator/CjrJ7/ )

$.fn.pressEnter = function(fn) {  

    return this.each(function() {  
        $(this).bind('enterPress', fn);
        $(this).keyup(function(e){
            if(e.keyCode == 13)
            {
              $(this).trigger("enterPress");
            }
        })
    });  
 }; 

//use it:
$('textarea').pressEnter(function(){alert('here')})

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

1
Занадто пізно я вже написав своє: P. Він також виконує ту саму роботу в менших рядках .. також використання $змінної для плагіна не є хорошою ідеєю, оскільки це може спричинити конфлікти.
Клацніть Upvote

@Neal, ти знаєш, як слід змінити код плагіна, який я розмістив у прийнятій відповіді, щоб можна було це робити, $("#myInput").bind('click, onEnter', myCallback);і він працював, не потребуючи нічого іншого?
Клацніть Upvote

1
@ClickUpvote # 1: видаліть його з відповіді - тоді ми можемо поговорити.
Naftali aka Neal

@Neal Дивовижне рішення людини. У мене просто була копія цієї функції! Дякую!
Білал Фазлані

17

ось плагін jquery для цього

(function($) {
    $.fn.onEnter = function(func) {
        this.bind('keypress', function(e) {
            if (e.keyCode == 13) func.apply(this, [e]);    
        });               
        return this; 
     };
})(jQuery);

щоб використовувати його, включіть код і налаштуйте його так:

$( function () {
    console.log($("input"));
    $("input").onEnter( function() {
        $(this).val("Enter key pressed");                
    });
});

jsfiddle про це тут http://jsfiddle.net/VrwgP/30/


2
Приємно, я б закликав зворотний виклик, використовуючи func.apply(this), таким чином, усередині функції зворотного виклику, яку ви можете використовувати thisяк звичайний, щоб отримати доступ до елемента, на якому подія викликана.
Клацніть Upvote

так, хороший пункт про func.apply (це), навіть не думав про це.
jzilla

Приємно і стисло, але я додам, що припинення розповсюдження та встановлення за замовчуванням було б гарною ідеєю у більшості випадків, щоб не допустити подання будь-якої форми. Просто додайте e.preventDefault(); e.stopPropagation();всередину if (e.keyCode)шматочка.
Irongaze.com

8

Слід зауважити, що використання live()jQuery було припинено з моменту версії 1.7та було видалено в jQuery 1.9. Натомість використання on()рекомендується.

Я настійно пропоную наступну методологію прив'язки, оскільки вона вирішує наступні потенційні проблеми:

  1. Прив’язуючи подію до document.bodyта передаючи селектор $ як другий аргумент on(), елементи можуть бути приєднані, від'єднані, додані або вилучені з DOM, не потребуючи вирішення подій повторного зв’язування або подвійного прив'язування. Це тому, що подія прив’язана до, document.bodyа не $selectorбезпосередньо, а це означає, що $selectorможна додавати, видаляти та додавати знову і ніколи не завантажуватиме пов’язану з нею подію.
  2. Зателефонувавши off()до on()цього, цей сценарій може жити або в основній частині сторінки, або в тілі виклику AJAX, не турбуючись про випадкові подвійні зв'язки.
  3. Обернувши сценарій всередині $(function() {...}), цей сценарій знову може бути завантажений або в основну частину сторінки, або в основу виклику AJAX. $(document).ready()не звільняється за запити AJAX, але $(function() {...})робить.

Ось приклад:

<!DOCTYPE html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script type="text/javascript">
      $(function() {
        var $selector = $('textarea');

        // Prevent double-binding
        // (only a potential issue if script is loaded through AJAX)
        $(document.body).off('keyup', $selector);

        // Bind to keyup events on the $selector.
        $(document.body).on('keyup', $selector, function(event) {
          if(event.keyCode == 13) { // 13 = Enter Key
            alert('enter key pressed.');
          }
        });
      });
    </script>
  </head>
  <body>

  </body>
</html>

4

Якщо ваш вклад є search, ви також можете використовувати on 'search'подію. Приклад

<input type="search" placeholder="Search" id="searchTextBox">

.

$("#searchPostTextBox").on('search', function () {
    alert("search value: "+$(this).val());
});

3

HTML-код: -

<input type="text" name="txt1" id="txt1" onkeypress="return AddKeyPress(event);" />      

<input type="button" id="btnclick">

Код сценарію Java

function AddKeyPress(e) { 
        // look for window.event in case event isn't passed in
        e = e || window.event;
        if (e.keyCode == 13) {
            document.getElementById('btnEmail').click();
            return false;
        }
        return true;
    }

У Вашій формі немає кнопки надсилання за замовчуванням


2

Ще одна тонка варіація. Я пішов на невеликий поділ повноважень, тож у мене є плагін, щоб увімкнути введення ключа, тоді я просто прив’язуюсь до подій зазвичай:

(function($) { $.fn.catchEnter = function(sel) {  
    return this.each(function() { 
        $(this).on('keyup',sel,function(e){
            if(e.keyCode == 13)
              $(this).trigger("enterkey");
        })
    });  
};
})(jQuery);

А потім у користуванні:

$('.input[type="text"]').catchEnter().on('enterkey',function(ev) { });

Цей варіант дозволяє використовувати делегування події (для прив’язки до елементів, які ви ще не створили).

$('body').catchEnter('.onelineInput').on('enterkey',function(ev) { /*process input */ });

0

Я не міг змусити keypressподії запустити кнопку введення, і я почесав голову деякий час, поки не прочитав документи jQuery:

" Подія натискання клавіші надсилається елементу, коли браузер реєструє введення на клавіатурі. Це аналогічно події клавіатури, за винятком того, що модифікатор і недрукувальні клавіші, такі як Shift, Esc та видаляють події клавіш тригера, але не події натискання клавіші. " ( https://api.jquery.com/keypress/ )

Мені довелося скористатися keyupабо keydownподією, щоб натиснути кнопку введення.

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