J'ai un form
avec deux zones de texte, un sélectionner déroulant et un bouton radio. Quand le enter la touche est enfoncée, je souhaite appeler une fonction javascript (définie par l'utilisateur), mais lorsque j'appuie dessus, le formulaire est soumis.
Comment puis-je éviter que form
soit soumis lorsque le enter la touche est enfoncée?
if(characterCode == 13)
{
return false; // returning false will prevent the event from bubbling up.
}
else
{
return true;
}
Ok, alors imaginez que vous ayez la zone de texte suivante dans un formulaire:
<input id="scriptBox" type="text" onkeypress="return runScript(event)" />
Pour exécuter un script "défini par l'utilisateur" à partir de cette zone de texte lorsque vous appuyez sur la touche Entrée, sans le soumettre au formulaire, voici un code exemple. Veuillez noter que cette fonction ne vérifie pas les erreurs et ne fonctionnera probablement que dans IE. Pour ce faire, vous avez besoin d’une solution plus robuste, mais vous aurez l’idée générale.
function runScript(e) {
//See notes about 'which' and 'key'
if (e.keyCode == 13) {
var tb = document.getElementById("scriptBox");
eval(tb.value);
return false;
}
}
le renvoi de la valeur de la fonction avertira le gestionnaire d'événements de ne plus masquer l'événement et empêchera la gestion de l'événement de pression.
Il a été souligné que keyCode
est maintenant obsolète . La prochaine meilleure alternative which
a a également été déconseillée .
Malheureusement, la norme préférée key
, qui est largement prise en charge par les navigateurs modernes, présente un comportement dodgy dans IE et dans Edge . Tout ce qui est plus ancien que IE11 aurait toujours besoin d'un polyfill .
En outre, bien que l’avertissement déconseillé soit plutôt inquiétant pour keyCode
et which
, le fait de les supprimer représenterait un changement radical majeur en ce qui concerne un nombre incalculable de sites Web existants. Pour cette raison, il est peu probable qu'ils partent de si tôt.}
Utilisez à la fois event.which
et event.keyCode
:
function (event) {
if (event.which == 13 || event.keyCode == 13) {
//code to execute here
return false;
}
return true;
};
Si vous utilisez jQuery:
$('input[type=text]').on('keydown', function(e) {
if (e.which == 13) {
e.preventDefault();
}
});
Plus récent et beaucoup plus propre: utilisez event.key
. Plus de codes de nombres arbitraires!
const node = document.getElementsByClassName(".mySelect")[0];
node.addEventListener("keydown", function(event) {
if (event.key === "Enter") {
event.preventDefault();
// Do more work
}
});
Touche Détecter Entrée appuyée sur tout le document:
$(document).keypress(function (e) {
if (e.which == 13) {
alert('enter key is pressed');
}
});
Remplacez l'action onsubmit
du formulaire par un appel à votre fonction et ajoutez la valeur false après,
<form onsubmit="javascript:myfunc();return false;" >
Une solution js réaction
handleChange: function(e) {
if (e.key == 'Enter') {
console.log('test');
}
<div>
<Input type="text"
ref = "input"
placeholder="hiya"
onKeyPress={this.handleChange}
/>
</div>
Le code ci-dessous ajoutera un écouteur pour la clé ENTER
sur la page entière.
Cela peut être très utile dans les écrans avec un seul bouton Action, par exemple Login, Register, Submit, etc.
<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>
Testé sur tous les navigateurs.
Une solution jQuery.
Je suis venu ici pour chercher un moyen de retarder la soumission du formulaire jusqu'à ce que le flou sur le texte saisi ait été déclenché.
$(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();
});
Ce serait bien d’obtenir une version plus générale qui déclenche tous les événements retardés plutôt que de simplement envoyer le formulaire.
Utiliser TypeScript et éviter les appels multiples sur la fonction
let el1= <HTMLInputElement>document.getElementById('searchUser');
el1.onkeypress = SearchListEnter;
function SearchListEnter(event: KeyboardEvent) {
if (event.which !== 13) {
return;
}
// more stuff
}
Un moyen beaucoup plus simple et efficace de mon point de vue devrait être:
function onPress_ENTER()
{
var keyPressed = event.keyCode || event.which;
//if ENTER is pressed
if(keyPressed==13)
{
alert('enter pressed');
keyPressed=null;
}
else
{
return false;
}
}
Alors peut-être que la meilleure solution pour couvrir autant de navigateurs que possible et être la preuve du futur serait
if (event.which == 13 || event.keyCode == 13 || event.key === "Entrée")
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">
si vous voulez le faire en utilisant un script purement Java, voici un exemple qui fonctionne parfaitement
Disons que ceci est votre fichier 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>
dans votre popup.js fichier, utilisez simplement cette fonction
var input = document.getElementById("textSearch");
input.addEventListener("keyup", function(event) {
event.preventDefault();
if (event.keyCode === 13) {
alert("yes it works,I'm happy ");
}
});
N'envoyez pas le formulaire en appuyant sur "Entrée":
<form id="form_cdb" onsubmit="return false">
Exécuter la fonction en appuyant sur "Entrée":
<input type="text" autocomplete="off" onkeypress="if(event.key === 'Enter') my_event()">
<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>
Cette fonction preventKey()
fonctionne quelles que soient les fonctionnalités du navigateur, obsolètes.
Une seule des trois propriétés which
(obsolète), keyCode
(obsolète) ou key
(problèmes dans IE) doit être présente.
https://jsfiddle.net/tobiobeck/z13dh5r2/
JS
function preventKey(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 (preventKey(event, 'Enter', 13)) {
event.preventDefault();
}
});
HTML
<form>
<input id="myInput">
</form>
Test du navigateur
Si vous souhaitez tester différents navigateurs manuellement, commentez ou commentez l'une des trois lignes event.something
suivantes:
var event = {};
event.which = 13;
//event.keyCode = 13;
//event.key = 'Enter'
if (preventKey(event, 'Enter', 13)) {
console.log('enter was pressed');
}