Inserisci l'evento press key in JavaScript


330

Ho un formcon due caselle di testo, una a discesa seleziona e un pulsante di opzione . Quando entersi preme il tasto, desidero chiamare una funzione Javascript (definita dall'utente), ma quando lo premo viene inviato il modulo.

Come evitare che formvenga inviato quando entersi preme il tasto?

Risposte:


445
if(characterCode == 13)
{
    return false; // returning false will prevent the event from bubbling up.
}
else
{
    return true;
}

Ok, quindi immagina di avere la seguente casella di testo in un modulo:

<input id="scriptBox" type="text" onkeypress="return runScript(event)" />

Per eseguire uno script "definito dall'utente" da questa casella di testo quando viene premuto il tasto Invio e non è necessario inviare il modulo, ecco un codice di esempio . Si noti che questa funzione non esegue alcun controllo degli errori e molto probabilmente funzionerà solo in IE. Per fare questo, hai bisogno di una soluzione più solida, ma otterrai l'idea generale.

function runScript(e) {
    //See notes about 'which' and 'key'
    if (e.keyCode == 13) {
        var tb = document.getElementById("scriptBox");
        eval(tb.value);
        return false;
    }
}

la restituzione del valore della funzione avviserà il gestore dell'evento di non creare più bolle sull'evento e impedirà che l'evento keypress venga ulteriormente gestito.

NOTA:

È stato sottolineato che orakeyCode è deprecato . Anche la prossima migliore alternativa whichè stata deprecata .

Sfortunatamente lo standard preferito key, che è ampiamente supportato dai browser moderni, ha un comportamento instabile in IE e Edge . Qualunque cosa più vecchia di IE11 avrebbe comunque bisogno di un polyfill .

Inoltre, mentre l'avvertimento deprecato è alquanto inquietante keyCodee which, rimuoverli rappresenterebbe un enorme cambiamento decisivo verso un numero imprecisato di siti Web legacy. Per questo motivo, è improbabile che vadano ovunque in qualunque momento presto.


4
Cosa intendi esattamente per definito dall'utente? Ad esempio, l'utente digita alcuni script in una casella di testo e lo esegui usando Eval () ???
Josh,

1
È una situazione in cui PreventDefualt può essere utilizzato?

12
@ Stuart.Sklinar: eseguendo una valutazione in input, l'utente digitato nel browser non offre loro più controllo rispetto a se aprisse la console di comando in Chrome / FF / IE e digitasse lo script stesso. L'unica persona che possono ferire è loro stessi ... a meno che ovviamente non si stia imponendo la sicurezza sul server. Questo è un altro problema.
Josh,

1
@SteelBrain - Ancora una volta, dando a qualcuno una casella di testo che può digitare e quindi evalil contenuto premendo un pulsante non è diverso rispetto a se aprissero gli strumenti di sviluppo e lo facessero. Se questo fosse qualcosa che veniva salvato nel DB e poteva essere aperto da UN ALTRO utente, sarebbe un grosso problema, ma questo è un problema completamente indipendente da questo piccolo frammento.
Josh,


138

Usa entrambi event.whiche event.keyCode:

function (event) {
    if (event.which == 13 || event.keyCode == 13) {
        //code to execute here
        return false;
    }
    return true;
};

11
Perché sia ​​event.which che event.keyCode?
Alex Spurling,

35
Alcuni browser supportano il supporto di whichaltri keyCode. È buona norma includere entrambi.
user568109

Usa anche l' keydownevento invece di keyupokeypress
manish_s il

@Agiagnoc ma a quale evento dovrebbe essere associato?
Don Cheadle,

2
@manish, keypress ti dà più informazioni con cui giocare di keydown / up. stackoverflow.com/a/9905293/322537
Fzs2

78

Se stai usando jQuery:

$('input[type=text]').on('keydown', function(e) {
    if (e.which == 13) {
        e.preventDefault();
    }
});

1
Non sono riuscito a farlo funzionare. Il gestore si attiva, ma preventDefaultnon sembra interrompere l'invio del modulo, almeno in Chrome.
Drew Noakes,

19
È necessario utilizzare l'evento keydown anziché keyup:$('input[type=text]').on('keydown', function(e) { if (e.which == 13) { e.preventDefault(); } });
Petar Donchev Marinov

2
il keyup viene attivato DOPO l'invio e non può quindi annullarlo.
Pierre-Olivier Vares,

Sia keyup che keypress hanno funzionato per me. Sono andato con il tasto premuto. Grazie!
markiyanm,

'keydown'è corretto come affermano gli altri commentatori. Poiché non è stato modificato, aggiornerò la risposta. Ho usato questa risposta e sono rimasto bloccato per un po 'fino a quando sono tornato e ho guardato i commenti.
Matt K

71

event.key === "Invio"

Più recente e molto più pulito: usare event.key. Niente più codici numerici arbitrari!

const node = document.getElementsByClassName(".mySelect")[0];
node.addEventListener("keydown", function(event) {
    if (event.key === "Enter") {
        event.preventDefault();
        // Do more work
    }
});

Mozilla Docs

Browser supportati


Lo stavo cercando. ho visto la proprietà chiave nel registro della console di $ event. pensato che potrebbe essere più affidabile
Tatsu

non è solo una macro o un alias? c'è qualche vantaggio in termini di prestazioni usando questo codice?
clockw0rk,

1
keyCodeè deprecato. Questo è più leggibile e mantenibile di un intero magico nel tuo codice
Gibolt,


17

Sostituisci l' onsubmitazione del modulo per essere una chiamata alla tua funzione e aggiungi return false dopo di essa, ovvero:

<form onsubmit="javascript:myfunc();return false;" >

Non posso ignorare l'invio poiché ho un altro modulo da inviare in questa pagina
Shyju,

5
si, puoi. Javascript è un linguaggio basato sui prototipi. document.forms ["form_name"]. onsubmit = fucntion () {}
the_drow

Devo eseguire un'altra procedura di eliminazione quando viene inviato il modulo, quindi voglio mantenerlo così com'è
Shyju,

17

Una soluzione di reazione js

 handleChange: function(e) {
    if (e.key == 'Enter') {
      console.log('test');
    }


 <div>
    <Input type="text"
       ref = "input"
       placeholder="hiya"
       onKeyPress={this.handleChange}
    />
 </div>

9

Quindi forse la migliore soluzione per coprire quanti più browser possibile ed essere a prova di futuro sarebbe

if (event.which === 13 || event.keyCode === 13 || event.key === "Enter")

6

se vuoi farlo usando lo script puramente java ecco un esempio che funziona perfettamente

Diciamo che questo è il tuo file html

<!DOCTYPE html>
<html>
  <body style="width: 500px">
    <input type="text" id="textSearch"/> 
      <script type="text/javascript" src="public/js/popup.js"></script>
  </body>
</html>

nel tuo file popup.js basta usare questa funzione

var input = document.getElementById("textSearch");
input.addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        alert("yes it works,I'm happy ");
    }
});

