Wywołaj kliknięcie przycisku za pomocą JavaScript na klawiszu Enter w polu tekstowym


1292

Mam jedno wprowadzanie tekstu i jeden przycisk (patrz poniżej). Jak użyć JavaScript, aby wywołać zdarzenie kliknięcia przycisku po Enternaciśnięciu klawisza w polu tekstowym?

Na mojej bieżącej stronie jest już inny przycisk przesyłania, więc nie mogę po prostu ustawić przycisku jako przycisku przesyłania. A ja tylko chcesz, Enterkluczem do tego konkretnego kliknij przycisk, jeśli jest naciśnięty w tym jeden z pola tekstowego, nic innego.

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

1
Ważna uwaga dla nowicjuszy takich jak ja: Kluczową częścią tego pytania jest to, czy masz już formularz na stronie, więc masz już przycisk przesyłania. Odpowiedź jQuery jest kompatybilna z wieloma przeglądarkami i dobrym rozwiązaniem.
Joshua Dance

2
@JoshuaDance, już posiadanie formularza / przesłania nie stanowi problemu. Strona może mieć wiele formularzy (ale nie zagnieżdżonych), z których każdy ma własne przesłanie. Każde pole każdego formularza spowoduje tylko przesłanie tego formularza. Jak stwierdzono w tej odpowiedzi .
Frédéric

Odpowiedzi:


1426

W jQuery działałyby:

$("#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>

Lub w zwykłym JavaScript, działałyby następujące czynności:

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
Prawdopodobnie lepszym rozwiązaniem jest zapytanie o event.which niż event.keyCode lub event.charCode, patrz developer.mozilla.org/en/DOM/event.charCode#Notes
William Niu

25
keydownnie keyupjest to lepsze wydarzenie do użycia. Ponadto, jeśli używasz asp.net, będziesz musiał return falsena końcu zatrzymać asp.net przed przechwyceniem zdarzenia.
maxp

144
Problem z używaniem keydownpolega na tym, że przytrzymanie wciśniętego klawisza Enter powoduje ciągłe uruchamianie zdarzenia. jeśli dołączysz do keyupwydarzenia, uruchomi się ono dopiero po zwolnieniu klucza.
Steve Paulo,

26
Mam manipulowane kodu dodając event.preventDefault();przed wywołaniem click();funkcji, podczas gdy moja strona ma postać a ja przełączane keyupz keypressjak to było handler tylko pracuje dla mnie, tak czy inaczej, dzięki za czystego kawałka kodu!
Adrian K.,

7
Szczerze mówiąc, jQuery było prawie synonimem JS, kiedy ta odpowiedź została opublikowana. Ale teraz wielu z nas, którzy całkowicie unikają jQuery (ponieważ jest to marnowanie KB, gdy używasz czegoś takiego jak React), czujemy się zirytowani, gdy szukamy odpowiedzi na pytania JS i często pierwszą rzeczą, która się pojawia, jest biblioteka, którą nie przekazujemy nie chcę na tym polegać.
Andy,

402

Następnie po prostu wpisz to!

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

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

5
Tak, prawie to zrobiłem. Myślę, że to tylko kwestia osobistych preferencji ... Podoba mi się bardziej modułowe podejście. ;)
kdenney

9
jeśli chcesz zatrzymać przesyłanie formularza: onkeydown = "if (event.keyCode == 13) {document.getElementById ('btnSubmit'). click (); event.returnValue = false; event.cancel = true;}"
Gabriel Chung,

3
Działa to dla mnie, ponieważ metoda inline, zamiast wywoływać funkcję z podobnym kodem, pozwala na zwrócenie fałszywej wartości przy wywołaniu i uniknięcie opóźnień zwrotnych. W moim przypadku metoda „click” wywołuje wywołanie asynchroniczne __doPostback i bez „return false”; po prostu ponownie załaduje stronę.
Dave

3
Zgadzam się z Samem, ten kod z tym wbudowanym kodem JS jest brzydki jak diabli. Zawsze należy rozdzielać kody HTML i JavaScript.
Sk8erPeter

