Запустіть натискання кнопки з JavaScript на клавіші Enter у текстовому полі


1292

У мене один текст і одна кнопка (див. Нижче). Як я можу використовувати JavaScript для запуску події натискання кнопки при Enterнатисканні клавіші всередині текстового поля?

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

<input type="text" id="txtSearch" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />

1
Важлива примітка для новобранців, як я: Ключова частина цього питання полягає в тому, якщо у вас вже є форма на сторінці, тому вже є кнопка для надсилання. Відповідь jQuery - це сумісний веб-переглядач і хороше рішення.
Танець Джошуа

2
@JoshuaDance, вже мати форму / подати - це не проблема. Сторінка може мати безліч форм (але не вкладених), кожна з яких має власну подачу. Кожне поле кожної форми викликає лише подання цієї форми. Як зазначено у цій відповіді .
Фредерік

Відповіді:


1426

У jQuery працює наступне:

$("#id_of_textbox").keyup(function(event) {
    if (event.keyCode === 13) {
        $("#id_of_button").click();
    }
});

$("#pw").keyup(function(event) {
    if (event.keyCode === 13) {
        $("#myButton").click();
    }
});

$("#myButton").click(function() {
  alert("Button code executed.");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Username:<input id="username" type="text"><br>
Password:&nbsp;<input id="pw" type="password"><br>
<button id="myButton">Submit</button>

Або в простому JavaScript працює наступне:

document.getElementById("id_of_textbox")
    .addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        document.getElementById("id_of_button").click();
    }
});

document.getElementById("pw")
    .addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        document.getElementById("myButton").click();
    }
});

function buttonCode()
{
  alert("Button code executed.");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Username:<input id="username" type="text"><br>
Password:&nbsp;<input id="pw" type="password"><br>
<button id="myButton" onclick="buttonCode()">Submit</button>


12
Це, мабуть, краща практика запиту event.which ніж event.keyCode або event.charCode, див. Developer.mozilla.org/en/DOM/event.charCode#Notes
Вільям Ніу

25
keydownне keyupє кращою подією для використання. Крім того, якщо ви використовуєте asp.net, вам доведеться return falseнаприкінці зупинити asp.net від перехоплення події.
maxp

144
Проблема з використанням keydownполягає в тому, що утримуючи клавішу введення, подія буде повторюватися знову і знову. якщо ви keyupприєднаєтесь до події, вона запуститься лише після виходу ключа.
Стів Пауло

26
Я підправив свій код , додавши event.preventDefault();перед викликом click();функції в той час як моя сторінка має форму , і я переключився keyupз , keypressяк це було тільки працювати обробник для мене, в будь-якому випадку, спасибі за акуратний шматок коду!
Адріан К.

7
Справедливості, jQuery був синонімом JS назад, коли ця відповідь була розміщена. Але зараз багато з нас, хто взагалі уникає jQuery (тому що це просто марнотратство, коли ви використовуєте щось на зразок React), роздратовано, коли шукаємо відповіді на питання JS, і часто перше, що виникає, - це бібліотека, яку ми не маємо Я не хочу залежати від цього.
Енді

402

Тоді просто зашифруйте це!

<input type = "text"
       id = "txtSearch" 
       onkeydown = "if (event.keyCode == 13)
                        document.getElementById('btnSearch').click()"    
/>

<input type = "button"
       id = "btnSearch"
       value = "Search"
       onclick = "doSomething();"
/>

5
Так, я майже це зробив. Я здогадуюсь, що це лише особисті переваги ... Мені подобається більш модульний підхід. ;)
kdenney

9
якщо вам потрібно зупинити подання форми: onkeydown = "if (event.keyCode == 13) {document.getElementById ('btnSubmit'). click (); event.returnValue = false; event.cancel = true;}"
Габріель Чунг

3
Це спрацювало для мене через те, що метод вбудованого, замість виклику функції з аналогічним кодом у ньому, дозволяє повертати помилкові під час виклику та уникати поштових зворотів. У моєму випадку метод "click" викликає виклик асинхроніки __doPostback і без "return false;" просто перезавантажить сторінку.
Дейв

