J'ai le suivant:
<script type="text/javascript">
function CancelFormButton(button) {
$(button.form).submit();
}
</script>
<form onsubmit="alert('here');">
<input type="button" value="Cancel" onClick="CancelFormButton(this);" />
</form>
Lorsque je clique sur le bouton "Annuler", l'envoi de la balise de formulaire n'est pas déclenché.
Au lieu de cela, cette ligne soumet le formulaire avec succès: $(button.form).submit();
mais ignore la alert('here');
dans la sous-soumission de la balise de formulaire.
Est-ce correct ou est-ce que je fais quelque chose de mal?
À propos, dans ce cas, je veux cette fonctionnalité, mais je me demande simplement si je vais rencontrer un problème dans un navigateur où l’envoi est déclenché.
Désolé, j'ai mal compris votre question.
Selon Javascript - capturer onsubmit lors de l'appel de form.submit () :
On m'a récemment demandé: "Pourquoi l'événement Form.onsubmit n'est-il pas déclenché lorsque je soumets mon formulaire à l'aide de javascript?"
La réponse: les navigateurs actuels ne le font pas adhérer à cette partie du code HTML spécification. L'événement ne déclenche que quand il est activé par un utilisateur - et ne se déclenche pas lorsqu'il est activé par code.
(emphase ajoutée).
Remarque: "activé par un utilisateur" inclut également les boutons de soumission (probablement le comportement de soumission par défaut à partir de la touche Entrée mais je n'ai pas essayé cela). Je crois que cela ne se déclenche pas non plus si vous (avec le code) cliquez sur un bouton d'envoi.
Ce travail résoudra le problème trouvé par @Cletus.
function submitForm(form) {
//get the form element's document to create the input control with
//(this way will work across windows in IE8)
var button = form.ownerDocument.createElement('input');
//make sure it can't be seen/disrupts layout (even momentarily)
button.style.display = 'none';
//make it such that it will invoke submit if clicked
button.type = 'submit';
//append it and click it
form.appendChild(button).click();
//if it was prevented, make sure we don't get a build up of buttons
form.removeChild(button);
}
Travaillera sur tous les navigateurs modernes.
Travaillera sur plusieurs fenêtres enfants/onglets (oui, même dans IE <9).
Et est à la vanille!
Il suffit de lui transmettre une référence DOM à un élément de formulaire et il s'assurera que tous les écouteurs attachés, onsubmit, et (si cela n'est pas empêché d'ici là), soumettent enfin le formulaire.
Je suppose qu'il est raisonnable de vouloir ce comportement dans certains cas, mais je dirais que le code ne déclenchant pas la soumission d'un formulaire doit (toujours) être le comportement par défaut. Supposons que vous souhaitiez capturer la soumission d’un formulaire avec
$("form").submit(function(e){
e.preventDefault();
});
et ensuite faire une validation sur l'entrée. Si le code pouvait déclencher des gestionnaires de soumission, vous ne pourriez jamais inclure
$("form").submit()
à l’intérieur de ce gestionnaire car il en résulterait une boucle infinie (le gestionnaire SAME serait appelé, empêcherait la soumission, validerait et soumettrait à nouveau). Vous devez pouvoir soumettre manuellement un formulaire dans un gestionnaire d'envoi sans déclencher le même gestionnaire.
Je réalise que cela ne répond pas directement à la question, mais il y a beaucoup d'autres réponses sur cette page sur la manière dont cette fonctionnalité peut être piratée, et j'estimais que cela devait être signalé (et que c'est trop long pour un commentaire).
Ma solution simple:
$("form").children('input[type="submit"]').click();
C'est un travail pour moi.
Essayez de déclencher un événement () dans votre fonction:
$("form").trigger('submit'); // and then... do submit()
J'ai trouvé cette question il y a quelques années.
récemment, j'ai essayé de "réécrire" la méthode d'envoi. ci-dessous est mon code
window.onload= function (){
for(var i= 0;i<document.forms.length;i++){
(function (p){
var form= document.forms[i];
var originFn= form.submit;
form.submit=function (){
//do something you like
alert("submitting "+form.id+" using submit method !");
originFn();
}
form.onsubmit= function (){
alert("submitting "+form.id+" with onsubmit event !");
}
})(i);
}
}
<form method="get" action="" id="form1">
<input type="submit" value="提交form1" />
<input type="button" name="" id="" value="button模拟提交1" onclick="document.forms[0].submit();" /></form>
C'est ce qui s'est passé dans IE, mais cela a échoué dans d'autres navigateurs pour la même raison que "cletus"
La solution la plus simple consiste à créer une entrée "temporaire" avec le type submit et le déclic de déclenchement:
var submitInput = $("<input type='submit' />");
$("#aspnetForm").append(submitInput);
submitInput.trigger("click");