9
@Sam Nigdy nie zdobywaj mądrości od lalek . Ból prowadzi do strachu , a strach zabija umysły. Strach jest małą śmiercią, która przynosi całkowite zatarcie. Zmierzę się ze strachem. Pozwolę, by to przeszło nade mną i przeze mnie. A kiedy minie, odwrócę wewnętrzne oko, aby zobaczyć jego ścieżkę. Tam, gdzie minął strach, nie będzie nic. Z wyjątkiem może wbudowanych procedur obsługi zdarzeń. Tak, tak, oddziel swoje moduły obsługi zdarzeń od widoku / znaczników, tak jak ta odpowiedź . ; ^)
ruffin

179

Zrozumiałem to:

<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; // najkrótsza droga do wydarzenia
Victor

2
Najlepsza zwykła opcja JavaScript. Dodany JavaScript jako atrybut w HTML zajmuje dużo miejsca, a jQuery to tylko jQuery (zgodność nie jest gwarantowana). Dzięki za rozwiązanie!
boxspah

a jeśli zwrócisz false wewnątrz if, możesz uniknąć dalszego przetwarzania klucza: <input type = "text" id = "txtSearch" onkeypress = "searchKeyPress (event);" /> <input type = "button" id = "btnSearch" Value = "Search" onclick = "doSomething ();" /> <script> funkcja searchKeyPress (e) {// poszukaj window.event w przypadku, gdy zdarzenie nie zostanie przekazane e = e || window.event; if (e.keyCode == 13) {document.getElementById ('btnSearch'). click (); zwracać fałsz; } return true; } </script>
Jose Gómez

83

Ustaw przycisk jako element przesyłania, aby był automatyczny.

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

Zauważ, że potrzebujesz <form>elementu zawierającego pola wejściowe, aby to zadziałało (dzięki Sergey Ilinsky).

Przedefiniowanie standardowego zachowania nie jest dobrą praktyką, Enterklucz powinien zawsze wywoływać przycisk wysyłania w formularzu.


30
Kolesie! Przeczytaj całe jego pytanie. Na stronie znajduje się już inny przycisk przesyłania, więc nie zadziałałoby to dla niego.
skybondsor

5
Ciekawostka, ostatnio próbowałem to zrobić w SharePoint. Jednak SharePoint ma już formularz, który otacza całą twoją zawartość, a wszelkie <form>tagi są wyrzucane przez inaczej liberalny parser HTML. Muszę więc przejąć naciśnięcia klawiszy lub odpaść. (BTW, naciśnięcie Enter w SharePoint uruchamia tryb edycji z jakiegoś powodu.

1
<button type="submit" onclick="return doSomething(this)">Value</button>Działa. Wskazówka leży w returnsłowach kluczowych
Gus

77

Ponieważ nikt addEventListenerjeszcze nie korzystał , oto moja wersja. Biorąc pod uwagę elementy:

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

Użyłbym następujących:

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

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

Pozwala to na osobną zmianę typu zdarzenia i akcji, przy jednoczesnym zachowaniu czystości HTML.

Zauważ , że prawdopodobnie warto upewnić się, że jest to poza <form>bo, ponieważ kiedy umieściłem w nich te elementy, naciśnięcie Enter przesłało formularz i ponownie załadowało stronę. Kilka mrugnięć odkryłem.

Dodatek : Dzięki komentarzowi @ruffin dodałem moduł obsługi brakujących zdarzeń oraz a, preventDefaultaby umożliwić temu kodowi (prawdopodobnie) działanie również wewnątrz formularza. (Przejdę do testowania tego, w którym momencie usunę treść w nawiasach).


14
Naprawdę nie rozumiem, dlaczego odpowiedź JQeuery ma więcej pozytywnych opinii. Płaczę za społecznością zajmującą się tworzeniem stron internetowych.
David

1
Jedyne, czego tak naprawdę brakuje, to argument w module obsługi naciśnięcia klawisza oraz e.preventDefault()polecenie pracy z formularzami. Zobacz moją (nową) odpowiedź .
ruffin

5
chyba że nie zamierzasz wprowadzać żadnych danych, powinieneś zrobić coś takiegoif (event.keyCode == 13) { event.preventDefault(); go.click();}
niezsynchronizowany

1
Używanie jQuery tylko do tego drobiazgu jest z pewnością bezużyteczne. Działa również bardzo łatwo z CSP i wymaga mniej czasu ładowania. Jeśli możesz, użyj tego.
Avamander

59

W prostym 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;
  }
};

Zauważyłem, że odpowiedź jest podana tylko w jQuery, więc pomyślałem o podaniu czegoś w zwykłym JavaScript.


