2010-12-15 69 views
3

J'utilise jQuery pour envoyer un formulaire dans une application MVC. J'ai un point d'arrêt à l'intérieur du contrôleur et je vois qu'il est frappé deux fois. Qu'est-ce que je fais mal?Pourquoi est-ce que je soumets le formulaire deux fois? jQuery submit() avec le bouton radio

Voici mon jQuery

(function ($) { 

    $(document).ready(function() { 

     $(':radio').change(function() { 

      $('#frmMDR').submit(); 
     }); 

    }); 
})(jQuery); 

et voici le formulaire html

<form action="/Module/ModuleIndex" id="frmMDR" method="get"> 
    <input id="rdoMaintenance" name="module" type="radio" value="Maintenance" /><label for="rdoMaintenance">M</label> 
    <input id="rdoDiagnostics" name="module" type="radio" value="Diagnostics" /><label for="rdoDiagnostics">D</label> 
    <input id="rdoRepair" name="module" type="radio" value="Repair" /><label for="rdoRepair">R</label> 
<input id="hdnVehicle" name="hdnVehicle" type="hidden" value="" /> 
</form> 

Je suppose que je ne devrais pas utiliser l'événement de changement. Si quelqu'un sait comment corriger le problème, j'aimerais entendre des idées. Merci beaucoup pour tous les conseils.

Cheers,
~ ck à San Diego

+0

Une raison probable pourrait être que le gestionnaire d'événements soit attaché deux fois. Essayez '$ (": radio "). Data ('events'). Change.length' dans la console du navigateur (Firebug). S'il renvoie 2, vous avez 2 gestionnaires de changement attachés. – vsr

+0

de côté: '$ (': radio')' attachera le gestionnaire d'événement à tous les boutons radio (s'il y en a) sur la page. Je préfère '$ ('# frmMDR: radio'). Change (function() {' ou '$ (': radio', '# frmMDR'). Change (function() {'. – vsr

+0

oui c'est absolument le problème Comment puis-je résoudre ce problème? Pourquoi est-ce que je fais deux fois le câblage du gestionnaire? Merci! – Hcabnettek

Répondre

6

vous obtenez deux coups sûrs parce que deux boutons radio changent état. Les boutons radio permettent qu'un seul élément dans un groupe à sélectionner de façon lorsque vous cliquez sur un bouton radio, deux événements se produisent:

  1. Un nouveau bouton radio est sélectionné
  2. Le bouton radio sélectionné précédemment est décochée

Ceci est deux événements et la raison pour laquelle votre code est frappé deux fois. Pour le résoudre, vous pouvez donner une classe à vos boutons radio, puis gérer l'événement en cliquant sur la classe en tant que sélecteur.

<input class="radio" id="rdoMaintenance" name="module" type="radio" value="Maintenance" /><label for="rdoMaintenance">M</label> 
<input class="radio" id="rdoDiagnostics" name="module" type="radio" value="Diagnostics" /><label for="rdoDiagnostics">D</label> 
<input class="radio" id="rdoRepair" name="module" type="radio" value="Repair" /><label for="rdoRepair">R</label> 

Et votre jQuery pourrait être:

$('.radio').click(function() { 
    $('#frmMDR').submit(); 
}); 
+0

Cela ne fera que tirer sur le clic cependant - toute personne qui accède au contrôle radio ne l'aura pas soumis. tire sur la sélection à la place? – Jay

+2

Assez sûr que click ne signifie pas "click" pour les boutons radio. Pour les cases à cocher au moins, il se déclenche sur l'onglet + barre d'espace. – Domenic

+0

J'ai mocked du code et testé dans IE7/IE8/FF3.6 et Chrome et il fonctionne sur le clic et la sélection par d'autres méthodes. http: // jsfiddle.net/W2yBm/ –

3

Vous devriez probablement vérifier sélectionné dans la fonction de changement pour ce qui est sélectionné. De cette façon, il se déclenchera uniquement pour le bouton radio sélectionné, et vous n'avez pas besoin de vous soucier de lier ou de désengager les événements, et cela devrait fonctionner quelle que soit la méthode de saisie modifiée.

Voici un article sur handling events from check boxes and radio buttons in JQuery.

+0

+1 pour penser aux personnes qui n'utilisent pas (ou ne peuvent pas) utiliser une souris, même si cela fonctionne dans ce cas. :) –