5

Di seguito il codice aggiungerà listener per ENTERchiave su tutta la pagina.

Questo può essere molto utile nelle schermate con un solo pulsante di azione, ad esempio Login, Registrati, Invia, ecc.

<head>
        <!--Import jQuery IMPORTANT -->
        <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>

         <!--Listen to Enter key event-->
        <script type="text/javascript">

            $(document).keypress(function (e) {
                if (e.which == 13 || event.keyCode == 13) {
                    alert('enter key is pressed');
                }
            });
        </script>
    </head>

Testato su tutti i browser.


3

Una soluzione jQuery.

Sono venuto qui alla ricerca di un modo per ritardare l'invio del modulo fino a quando l'evento di sfocatura sull'input di testo era stato attivato.

$(selector).keyup(function(e){
  /*
   * Delay the enter key form submit till after the hidden
   * input is updated.
   */

  // No need to do anything if it's not the enter key
  // Also only e.which is needed as this is the jQuery event object.
  if (e.which !== 13) {
       return;
  }

  // Prevent form submit
  e.preventDefault();

  // Trigger the blur event.
  this.blur();

  // Submit the form.
  $(e.target).closest('form').submit();
});

Sarebbe bello ottenere una versione più generale che ha generato tutti gli eventi in ritardo anziché solo l'invio del modulo.


