Attiva un pulsante fai clic con JavaScript sul tasto Invio in una casella di testo


1293

Ho un input di testo e un pulsante (vedi sotto). Come posso usare JavaScript per attivare l'evento click del pulsante quando Entersi preme il tasto all'interno della casella di testo?

Esiste già un pulsante di invio diverso sulla mia pagina corrente, quindi non posso semplicemente rendere il pulsante un pulsante di invio. E voglio solo che il Entertasto faccia clic su questo pulsante specifico se viene premuto all'interno di questa casella di testo, nient'altro.

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

1
Nota importante per i principianti come me: la parte fondamentale di questa domanda è se hai già un modulo sulla pagina, quindi hai già un pulsante di invio. La risposta di jQuery è compatibile con più browser e una buona soluzione.
Joshua Dance,

2
@JoshuaDance, avere già un modulo / inviare non è un problema. Una pagina può avere molti moduli (ma non nidificati), ognuno con il proprio invio. Ogni campo di ciascun modulo attiverà solo l'invio di quel modulo. Come affermato da questa risposta .
Frédéric,

Risposte:


1426

In jQuery, funzionerebbe quanto segue:

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

O in semplice JavaScript, il seguente funzionerebbe:

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
Probabilmente è una pratica migliore interrogare event.che che event.keyCode o event.charCode, vedi developer.mozilla.org/en/DOM/event.charCode#Notes
William Niu

25
keydownnon keyupè l'evento migliore da usare. Inoltre, se stai usando asp.net return falsealla fine dovrai impedire a asp.net di intercettare ancora l'evento.
maxp

144
Il problema con l'utilizzo keydownè che tenere premuto invio genererà l'evento più e più volte. se ti attacchi keyupall'evento, si attiverà solo una volta rilasciata la chiave.
Steve Paulo,

26
Ho modificato il tuo codice aggiungendo event.preventDefault();prima di invocare la click();funzione mentre la mia pagina ha un modulo e sono passato keyupcon keypressil fatto che era l'unico gestore funzionante per me, comunque, grazie per il pezzo di codice pulito!
Adrian K.,

7
Ad essere onesti, jQuery era praticamente sinonimo di JS quando questa risposta è stata pubblicata. Ma ora molti di noi che evitano del tutto jQuery (perché è solo uno spreco di kb quando si utilizza qualcosa come React) si sentono infastiditi quando cerchiamo le risposte alle domande di JS e spesso la prima cosa che viene fuori è una libreria che doniamo non voglio dipendere.
Andy,

402

Quindi codificalo!

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

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

5
Sì, l'ho quasi fatto. Immagino sia solo una preferenza personale ... Mi piace l'approccio più modulare. ;)
kdenney,

9
se è necessario interrompere l'inoltro del modulo: onkeydown = "if (event.keyCode == 13) {document.getElementById ('btnSubmit'). click (); event.returnValue = false; event.cancel = true;}"
Gabriel Chung,

3
Questo ha funzionato per me perché il metodo inline, invece di chiamare la funzione con un codice simile, consente di restituire false sulla chiamata ed evitare il postback. Nel mio caso il metodo "click" invoca una chiamata asincrona __doPostback e senza "return false;" ricaricherebbe semplicemente la pagina.
Dave,

3
Sono d'accordo con Sam, questo codice con questo codice JS in linea è brutto da morire. Devi sempre separare i codici HTML e JavaScript.
Sk8erPeter,

9
@ Sam Non ottenere mai la tua saggezza dai burattini . Il dolore porta alla paura e la paura è l'assassino della mente. La paura è la piccola morte che porta alla totale cancellazione. Affronterò la mia paura. Permetterò che mi passi sopra e attraverso di me. E quando sarà passato, girerò l'occhio interiore per vedere il suo cammino. Dove è finita la paura non ci sarà nulla. Tranne forse i gestori di eventi inline. Quindi, sì, per favore separa i gestori di eventi dalla tua vista / markup, come fa questa risposta . ; ^)
Ruffin il

179

Capito questo:

<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; // il modo più breve per ottenere l'evento
Victor

2
La migliore opzione JavaScript semplice. L'aggiunta di JavaScript come attributo in HTML richiede molto spazio e jQuery è solo jQuery (la compatibilità non è garantita). Grazie per la soluzione!
Boxspah