20
document.layers? Nadal wspierasz Netscape? !!
Victor

6
Nie, nie musisz obsługiwać Netscape. blog.netscape.com/2007/12/28/…
kingdango

7
netscape.com już nawet nie istnieje (przekierowuje do aol.com), a jednak wciąż są ludzie wspierający nescape, niesamowite.
LeartS

6
evt.which ? evt.which : evt.keyCodejest równyevt.which || evt.keyCode
użytkownik

3
@LeartS Założę się, że ponieważ wciąż są ludzie używający Netscape.
SantiBailors

23

Jedna podstawowa sztuczka, której możesz użyć do tego, o której nie wspomniałem w pełni. Jeśli chcesz wykonać akcję ajax lub wykonać inną pracę na Enter, ale nie chcesz przesyłać formularza, możesz to zrobić:

<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>

Ustawienie akcji = "javascript: void (0);" taki skrót to zasadniczo zapobieganie domyślnemu zachowaniu. W tym przypadku wywoływana jest metoda bez względu na to, czy naciśniesz klawisz Enter, czy klikniesz przycisk, a następnie zostanie wykonane wywołanie ajax w celu załadowania niektórych danych.


To lepsze rozwiązanie do obsługi urządzeń mobilnych. Automatycznie ukrywa klawiaturę na urządzeniach z Androidem, a także iOS, jeśli dodasz searchCriteria.blur();do onsubmit.
Aaron Gillion

To nie zadziała, ponieważ na stronie znajduje się już inny przycisk przesyłania.
Jose Gómez

@ JoseGómez, strona może mieć tyle przycisków przesyłania, ile chce deweloper, uruchamiane tylko przez odpowiadające im pola. Wystarczy mieć odrębne formularze dla każdej grupy pól / prześlij. Strona nie jest ograniczona do jednego formularza.
Frédéric

@Frederic: z pytania, które (źle?) Zrozumiałem, że drugi przycisk wysyłania był w tej samej formie: „Na mojej bieżącej stronie jest już inny przycisk
Jose Gómez

1
To świetna odpowiedź, ponieważ pozwala na niestandardowe działania, ale pozwala uniknąć zbędnego wymyślnego kodu zastępującego.
Beejor,

16

Spróbuj:

<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

Aby uruchomić wyszukiwanie przy każdym naciśnięciu klawisza Enter, użyj:

$(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();}};"

To tylko coś, co mam z nieco niedawnego projektu ... Znalazłem to w sieci i nie mam pojęcia, czy jest lepszy sposób, czy nie w zwykłym starym JavaScript.


14

Używaj keypressi event.key === "Enter"z nowoczesnym JS!

const textbox = document.getElementById("txtSearch");
textbox.addEventListener("keypress", function onEvent(event) {
    if (event.key === "Enter") {
        document.getElementById("btnSearch").click();
    }
});

Dokumenty Mozilla

Obsługiwane przeglądarki


13

Chociaż jestem całkiem pewien, że tak długo, jak w formularzu jest tylko jedno pole i jeden przycisk przesyłania, naciśnięcie Enter powinno przesłać formularz, nawet jeśli na stronie jest inny formularz.

Następnie możesz przechwycić formularz onsubmit za pomocą js i wykonać dowolną walidację lub wywołania zwrotne, jakie chcesz.


13

Nikt nie zauważył html attibute „klucz dostępu”, który jest dostępny od dłuższego czasu.

Jest to sposób na javascript do skrótów klawiaturowych.

accesskey_browsers

Klucz dostępu przypisuje skróty do MDN

Przeznaczony do użycia w ten sposób. Sam atrybut html wystarczy, jednak możemy zmienić symbol zastępczy lub inny wskaźnik w zależności od przeglądarki i systemu operacyjnego. Skrypt jest niesprawdzonym podejściem od podstaw, aby dać pomysł. Możesz użyć detektora biblioteki przeglądarki, takiego jak mały Bowser

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
Dostęp ma dwa s.
kaiser

2
Nie wydaje się odpowiadać na pytanie OP dotyczące specjalnego przypadku klucza = ENTER
Ozan Bellik

12

To rozwiązanie dla wszystkich miłośników YUI :

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

W tym szczególnym przypadku miałem lepsze wyniki przy użyciu YUI do wyzwalania obiektów DOM, które zostały wstrzyknięte z funkcją przycisku - ale to inna historia ...