3

Un modo molto più semplice ed efficace dal mio punto di vista dovrebbe essere:

function onPress_ENTER()
{
        var keyPressed = event.keyCode || event.which;

        //if ENTER is pressed
        if(keyPressed==13)
        {
            alert('enter pressed');
            keyPressed=null;
        }
        else
        {
            return false;
        }
}

2

Utilizzando TypeScript, ed evita chiamate multiple sulla funzione

let el1= <HTMLInputElement>document.getElementById('searchUser');
el1.onkeypress = SearchListEnter;

function SearchListEnter(event: KeyboardEvent) {
    if (event.which !== 13) {
        return;
    }
    // more stuff
}

Questa domanda ha più di otto anni. Dattiloscritto non esisteva allora. Quindi sei sicuro di non rispondere a un'altra domanda?
Nico Haase,

2

Un po 'semplice

Non inviare il modulo premendo il tasto "Invio":

<form id="form_cdb" onsubmit="return false">

Eseguire la funzione premendo il tasto "Invio":

<input type="text" autocomplete="off" onkeypress="if(event.key === 'Enter') my_event()">

1

js nativo (recupera API)

document.onload = (() => {
    alert('ok');
    let keyListener = document.querySelector('#searchUser');
    // 
    keyListener.addEventListener('keypress', (e) => {
        if(e.keyCode === 13){
            let username = e.target.value;
            console.log(`username = ${username}`);
            fetch(`https://api.github.com/users/${username}`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((user)=>{
                console.log(`user = ${user}`);
            });
            fetch(`https://api.github.com/users/${username}/repos`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((repos)=>{
                console.log(`repos = ${repos}`);
                for (let i = 0; i < repos.length; i++) {
                     console.log(`repos ${i}  = ${repos[i]}`);
                }
            });
        }else{
            console.log(`e.keyCode = ${e.keyCode}`);
        }
    });
})();
<input _ngcontent-inf-0="" class="form-control" id="searchUser" placeholder="Github username..." type="text">


Perché client_id etc è stato incluso qui? Il codice è legittimo?
Eddyparkinson,

1
<form id="form1" runat="server" onkeypress="return event.keyCode != 13;">

Aggiungi questo codice nella tua pagina HTML ... disabiliterà ... Tasto Enter ...


0
<div class="nav-search" id="nav-search">
        <form class="form-search">
            <span class="input-icon">
                <input type="text" placeholder="Search ..." class="nav-search-input" id="search_value" autocomplete="off" />
                <i class="ace-icon fa fa-search nav-search-icon"></i>
            </span>
            <input type="button" id="search" value="Search" class="btn btn-xs" style="border-radius: 5px;">
        </form>

</div>

<script type="text/javascript">
    $("#search_value").on('keydown', function(e) {
        if (e.which == 13) {
             $("#search").trigger('click');
            return false;
        }
    });
    $("#search").on('click',function(){
        alert('You press enter');
    });
</script>

0

Soluzione Cross Browser

Alcuni browser meno recenti hanno implementato eventi keydown in un modo non standard.

KeyBoardEvent.key è il modo in cui dovrebbe essere implementato nei browser moderni.

which e keyCodesono deprecati al giorno d'oggi, ma non fa male controllare questi eventi in modo che il codice funzioni per gli utenti che usano ancora browser più vecchi come IE.

La isKeyPressedfunzione controlla se il tasto premuto è stato inserito e event.preventDefault()impedisce l'invio del modulo.

  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }

Esempio di lavoro minimo

JS

function isKeyPressed(event, expectedKey, expectedCode) {
  const code = event.which || event.keyCode;

  if (expectedKey === event.key || code === expectedCode) {
    return true;
  }
  return false;
}

document.getElementById('myInput').addEventListener('keydown', function(event) {
  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }
});

HTML

<form>
  <input id="myInput">
</form>

https://jsfiddle.net/tobiobeck/z13dh5r2/

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.