Dans la page suivante, avec Firefox, le bouton Supprimer soumet le formulaire, mais pas le bouton Ajouter. Comment empêcher le bouton Supprimer de soumettre le formulaire?
<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
function addItem() {
var v = $('form :hidden:last').attr('name');
var n = /(.*)input/.exec(v);
var newPrefix;
if (n[1].length == 0) {
newPrefix = '1';
} else {
newPrefix = parseInt(n[1]) + 1;
}
var oldElem = $('form tr:last');
var newElem = oldElem.clone(true);
var lastHidden = $('form :hidden:last');
lastHidden.val(newPrefix);
var pat = '=\"' + n[1] + 'input';
newElem.html(newElem.html().replace(new RegExp(pat, 'g'), '=\"' + newPrefix + 'input'));
newElem.appendTo('table');
$('form :hidden:last').val('');
}
function removeItem() {
var rows = $('form tr');
if (rows.length > 2) {
rows[rows.length - 1].html('');
$('form :hidden:last').val('');
} else {
alert('Cannot remove any more rows');
}
}
</script>
</head>
<body>
<form autocomplete="off" method="post" action="">
<p>Title:<input type="text" /></p>
<button onclick="addItem(); return false;">Add Item</button>
<button onclick="removeItem(); return false;">Remove Last Item</button>
<table>
<th>Name</th>
<tr>
<td><input type="text" id="input1" name="input1" /></td>
<td><input type="hidden" id="input2" name="input2" /></td>
</tr>
</table>
<input id="submit" type="submit" name="submit" value="Submit">
</form>
</body>
</html>
Réponses:
Vous utilisez un élément de bouton HTML5. Rappelez-vous que la raison est que ce bouton a un comportement par défaut de soumission, comme indiqué dans la spécification W3, comme indiqué ici: Bouton HTML5 W3C
Vous devez donc spécifier explicitement son type:
afin de remplacer le type de soumission par défaut. Je veux juste souligner la raison pour laquelle cela se produit =)
=)
la source
Définissez le type sur vos boutons:
... cela les empêchera de déclencher une action de soumission lorsqu'une exception se produit dans le gestionnaire d'événements. Ensuite, corrigez votre
removeItem()
fonction afin qu'elle ne déclenche pas d'exception:Notez le changement: votre code d'origine a extrait un élément HTML de l'ensemble jQuery, puis a essayé d'appeler une méthode jQuery dessus - cela a généré une exception, entraînant le comportement par défaut du bouton.
FWIW, il y a une autre façon de procéder avec cela ... Câblez vos gestionnaires d'événements à l'aide de jQuery et utilisez la méthode preventDefault () sur l' objet événement de jQuery pour annuler le comportement par défaut à l'avance:
Cette technique conserve toute votre logique au même endroit, ce qui facilite le débogage ... elle vous permet également d'implémenter une solution de repli en changeant
type
les boutons sursubmit
et en gérant l'événement côté serveur - cela est connu comme discret JavaScript .la source
return false
est si important. parfois même l'utiliser pour le bouton soumettre (onclick
)Il y a quelque temps, j'avais besoin de quelque chose de très similaire ... et je l'ai eu.
Donc, ce que je mets ici, c'est comment je fais les astuces pour avoir un formulaire pouvant être soumis par JavaScript sans aucune validation et exécuter la validation uniquement lorsque l'utilisateur appuie sur un bouton (généralement un bouton d'envoi).
Pour l'exemple, j'utiliserai un formulaire minimal, uniquement avec deux champs et un bouton de soumission.
Rappelez-vous ce qui est recherché: à partir de JavaScript, il doit pouvoir être soumis sans aucune vérification. Cependant, si l'utilisateur appuie sur un tel bouton, la validation doit être effectuée et le formulaire envoyé uniquement s'il réussit la validation.
Normalement, tout commencerait à partir de quelque chose près de cela (j'ai supprimé tous les trucs supplémentaires sans importance):
Voyez comment la balise de formulaire n'a pas
onsubmit="..."
(rappelez-vous que c'était une condition pour ne pas l'avoir).Le problème est que le formulaire est toujours soumis, qu'il
onclick
retournetrue
oufalse
.Si je change
type="submit"
pourtype="button"
, cela semble fonctionner mais ne fonctionne pas. Il n'envoie jamais le formulaire, mais cela peut se faire facilement.J'ai finalement utilisé ceci:
Et sur
function Validator
, oùreturn True;
est, j'ajoute également une phrase de soumission JavaScript, quelque chose de similaire à ceci:C'est
id=""
juste pour JavaScriptgetElementById
,name=""
c'est juste pour qu'il apparaisse sur les données POST.De cette façon, cela fonctionne comme j'ai besoin.
Je mets cela uniquement pour les personnes qui n'ont besoin d'aucune
onsubmit
fonction sur le formulaire, mais je fais une validation lorsqu'un utilisateur appuie sur un bouton.Pourquoi je n'ai besoin d'aucune soumission sur la balise de formulaire? Facile, sur d'autres parties JavaScript, je dois effectuer une soumission mais je ne veux pas qu'il y ait de validation.
La raison: si l'utilisateur est celui qui effectue la soumission, je veux et que la validation soit effectuée, mais s'il s'agit de JavaScript, je dois parfois effectuer la soumission alors que de telles validations l'éviteraient.
Cela peut sembler étrange, mais pas en pensant par exemple: à une connexion ... avec quelques restrictions ... comme ne pas autoriser les sessions PHP et les cookies ne sont pas autorisés!
Donc, tout lien doit être converti en un tel formulaire, afin que les données de connexion ne soient pas perdues. Lorsqu'aucune connexion n'est encore effectuée, cela doit également fonctionner. Aucune validation ne doit donc être effectuée sur les liens. Mais je veux présenter un message à l'utilisateur si l'utilisateur n'a pas entré les deux champs, user et pass. Donc, s'il en manque un, le formulaire ne doit pas être envoyé! il y a le problème.
Voir le problème: le formulaire ne doit pas être envoyé lorsqu'un champ est vide uniquement si l'utilisateur a appuyé sur un bouton, s'il s'agit d'un code JavaScript, il doit pouvoir être envoyé.
Si je fais le travail sur
onsubmit
la balise de formulaire, j'aurais besoin de savoir s'il s'agit de l'utilisateur ou d'un autre JavaScript. Puisqu'aucun paramètre ne peut être passé, ce n'est pas possible directement, donc certaines personnes ajoutent une variable pour dire si la validation doit être effectuée ou non. La première chose sur la fonction de validation est de vérifier la valeur de cette variable, etc ... Trop compliqué et le code ne dit pas ce que l'on veut vraiment.La solution n'est donc pas d'avoir onsubmit sur la balise form. Insead le mettre là où il est vraiment nécessaire, sur le bouton.
Pour l'autre côté, pourquoi mettre du code onsubmit puisque conceptuellement je ne veux pas de validation onsubmit. Je veux vraiment la validation des boutons.
Non seulement le code est plus clair, il est là où il doit être. N'oubliez pas ceci: - Je ne veux pas que JavaScript valide le formulaire (cela doit toujours être fait par PHP côté serveur) - Je veux montrer à l'utilisateur un message disant que tous les champs ne doivent pas être vides, qui ont besoin de JavaScript (client côté)
Alors pourquoi certaines personnes (pensez ou dites-moi) cela doit être fait sur une validation onsumbit? Non, conceptuellement, je ne fais pas de validation onsumbit côté client. Je fais juste quelque chose sur un bouton pressé, alors pourquoi ne pas simplement laisser cela être mis en œuvre?
Eh bien, ce code et ce style font parfaitement l'affaire. Sur tout JavaScript dont j'ai besoin pour envoyer le formulaire que je viens de mettre:
Et cela saute la validation lorsque je n'en ai pas besoin. Il envoie simplement le formulaire et charge une page différente, etc.
Mais si l'utilisateur clique sur le bouton Soumettre (alias
type="button"
nontype="submit"
), la validation est effectuée avant de laisser le formulaire soumis et s'il n'est pas valide, il n'est pas envoyé.J'espère que cela aide les autres à ne pas essayer de code long et compliqué. Ne l'utilisez pas
onsubmit
si vous n'en avez pas besoin et utilisez-leonclick
. Mais n'oubliez pas de passertype="submit"
àtype="button"
et s'il vous plaît n'oubliez pas de le fairesubmit()
par JavaScript.la source
Je suis d'accord avec Shog9, bien que je puisse utiliser à la place:
Selon w3schools , la
<button>
balise a un comportement différent sur différents navigateurs.la source
Supposons que votre formulaire HTML comporte
id="form_id"
Ajoutez cet extrait jQuery à votre code pour voir le résultat,
la source
Vous pouvez simplement obtenir la référence de vos boutons en utilisant jQuery, et empêcher sa propagation comme ci-dessous:
la source
e.preventDefault(); e.stopPropagation();
suffit pour que les choses fonctionnent.e.stopImmediatePropagation()
cela génère une erreur de méthode non définie dans Chrome.$("form").submit(function () { return false; });
cela empêchera le bouton de se soumettre ou vous pouvez simplement changer le type de bouton en "bouton"<input type="button"/>
au lieu de<input type="submit"/>
Qui ne fonctionnera que si ce bouton n'est pas le seul bouton de ce formulaire.la source
Il s'agit d'une erreur html5 comme cela a été dit, vous pouvez toujours avoir le bouton en tant que soumission (si vous souhaitez couvrir à la fois les utilisateurs javascript et non javascript) en l'utilisant comme:
De cette façon, vous annulerez la soumission, mais vous ferez tout ce que vous faites dans les fonctions jquery ou javascript et vous effectuerez la soumission pour les utilisateurs qui ne disposent pas de javascript.
la source
Je suis sûr que sur FF le
la fonction rencontre une erreur JavaScript, cela ne s'est pas produit sur IE
Lorsque l'erreur javascript apparaît, le code "return false" ne s'exécute pas, ce qui rend la page à poster
la source
Le retour false empêche le comportement par défaut. mais le retour faux rompt le bouillonnement d'événements de clic supplémentaires. Cela signifie que s'il existe d'autres liaisons de clic après l'appel de cette fonction, les autres ne sont pas prises en compte.
Ou simplement vous pouvez mettre comme ça
la source
Ajoutez simplement
e.preventDefault();
votre méthode pour empêcher votre page de soumettre des formulaires.Selon les documents Web MDN
la source
la source
Vous pouvez retourner false à la fin de la fonction ou après l'appel de fonction.
Tant que c'est la dernière chose qui se produit, le formulaire ne sera pas envoyé.
la source
Voici une approche simple:
la source
L'exemple de code suivant vous montre comment empêcher le clic du bouton de soumettre le formulaire.
Vous pouvez essayer mon exemple de code:
la source
Je ne suis pas en mesure de tester cela pour le moment, mais je pense que vous pourriez utiliser la méthode preventDefault de jQuery .
la source
La fonction removeItem contient en fait une erreur, ce qui fait que le bouton du formulaire fait son comportement par défaut (soumission du formulaire). La console d'erreur javascript donnera généralement un pointeur dans ce cas.
Découvrez la fonction removeItem dans la partie javascript:
La ligne:
ne fonctionne pas. Essayez plutôt ceci:
la source