12

W Angular2 :

(keyup.enter)="doSomething()"

Jeśli nie chcesz wizualnego sprzężenia zwrotnego w przycisku, dobrym pomysłem jest nie odwoływać się do przycisku, a raczej bezpośrednio wywoływać kontroler.

Identyfikator nie jest również potrzebny - inny sposób na rozdzielenie widoku i modelu w NG2.


1
Oto pytanie o dalsze informacje na temat opcji
klucza

10

W tym przypadku chcesz również wyłączyć przycisk Enter z Księgowania na serwer i wykonać skrypt 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

Ten onchange próba jest blisko, ale niegrzeczne w stosunku do przeglądarki, a następnie z powrotem do przodu (na Safari 4.0.5 i Firefox 3.6.3), więc ostatecznie nie polecam go.

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

Należy również wspomnieć, że uruchamia się w przypadku braku ostrości.
FluorescentGreen5

8
event.returnValue = false

Użyj go podczas obsługi zdarzenia lub w funkcji wywoływanej przez moduł obsługi zdarzeń.

Działa przynajmniej w Internet Explorerze i Operze.


8

Na jquery mobile musiałem to zrobić

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

2
.livejest przestarzałe w jQuery 1.7. Czy w jQuery Mobile nadal uważa się to za prawidłowe?
Barmar

8

Aby dodać całkowicie proste rozwiązanie JavaScript, które rozwiązało problem @ icedwater ze złożeniem formularza , oto kompletne rozwiązanie zform .

UWAGA: Dotyczy to „nowoczesnych przeglądarek”, w tym IE9 +. Wersja IE8 nie jest dużo bardziej skomplikowana i można się jej tutaj nauczyć .


Skrzypce: 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
Komentarze negatywne bez wyjaśnień utrudniają rozwiązywanie twoich problemów. Daj mi znać, co wydaje się niewłaściwe, a chętnie podejmę dalsze działania.
ruffin

7

W nowoczesnym, nieaktualnym (bez keyCodelub onkeydown) JavaScript:

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

To jest, moim zdaniem, najprostsza odpowiedź, która działa. W moim przypadku użycia zaktualizowałem go do onkeypress = "inputKeyPressed (event)", a następnie obsłużyłem event.which parametr w samej funkcji. Na przykład klawisz Enter zwraca zdarzenie. Jako 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();
    }
};

Oto moje dwa centy. Pracuję nad aplikacją dla systemu Windows 8 i chcę, aby przycisk zarejestrował zdarzenie kliknięcia po naciśnięciu przycisku Enter. Robię to w JS. Wypróbowałem kilka sugestii, ale miałem problemy. To działa dobrze.


Rodzaj przesady, aby umieścić moduł obsługi zdarzeń w dokumencie. Jeśli miałeś charCode13 gdziekolwiek indziej, strzelasz printResult().
ruffin

5

Aby to zrobić za pomocą jQuery:

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

Aby to zrobić za pomocą normalnego JavaScript:

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

5

Dla tych, którzy mogą lubić zwięzłość i nowoczesne podejście js.

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

gdzie input jest zmienną zawierającą twój element wejściowy.


0

W jQuery możesz użyć event.which==13. Jeśli masz form, możesz użyć $('#formid').submit()(z poprawnymi detektorami zdarzeń dodanymi do przesłanego formularza).

$('#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

Opracowałem niestandardowy język JavaScript, aby osiągnąć tę funkcję, po prostu dodając klasę

Przykład: <button type="button" class="ctrl-p">Custom Print</button>

Tutaj Sprawdź to Fiddle
- lub -
sprawdź działający przykład https://stackoverflow.com/a/58010042/6631280

Uwaga: na bieżącej logice musisz nacisnąć Ctrl+ Enter


0

W nowoczesnym JS keyUpjest przestarzałe, użyj keyzamiast niego

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

-4

Może to również pomóc, mała funkcja JavaScript, która działa dobrze:

<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)" />

Wiem, że to pytanie zostało rozwiązane, ale właśnie znalazłem coś, co może być pomocne dla innych.


5
Pytanie dotyczyło naciśnięcia przycisku za pomocą klawisza Enter w polu tekstowym. Twoje rozwiązanie dotyczy funkcji typu „znak wodny”.
kdenney
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.