139 votes

Comment soumettre un formulaire avec JavaScript en cliquant sur un lien ?

Au lieu d'un bouton d'envoi, j'ai un lien :

<form>

  <a href="#"> submit </a>

</form>

Puis-je faire en sorte qu'il soumette le formulaire lorsqu'il est cliqué ?

0 votes

Je l'utilise pour intégrer un formulaire complètement caché dans une page. Mais il y a des sauts de ligne avant et après le lien. Viennent-ils de l'élément de formulaire ? Et je voudrais ouvrir le lien dans un nouvel onglet/une nouvelle page, target="_blank" ne semble pas fonctionner.

1 votes

tl;dr <a role="button" aria-label="submit form" href="javascript:void(0)" onclick="document.querySelector('form').submit()">Submit</a>

229voto

ComFreek Points 14185

Le meilleur moyen

Le meilleur moyen est d'insérer une balise d'entrée appropriée :

<input type="submit" value="submit" />

La meilleure méthode JS

<form id="form-id">
  <button id="your-id">submit</button>
</form>

var form = document.getElementById("form-id");

document.getElementById("your-id").addEventListener("click", function () {
  form.submit();
});

Entourez ce dernier code JavaScript par un DOMContentLoaded événement (choisissez seulement load pour compatibilité avec le passé ) si vous ne l'avez pas encore fait :

window.addEventListener("DOMContentLoaded", function () {
  var form = document.... // copy the last code block!
});

La méthode facile, mais non recommandable (l'ancienne réponse)

Ajouter un onclick au lien et un attribut id au formulaire :

<form id="form-id">

  <a href="#" onclick="document.getElementById('form-id').submit();"> submit </a>

</form>

Tous les moyens

Quel que soit le moyen que vous choisissez, vous devez appeler formObject.submit() à terme (où formObject est l'objet DOM du <form> tag).

Vous devez également lier un tel gestionnaire d'événement, qui appelle formObject.submit() Il est donc appelé lorsque l'utilisateur clique sur un lien ou un bouton spécifique. Il y a deux façons de procéder :

  • Recommandé : Lier un écouteur d'événements à l'objet DOM.

    // 1. Acquire a reference to our <form>.
    //    This can also be done by setting <form name="blub">:
    //       var form = document.forms.blub;
    
    var form = document.getElementById("form-id");
    
    // 2. Get a reference to our preferred element (link/button, see below) and
    //    add an event listener for the "click" event.
    document.getElementById("your-id").addEventListener("click", function () {
      form.submit();
    });
  • Non recommandé : Insérez du JavaScript en ligne. Il y a plusieurs raisons pour lesquelles cette technique n'est pas recommandable. L'un des principaux arguments est que vous mélangez le balisage (HTML) avec les scripts (JS). Le code devient désorganisé et plutôt difficile à maintenir.

    <a href="#" onclick="document.getElementById('form-id').submit();">submit</a>
    
    <button onclick="document.getElementById('form-id').submit();">submit</button>

Maintenant, nous arrivons au moment où vous devez décider de l'élément de l'interface utilisateur qui déclenche l'appel submit().

  1. Un bouton

    <button>submit</button>
  2. Un lien

    <a href="#">submit</a>

Appliquez les techniques susmentionnées afin d'ajouter un écouteur d'événements.

0 votes

Je voulais l'appliquer mais cela ne semble pas fonctionner de mon côté. Voici un bidouillage, jsfiddle.net/rbhr9wt2

0 votes

@user1149244 Dans le volet JavaScript de jsFiddle, cliquez sur "JavaScript", puis définissez "Load Type" sur "No wrap - in <body>". (ou <head>). Par défaut, il est réglé sur "onLoad", après quoi DOMContentReady ne se déclenche plus.

3 votes

Remarque : Si votre formulaire comporte un bouton avec attr name="submit" le submit() de votre formulaire ne sera pas accessible.

73voto

Maurice Points 1041

Si vous utilisez jQuery et que vous avez besoin d'une solution en ligne, cela fonctionnera très bien ;

<a href="#" onclick="$(this).closest('form').submit();">submit form</a>

Aussi, vous pourriez vouloir remplacer

<a href="#">text</a>

avec

<a href="javascript:void(0);">text</a>

afin que l'utilisateur ne fasse pas défiler la page vers le haut lorsqu'il clique sur le lien.

1 votes

Je crois qu'il serait préférable de le faire dans un <span>texte</span>. Ce n'est pas un lien, et href:javascript n'est pas bon. (bientôt mauvais avec les prochaines raisons de sécurité ... le javascript inlined doit être interdit un jour.

0 votes

Je suis d'accord. Compte tenu de la nature de la question, j'ai opté pour une réponse simple. Ce que je fais personnellement, c'est utiliser href="#" et ensuite sélectionner tous ces liens avec jquery et appeler e.preventDefault() dans le click pour que le navigateur ne défile pas.

3 votes

Je préfère personnellement cette réponse. Simple et propre et facile à mettre en œuvre si votre page utilise JQuery. Très flexible également, car j'ai une page contenant plusieurs formulaires et cela fonctionne parfaitement.

25voto

Darin Dimitrov Points 528142

Vous pourriez donner des identifiants au formulaire et au lien, puis vous abonner à la liste de diffusion. onclick événement du lien et submit le formulaire :

<form id="myform" action="" method="POST">
    <a href="#" id="mylink"> submit </a>
</form>

et ensuite :

window.onload = function() {
    document.getElementById('mylink').onclick = function() {
        document.getElementById('myform').submit();
        return false;
    };
};

Je vous recommande d'utiliser un bouton d'envoi pour soumettre les formulaires, car il respecte la sémantique du balisage et fonctionne même pour les utilisateurs dont le javascript est désactivé.

5voto

chris Points 1

cela fonctionne bien sans qu'aucune fonction spéciale ne soit nécessaire. Il est également beaucoup plus facile d'écrire avec php. <input onclick="this.form.submit()"/>

0 votes

L'OP a déclaré en cliquant sur un lien pas un élément d'entrée.

0 votes

Cela peut-il fonctionner en faisant quelque chose comme <input onclick="this.form.submit()"> Some Text</input>

3voto

Shashank Points 1
<form id="mailajob" method="post" action="emailthijob.php">
    <input type="hidden" name="action" value="emailjob" />
    <input type="hidden" name="jid" value="<?php echo $jobid; ?>" />
</form>

<a class="emailjob" onclick="document.getElementById('mailajob').submit();">Email this job</a>

3 votes

Pouvez-vous expliquer comment votre réponse répond réellement à la question ? Ajoutez-y plus de contexte, s'il vous plaît.

0 votes

Merci beaucoup, cela m'a aidé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X