e se si restituisce false all'interno dell'if, è possibile evitare che la chiave venga ulteriormente elaborata: <input type = "text" id = "txtSearch" onkeypress = "searchKeyPress (event);" /> <input type = "button" id = "btnSearch" Value = "Search" onclick = "doSomething ();" /> <script> funzione searchKeyPress (e) {// cerca window.event nel caso in cui l'evento non sia passato in e = e || window.event; if (e.keyCode == 13) {document.getElementById ('btnSearch'). click (); restituire false; } return true; } </script>
Jose Gómez,

83

Rendi il pulsante un elemento di invio, quindi sarà automatico.

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

Nota che avrai bisogno di un <form>elemento contenente i campi di input per farlo funzionare (grazie Sergey Ilinsky).

Non è una buona pratica ridefinire il comportamento standard, la Enterchiave dovrebbe sempre chiamare il pulsante di invio su un modulo.


30
Dudes! Leggi la sua intera domanda. C'è già un altro pulsante di invio sulla pagina, quindi non funzionerebbe per lui.
skybondsor,

5
Fatto curioso, di recente ho provato a farlo in SharePoint. Tuttavia, SharePoint ha già un modulo che avvolge tutto il contenuto e tutti i <form>tag vengono eliminati dal parser HTML altrimenti liberale. Quindi devo dirottare i tasti o busto. (A proposito, premendo Invio in SharePoint avvia la modalità Modifica per qualche motivo. Immagino che la barra multifunzione stia utilizzando lo stesso modulo.)

1
A <button type="submit" onclick="return doSomething(this)">Value</button>funziona a. L'indizio si trova all'interno della returnparola chiave
Gus

77

Dal momento che nessuno ha addEventListenerancora usato , ecco la mia versione. Dati gli elementi:

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

Vorrei usare quanto segue:

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

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

Ciò consente di modificare il tipo di evento e l'azione separatamente mantenendo pulito l'HTML.

Si noti che probabilmente vale la pena assicurarsi che questo sia al di fuori di un <form>perché quando ho racchiuso questi elementi in essi premendo Invio ha inviato il modulo e ricaricato la pagina. Mi ci sono voluti alcuni battiti di ciglia per scoprire.

Addendum : grazie a un commento di @ruffin, ho aggiunto il gestore eventi mancante e un preventDefaultper consentire a questo codice di (presumibilmente) funzionare anche all'interno di un modulo. (Vado a provare questo, a quel punto rimuoverò il contenuto tra parentesi.)


14
Davvero non capisco perché la risposta di JQeuery abbia più voti. Piango per la comunità dello sviluppo web.
David,

1
Tutto quello che ti manca davvero è un argomento nel tuo gestore di tasti e un modo e.preventDefault()per farlo funzionare con i moduli. Vedi la mia (nuova) risposta .
ruffin,

5
a meno che tu non intenda che i tuoi utenti inseriscano effettivamente alcun dato, dovresti davvero fare qualcosa del genereif (event.keyCode == 13) { event.preventDefault(); go.click();}
non sincronizzato

1
L'uso di jQuery solo per questa piccola cosa è sicuramente inutile. Funziona anche molto facilmente con CSP e richiede meno tempo per il caricamento. Se puoi, usa questo.
Avamandro

59

In semplice 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;
  }
};

Ho notato che la risposta è data solo in jQuery, quindi ho pensato di dare qualcosa anche in JavaScript.


20
document.layers? Stai ancora supportando Netscape? !!
Victor,

6
No, non è necessario supportare Netscape. blog.netscape.com/2007/12/28/...
kingdango

7
netscape.com non esiste più (reindirizza a aol.com) eppure ci sono ancora persone che supportano nescape, fantastico.
LeartS

6
evt.which ? evt.which : evt.keyCodeè uguale aevt.which || evt.keyCode
utente

3
@LeartS Scommetto che è perché ci sono ancora persone che usano Netscape.
SantiBailors,

23

Un trucco di base che puoi usare per questo che non ho visto completamente menzionato. Se vuoi fare un'azione ajax o qualche altro lavoro su Enter ma non vuoi effettivamente inviare un modulo puoi farlo:

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

Setting action = "javascript: void (0);" come questo è una scorciatoia per prevenire il comportamento predefinito essenzialmente. In questo caso viene chiamato un metodo se si preme invio o si fa clic sul pulsante e viene effettuata una chiamata ajax per caricare alcuni dati.


Questa è una soluzione migliore per il supporto di dispositivi mobili. Nasconde automaticamente la tastiera sui dispositivi Android e anche iOS se aggiungi searchCriteria.blur();a onsubmit.
Aaron Gillion,

Questo non funzionerà, poiché esiste già un altro pulsante di invio nella pagina.
Jose Gómez,

@ JoseGómez, una pagina può avere tutti i pulsanti di invio desiderati dallo sviluppatore, attivati ​​solo dai campi corrispondenti. Basta avere forme distinte per ciascun gruppo di campi / invio. Una pagina non è limitata a un singolo modulo.
Frédéric,

@Frederic: dalla domanda che (mis?) Ho capito che l'altro pulsante di invio era nella stessa forma: "C'è già un altro pulsante di invio nella mia pagina corrente, quindi non posso semplicemente fare di un pulsante un pulsante di invio".
Jose Gómez,

1
Questa è un'ottima risposta poiché consente azioni personalizzate evitando tuttavia la necessità di un sacco di codice di override fantasia.
Beejor,

16

Provalo:

<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

Per attivare una ricerca ogni volta che si preme il tasto Invio, utilizzare questo:

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

Questo è solo qualcosa che ho da un progetto piuttosto recente ... L'ho trovato in rete e non ho idea se c'è un modo migliore o meno nel semplice vecchio JavaScript.


14

Usa keypresse event.key === "Enter"con JS moderno!

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

Mozilla Docs

Browser supportati


13

