70 votes

Soumettre le formulaire et rester sur la même page ?

J'ai un formulaire qui ressemble à ceci

<form action="receiver.pl" method="post">
  <input name="signed" type="checkbox">
  <input value="Save" type="submit">
</form>

et je voudrais rester sur la même page, lorsque l'on clique sur Submit, mais avoir toujours receiver.pl exécuté.

Comment faire ?

3 votes

Le plus simple : ajouter target="_blank" - le moins simple : ajax

2 votes

Alors receiver.pl s'ouvre dans une nouvelle fenêtre/un nouvel onglet ?

84voto

jessegavin Points 20854

99% du temps, j'utiliserais XMLHttpRequest o aller chercher pour quelque chose comme ça. Cependant, il existe une solution alternative qui ne nécessite pas de javascript...

Vous pourriez inclure une iframe cachée sur votre page et définir l'attribut cible de votre formulaire pour qu'il pointe vers cette iframe.

<style>
  .hide { position:absolute; top:-1px; left:-1px; width:1px; height:1px; }
</style>

<iframe name="hiddenFrame" class="hide"></iframe>

<form action="receiver.pl" method="post" target="hiddenFrame">
  <input name="signed" type="checkbox">
  <input value="Save" type="submit">
</form>

Il y a très peu de scénarios où je choisirais cette voie. En général, il est préférable de le gérer avec javascript car, avec javascript, vous pouvez...

  • gérer gracieusement les erreurs (par exemple, réessayer)
  • fournir des indicateurs d'interface utilisateur (par exemple, chargement, traitement, succès, échec)
  • exécuter la logique avant l'envoi de la demande, ou exécuter la logique après la réception de la réponse.

70voto

Herman Schaaf Points 9938

La réponse la plus simple : jQuery. Faites quelque chose comme ceci :

$(document).ready(function(){
   var $form = $('form');
   $form.submit(function(){
      $.post($(this).attr('action'), $(this).serialize(), function(response){
            // do something here on success
      },'json');
      return false;
   });
});

Si vous voulez ajouter du contenu de manière dynamique tout en ayant besoin que cela fonctionne, et aussi avec plus d'un formulaire, vous pouvez le faire :

   $('form').live('submit', function(){
      $.post($(this).attr('action'), $(this).serialize(), function(response){
            // do something here on success
      },'json');
      return false;
   });

0 votes

Cela semble très intéressant ! Comment puis-je lui dire d'exécuter le receiver.pl script ?

0 votes

La partie où il est écrit "$form.attr('action')" fait cela - elle indique à la fonction submit de jQuery d'appeler l'action spécifiée par le formulaire ('receiver.pl'), sans quitter la page, c'est-à-dire en utilisant AJAX.

0 votes

Je dois faire quelque chose de mal alors, parce qu'il change toujours la page en receiver.pl J'ai ajouté votre code à la section de l'en-tête, et inclus <script src="http://code.jquery.com/jquery-1.5.js"></script> . Dois-je faire d'autres changements ?

41voto

Dave Cross Points 17363

La façon HTTP/CGI de faire cela serait que votre programme renvoie un code d'état HTTP de 204 (No Content).

4 votes

Super cool ! J'ai appris quelque chose de nouveau aujourd'hui. Cependant, en termes pratiques, vous voudriez vraiment fournir à l'utilisateur une sorte de retour visuel que la soumission du formulaire a été traitée par le serveur. Il semble que les navigateurs ne fournissent pas ce type d'information d'emblée, donc l'utilisation d'AJAX pour interpréter le HTTP 204 serait probablement la meilleure solution.

0 votes

Wow... Merci... Cette astuce est vraiment étonnante, elle ne résout pas exactement à 100% le problème que j'ai mais c'est définitivement une solution temporaire. Merci beaucoup !

0 votes

C'est génial. Merci.

2voto

Eric Frick Points 809

Lorsque vous cliquez sur le bouton "Envoyer", la page est envoyée au serveur. Si vous voulez l'envoyer de manière asynchrone, vous pouvez le faire avec ajax.

2voto

Hasan A Yousef Points 4851

Utilice XMLHttpRequest

var xhr = new XMLHttpRequest();
xhr.open("POST", '/server', true);

//Send the proper header information along with the request
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xhr.onreadystatechange = function() { // Call a function when the state changes.
    if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
        // Request finished. Do processing here.
    }
}
xhr.send("foo=bar&lorem=ipsum");
// xhr.send(new Int8Array()); 
// xhr.send(document);

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