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.