3
Я погоджуюсь із Семом, цей код із цим вбудованим JS-кодом неприємний як пекло. Ви завжди повинні розділяти коди HTML та JavaScript.
Sk8erPeter

9
@Sam Ніколи не отримуй свою мудрість від ляльок . Біль веде до страху , а страх - вбивця розуму. Страх - це маленька смерть, яка приносить повне знищення. Я зіткнуся зі своїм страхом. Я дозволю, щоб він пройшов через мене і через мене. І коли він пройде повз, я поверну внутрішнє око, щоб побачити його шлях. Куди пішов страх, нічого не буде. За винятком можливо обробників подій в режимі inline. Отже, так, будь ласка, відокремте обробників подій від вашого перегляду / розмітки, як це відповідає . ; ^)
ruffin

179

З'ясував це:

<input type="text" id="txtSearch" onkeypress="return searchKeyPress(event);" />
<input type="button" id="btnSearch" Value="Search" onclick="doSomething();" />

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

22
e = e || window.event; // найкоротший шлях до події
Віктор

2
Найкращий звичайний варіант JavaScript. Доданий JavaScript як атрибут у HTML забирає багато часу, а jQuery - просто jQuery (сумісність не гарантована). Дякую за рішення!
boxspah

і якщо ви повернете помилку всередині if, ви можете уникнути подальшого оброблення ключа: <input type = "text" id = "txtSearch" onkeypress = "searchKeyPress (подія);" /> <type type = "button" id = "btnSearch" Value = "Пошук" onclick = "doSomething ();" /> <script> функція searchKeyPress (e) {// шукайте window.event у випадку, якщо подія не передається в e = e || window.event; if (e.keyCode == 13) {document.getElementById ('btnSearch'). click (); повернути помилкове; } повернути правду; } </script>
Жозе Гомес

83

Зробіть кнопку подання елементом, щоб вона була автоматичною.

<input type = "submit"
       id = "btnSearch"
       value = "Search"
       onclick = "return doSomething();"
/>

Зауважте, що для цього вам знадобиться <form>елемент, що містить поля введення (спасибі Сергію Ілінському).

Не вдало переробляти стандартну поведінку, Enterключ повинен завжди викликати кнопку подання у формі.


30
Чуваки! Прочитайте все його запитання. На сторінці вже є ще одна кнопка надсилання, тому це не працює для нього.
skybondsor

5
Цікаво, що нещодавно я намагався це зробити в SharePoint. Однак у SharePoint вже є форма, яка охоплює весь ваш вміст, а будь-які <form>теги викидаються в іншому випадку ліберальним аналізатором HTML. Тож мені доведеться викрадати натискання клавіш чи бюст. (BTW, натиснувши Enter у SharePoint чомусь запускає режим редагування. Я думаю, стрічка використовує ту ж форму.)

1
<button type="submit" onclick="return doSomething(this)">Value</button>Працює на. Підказка лежить у returnключовому
слові

77

Оскільки ще ніхто не користувався addEventListener, ось моя версія. Враховуючи елементи:

<input type = "text" id = "txt" />
<input type = "button" id = "go" />

Я б використав наступне:

var go = document.getElementById("go");
var txt = document.getElementById("txt");

txt.addEventListener("keypress", function(event) {
    event.preventDefault();
    if (event.keyCode == 13)
        go.click();
});

Це дозволяє окремо змінити тип події та дії, зберігаючи чистий HTML.

Зауважте, що, напевно, варто переконатися, що це знаходиться поза тим, <form>що коли я вклав ці елементи в них, натискаючи Enter, подав форму та перезавантажив сторінку. Зробив мені кілька мигтів, щоб виявити.

Додаток : Завдяки коментарю @ruffin я додав відсутній обробник подій та а, preventDefaultщоб дозволити цьому коду (імовірно) працювати і у формі. (Я обійдусь, щоб перевірити це, і в цей момент я видалю змістовний вміст.)


14
Я дійсно не розумію, чому відповідь JQeuery має більше відгуків. Я плачу за спільнотою веб-розробок.
Девід

1
Все, що вам насправді не вистачає, - це аргумент у вашому оброблювачі клавіш та його налагодження e.preventDefault()роботи з формами. Дивіться мою (нову) відповідь .
ruffin

5
якщо ви не збираєтесь, щоб ваші користувачі фактично вводили будь-які дані, вам слід дійсно зробити щось на кшталтif (event.keyCode == 13) { event.preventDefault(); go.click();}
несинхронізований

1
Використання jQuery тільки для цієї крихітної речі, безумовно, марне. Він також дуже легко працює з CSP і вимагає менше часу для завантаження. Якщо можете, скористайтеся цим.
Авамандер

59

У звичайному JavaScript,

if (document.layers) {
  document.captureEvents(Event.KEYDOWN);
}

document.onkeydown = function (evt) {
  var keyCode = evt ? (evt.which ? evt.which : evt.keyCode) : event.keyCode;
  if (keyCode == 13) {
    // For Enter.
    // Your function here.
  }
  if (keyCode == 27) {
    // For Escape.
    // Your function here.
  } else {
    return true;
  }
};

Я помітив, що відповідь дається лише у jQuery, тому я подумав дати щось також у простому JavaScript.


20
document.layers? Ви все ще підтримуєте Netscape? !!
Віктор

6
Ні, вам не потрібно підтримувати Netscape. blog.netscape.com/2007/12/28/…
kingdango

7
netscape.com навіть більше не існує (він переспрямовує на aol.com), але все ж є люди, які підтримують nescape, дивовижно.
LeartS

6
evt.which ? evt.which : evt.keyCodeдорівнюєevt.which || evt.keyCode
користувачеві

3
@LeartS Б'юсь об заклад, що все ще є люди, які використовують Netscape.
SantiBailors

23

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

<form onsubmit="Search();" action="javascript:void(0);">
    <input type="text" id="searchCriteria" placeholder="Search Criteria"/>
    <input type="button" onclick="Search();" value="Search" id="searchBtn"/>
</form>

Налаштування дії = "javascript: void (0);" наприклад, це ярлик для істотного запобігання поведінці за замовчуванням. У цьому випадку називається метод, натиснувши клавішу Enter або натисніть кнопку, і буде здійснено виклик Ajax для завантаження деяких даних.


Це краще рішення для підтримки мобільних пристроїв. Він автоматично приховує клавіатуру на пристроях Android, а також iOS, якщо ви додаєте searchCriteria.blur();їх до onsubmit.
Аарон Гліон

Це не спрацює, оскільки на сторінці вже є ще одна кнопка надсилання.
Жозе Гомес

@ JoseGómez, на сторінці може бути стільки кнопок для надсилання, скільки розробник бажає, ініціюється лише відповідними полями. Потрібно мати лише окремі форми для кожної групи полів / подання. Сторінка не обмежується однією формою.
Фредерік

@Frederic: із запитання я (неправильно?) Зрозумів, що інша кнопка подання знаходиться в тій же формі: "На моїй поточній сторінці вже є інша кнопка для надсилання, тому я не можу просто зробити кнопку для надсилання кнопкою".
Хосе Гомес

1
Це чудова відповідь, оскільки він дозволяє користувальницьким діям, але не дозволяє уникнути купою фантазійного коду переосмислення.
Beejor

16

Спробуй це:

<input type="text" id="txtSearch"/>
<input type="button" id="btnSearch" Value="Search"/>

<script>             
   window.onload = function() {
     document.getElementById('txtSearch').onkeypress = function searchKeyPress(event) {
        if (event.keyCode == 13) {
            document.getElementById('btnSearch').click();
        }
    };

    document.getElementById('btnSearch').onclick =doSomething;
}
</script>

15

Для запуску пошуку кожного разу, коли натискається клавіша введення, використовуйте це:

$(document).keypress(function(event) {
    var keycode = (event.keyCode ? event.keyCode : event.which);
    if (keycode == '13') {
        $('#btnSearch').click();
    }
}

14
onkeydown="javascript:if (event.which || event.keyCode){if ((event.which == 13) || (event.keyCode == 13)) {document.getElementById('btnSearch').click();}};"

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



13

Хоча я впевнений, що поки у формі є лише одне поле та одна кнопка подання, натискання клавіші Enter має надіслати форму, навіть якщо на сторінці є інша форма.

Потім ви можете зафіксувати форму підписом за допомогою js та зробити будь-яку перевірку чи зворотній зв'язок.


13

Ніхто не помітив, що html додає "accesskey", який доступний з певного часу.

Це спосіб без JavaScript за допомогою клавіатурних скорочень.

accesskey_browsers

Accesskey призначає ярлики на MDN

Навмисне використовуватись так. Сам атрибут html достатній, наскільки ми можемо змінити заповнювач місця чи інший показник залежно від браузера та ОС. Сценарій - це неперевірений підхід з нуля, щоб дати ідею. Можливо, ви хочете використовувати детектор бібліотеки браузера, як крихітний баузер

let client = navigator.userAgent.toLowerCase(),
    isLinux = client.indexOf("linux") > -1,
    isWin = client.indexOf("windows") > -1,
    isMac = client.indexOf("apple") > -1,
    isFirefox = client.indexOf("firefox") > -1,
    isWebkit = client.indexOf("webkit") > -1,
    isOpera = client.indexOf("opera") > -1,
    input = document.getElementById('guestInput');

if(isFirefox) {
   input.setAttribute("placeholder", "ALT+SHIFT+Z");
} else if (isWin) {
   input.setAttribute("placeholder", "ALT+Z");
} else if (isMac) {
  input.setAttribute("placeholder", "CTRL+ALT+Z");
} else if (isOpera) {
  input.setAttribute("placeholder", "SHIFT+ESCAPE->Z");
} else {'Point me to operate...'}
<input type="text" id="guestInput" accesskey="z" placeholder="Acces shortcut:"></input>


1
Доступ має два s.
кайзер

2
Схоже, не відповідає на питання ОП навколо особливого випадку ключа = ВВЕДЕННЯ
Озан Белік

12

Це рішення для всіх любителів YUI там:

Y.on('keydown', function() {
  if(event.keyCode == 13){
    Y.one("#id_of_button").simulate("click");
  }
}, '#id_of_textbox');

У цьому спеціальному випадку я мав кращі результати, використовуючи YUI для запуску DOM-об'єктів, яким було введено функціональність кнопок - але це вже інша історія ...


12

У Angular2 :

(keyup.enter)="doSomething()"

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

Також ідентифікатор не потрібен - інший спосіб розділення між поданням та моделлю NG2.


1
Ось питання про подальшу інформації про параметри KeyUp: stackoverflow.com/q/32155887/435605
AlikElzin-kilaka

10

Цей випадок, якщо ви хочете також набрати кнопку введення з Публікування на сервер та виконати сценарій Js.

<input type="text" id="txtSearch" onkeydown="if (event.keyCode == 13)
 {document.getElementById('btnSearch').click(); return false;}"/>
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />

9

Це OnChange спроби закрити, але погано себе веду по відношенню до браузеру тоді вперед (на Safari 4.0.5 і Firefox 3.6.3), так що, в кінцевому рахунку, я б не рекомендував його.

<input type="text" id="txtSearch" onchange="doSomething();" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />

Слід також зазначити, що він спрацьовує на фокусування.
FluorescentGreen5

8
event.returnValue = false

Використовуйте це під час обробки події або у функції, яку викликає обробник подій.

Він працює принаймні в Internet Explorer та Opera.


8

Для jquery mobile я повинен був зробити

$('#id_of_textbox').live("keyup", function(event) {
    if(event.keyCode == '13'){
    $('#id_of_button').click();
    }
});

2
.liveзастаріло в jQuery 1.7. Чи все ще вважається нормальним у jQuery Mobile?
Barmar

8

Щоб додати цілком звичайне рішення JavaScript, яке вирішило проблему @ icedwater з поданням форми , ось повне рішення зform .

ПРИМІТКА. Це для "сучасних браузерів", включаючи IE9 +. Версія IE8 не набагато складніша, і її можна дізнатися тут .


Fiddle: https://jsfiddle.net/rufwork/gm6h25th/1/

HTML

<body>
    <form>
        <input type="text" id="txt" />
        <input type="button" id="go" value="Click Me!" />
        <div id="outige"></div>
    </form>
</body>

JavaScript

// The document.addEventListener replicates $(document).ready() for
// modern browsers (including IE9+), and is slightly more robust than `onload`.
// More here: https://stackoverflow.com/a/21814964/1028230
document.addEventListener("DOMContentLoaded", function() {
    var go = document.getElementById("go"),
        txt = document.getElementById("txt"),
        outige = document.getElementById("outige");

    // Note that jQuery handles "empty" selections "for free".
    // Since we're plain JavaScripting it, we need to make sure this DOM exists first.
    if (txt && go)    {
        txt.addEventListener("keypress", function (e) {
            if (event.keyCode === 13)   {
                go.click();
                e.preventDefault(); // <<< Most important missing piece from icedwater
            }
        });

        go.addEventListener("click", function () {
            if (outige) {
                outige.innerHTML += "Clicked!<br />";
            }
        });
    }
});

1
Корова без пояснень ускладнює вирішення ваших проблем. Дайте мені знати, що не здається правильним, і я буду радий продовжувати заходи.
ruffin

7

У сучасному, необробленому (без keyCodeабо onkeydown) JavaScript:

<input onkeypress="if(event.key == 'Enter') {console.log('Test')}">

Це, на мій погляд, найпростіша відповідь, яка робить цю роботу. У моєму випадку використання я оновив його до onkeypress = "inputKeyPress (подія)" і потім обробив параметр event.which, що є у самій функції. Наприклад, клавіша Enter повертає event.wich як 13.
ak93

5
document.onkeypress = function (e) {
 e = e || window.event;
 var charCode = (typeof e.which == "number") ? e.which : e.keyCode;
 if (charCode == 13) {

        // Do something here
        printResult();
    }
};

Ось мої два центи. Я працюю над додатком для Windows 8 і хочу, щоб кнопка реєструвала подію натискання, коли я натискаю кнопку Enter. Я роблю це в JS. Я спробував пару пропозицій, але були проблеми. Це працює просто чудово.


Сорт надмірності для розміщення обробника події на документі. Якщо у вас було charCodeдесь 13, ви звільняєте це printResult().
ruffin

5

Щоб зробити це за допомогою jQuery:

$("#txtSearch").on("keyup", function (event) {
    if (event.keyCode==13) {
        $("#btnSearch").get(0).click();
    }
});

Щоб зробити це за допомогою звичайного JavaScript:

document.getElementById("txtSearch").addEventListener("keyup", function (event) {
    if (event.keyCode==13) { 
        document.getElementById("#btnSearch").click();
    }
});

5

Для тих, кому може подобатися стислість та сучасний js підхід.

input.addEventListener('keydown', (e) => {if (e.keyCode == 13) doSomething()});

де вхід - це змінна, що містить ваш вхідний елемент.


0

У jQuery ви можете використовувати event.which==13. Якщо у вас є form, ви можете скористатися $('#formid').submit()(при поданні зазначеної форми до слухачів додано правильних слухачів).

$('#textfield').keyup(function(event){
   if(event.which==13){
       $('#submit').click();
   }
});
$('#submit').click(function(e){
   if($('#textfield').val().trim().length){
      alert("Submitted!");
   } else {
    alert("Field can not be empty!");
   }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="textfield">
Enter Text:</label>
<input id="textfield" type="text">
<button id="submit">
Submit
</button>


0

Я розробив користувальницький JavaScript для досягнення цієї функції, просто додавши клас

Приклад: <button type="button" class="ctrl-p">Custom Print</button>

Ось перевірте це Fiddle
- або -
перевірити приклад https://stackoverflow.com/a/58010042/6631280

Примітка: у поточній логіці потрібно натиснути Ctrl+ Enter


0

Якщо сучасний JS keyUpзастарілий, використовуйте keyзамість цього

searchInput.onkeyup = function (e) {
    if (e.key === 'Enter') {
        searchBtn.click();
    }
}

-4

У цьому також може допомогти невелика функція JavaScript, яка прекрасно працює:

<script type="text/javascript">
function blank(a) { if(a.value == a.defaultValue) a.value = ""; }

function unblank(a) { if(a.value == "") a.value = a.defaultValue; }
</script> 
<input type="text" value="email goes here" onfocus="blank(this)" onblur="unblank(this)" />

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


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