Tuttavia, sono abbastanza sicuro che fino a quando c'è un solo campo nel modulo e un pulsante di invio, premendo invio dovrebbe inviare il modulo, anche se c'è un altro modulo nella pagina.

È quindi possibile acquisire il modulo onsubmit con js ed eseguire qualsiasi convalida o callback desiderati.


13

Nessuno ha notato l'html attibute "accesskey" che è disponibile da un po '.

Questo non è un modo javascript per creare scorciatoie da tastiera.

accesskey_browsers

La chiave di accesso attribuisce scorciatoie su MDN

Inteso per essere usato in questo modo. L'attributo html stesso è sufficiente, tuttavia è possibile modificare il segnaposto o altri indicatori a seconda del browser e del sistema operativo. Lo script è un approccio scratch non testato per dare un'idea. Potresti voler utilizzare un rilevatore di librerie del browser come il minuscolo 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
L'accesso ha due s.
Kaiser

3
Non sembra rispondere alla domanda del PO attorno al caso speciale di chiave = INVIO
Ozan Bellik,

12

Questa è una soluzione per tutti gli amanti della YUI là fuori:

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

In questo caso speciale ho ottenuto risultati migliori usando YUI per innescare oggetti DOM a cui è stata iniettata la funzionalità pulsante - ma questa è un'altra storia ...


12

In Angular2 :

(keyup.enter)="doSomething()"

Se non si desidera un feedback visivo nel pulsante, è consigliabile non fare riferimento al pulsante ma richiamare direttamente il controller.

Inoltre, l'id non è necessario: un altro modo NG2 di separare tra la vista e il modello.


1
Ecco una domanda su ulteriori informazioni sulle opzioni keyup: stackoverflow.com/q/32155887/435605
AlikElzin-Kilaka

10

Questo nel caso in cui desideri anche digitare il pulsante di invio da Invio al server ed eseguire lo script 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

Questo tentativo di scambio è vicino, ma si comporta male rispetto al browser indietro e avanti (su Safari 4.0.5 e Firefox 3.6.3), quindi alla fine non lo consiglierei.

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

Dovrebbe anche menzionare che si innesca su unfocus.
FluorescentGreen5,

8
event.returnValue = false

Usalo quando gestisci l'evento o nella funzione chiamata dal gestore dell'evento.

Funziona almeno in Internet Explorer e Opera.


8

Per jquery mobile ho dovuto fare

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

2
.liveè obsoleto in jQuery 1.7. È ancora considerato OK in jQuery Mobile?
Barmar,

8

Per aggiungere una soluzione JavaScript completamente semplice che abbia risolto il problema di @ icedwater con l'invio del modulo , ecco una soluzione completa conform .

NOTA: questo è per "browser moderni", incluso IE9 +. La versione IE8 non è molto più complicata e può essere appresa qui .


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
Downvotes senza spiegazioni rendono difficile rispondere alle tue preoccupazioni. Fammi sapere cosa non sembra giusto e sarei felice di dare seguito.
Ruffin,

7

In Javascript moderno, non specificato (senza keyCodeo onkeydown):

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

Questa è secondo me la risposta più semplice che fa il lavoro. Nel mio caso d'uso, l'ho aggiornato a onkeypress = "inputKeyPressed (evento)" e quindi ho gestito il parametro event.ich nella funzione stessa. Il tasto Invio, ad esempio, restituisce l'evento.che come 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();
    }
};

Ecco i miei due centesimi. Sto lavorando su un'app per Windows 8 e voglio che il pulsante registri un evento clic quando premo il pulsante Invio. Lo sto facendo in JS. Ho provato un paio di suggerimenti, ma ho avuto problemi. Questo funziona bene.


Ordinamento di overkill per posizionare il gestore eventi sul documento. Se tu avessi uncharCode 13 da qualsiasi altra parte, stai sparando printResult().
ruffin,

5

Per farlo con jQuery:

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

Per farlo con JavaScript normale:

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

5

Per coloro che potrebbero desiderare la brevità e l'approccio moderno.

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

dove input è una variabile che contiene il tuo elemento input.


1

Poiché JS moderno keyCodeè obsoleto, utilizzare keyinvece

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

0

In jQuery, puoi usare event.which==13. Se si dispone di un form, è possibile utilizzare $('#formid').submit()(con i listener di eventi corretti aggiunti all'invio di tale modulo).

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

Ho sviluppato JavaScript personalizzato per ottenere questa funzione semplicemente aggiungendo classe

Esempio: <button type="button" class="ctrl-p">Custom Print</button>

Qui Dai un'occhiata a Fiddle
- o -
guarda l'esempio in esecuzione https://stackoverflow.com/a/58010042/6631280

Nota: sulla logica corrente, è necessario premere Ctrl+ Enter


-4

Questo potrebbe anche aiutare, una piccola funzione JavaScript, che funziona bene:

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

So che questa domanda è stata risolta, ma ho appena trovato qualcosa, che può essere utile per gli altri.


5
La domanda era per innescare un clic del pulsante con il tasto Invio in una casella di testo. La soluzione è per un tipo di funzionalità "filigrana".
Kdenney,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.