2009-02-12 6 views
8

Existe-t-il un moyen de déterminer quel élément a soumis un formulaire à l'intérieur d'un gestionnaire de sous-diffusion? Essayer d'écrire un gestionnaire générique qui sait quel élément a été cliqué. Par exemple, étant donné cette forme:Déterminez quel élément a envoyé un formulaire depuis l'intérieur de la sous-unité

<form onsubmit="onSubmitHandler"> 
    <input type="submit" name="submit1" /> 
    <input type="submit" name="submit2" /> 
</form> 

Comment puis-je déterminer à l'intérieur du onSubmitHandler quel bouton soumettre a été cliquée? J'ai essayé event.target/event.srcElement, mais cela donne le formulaire, pas le bouton de soumission réel.

Mise à jour: J'écris un contrôle générique ici, donc il n'a aucune idée de ce qu'il y a sur le formulaire. La solution doit fonctionner sans connaître et modifier le code HTML du formulaire. Mon fallback est de marcher sur le DOM pour trouver tous les boutons qui pourraient causer une soumission, mais je voudrais éviter cela.

+0

Il n'y a aucune garantie que les boutons d'envoi ont été cliqués. Par exemple. La soumission par JS (form.submit()) n'entrainera aucune valeur de boutons dans la publication. –

+0

C'est bien aussi. Un peu plus de contexte sur le problème: ceci est pour un composant AJAX.J'annule le premier envoi, je fais mon propre truc, puis je dois relancer le premier envoi, avec toutes les valeurs de formulaire correctes. Autant que j'ai été capable de déterminer, la seule façon de faire ceci est de marcher le DOM et ajouter des gestionnaires de clic à tout ce qui pourrait causer un soumettre, et puis enregistrer cela. Supposons que la dernière chose qui a été cliquée soit celle qui a envoyé le formulaire, puis appelez .click() lorsque je dois soumettre à nouveau le formulaire. –

Répondre

3

Une autre solution serait de déplacer le déclencheur d'événement de l'événement présenter de la forme, à l'événement onclick de l'élément présenter, en tant que tel:

<form name='form1'> 
    <input type="submit" name="submit1" onclick="onSubmitHandler"/> 
    <input type="submit" name="submit2" onclick="onSubmitHandler"/> 
</form> 

Dans votre fonction de gestionnaire, vous pouvez déterminer l'élément de soumission par simple inspecter le nom de la cible de l'événement, et si vous avez besoin d'accéder aux informations du formulaire ou à d'autres éléments, vous pouvez l'obtenir à partir de l'attribut "formulaire" des éléments de soumission.

+0

Vous aurez toujours besoin d'un gestionnaire de sous-menu en plus de ceux-ci, car il est possible qu'un événement de soumission ait lieu sans appuyer sur un bouton. La spécification laisse semi-ouverte la question de quel bouton (le cas échéant) est activé en appuyant sur Entrée tout en se concentrant sur un contrôle sans bouton , et les navigateurs ne sont pas cohérents (bien que par mes expériences, il semble être le premier bouton du formulaire ou pas du tout). – Stewart

1

Je n'utiliserais pas un type de bouton d'envoi standard.

Faire la fonction Envoyer prennent un argument supplémentaire qui représente l'élément qui l'a soumis, et le bouton aurait un onclick qui envoie this comme paramètre:

<input type="button" onclick="submitHandler(this)"> 
+0

Cela va inutilement casser le bouton lorsque JavaScript n'est pas disponible. – bobince

+0

Le bouton fonctionnera toujours sans js, mais alors la seule méthode pour déterminer le bouton réel pressé sera une côté côté serveur. Vous pouvez le faire en donnant une valeur au bouton, soit dit en passant. – KooiInc

+0

Cela doit être tout côté client. Je me fiche du serveur dans ce cas. Il doit également être générique - je n'ai pas accès à la page html. –

0

Mon fallback est la marche du DOM trouver tous les boutons qui pourraient causer un soumettre, mais je voudrais éviter cela.

... et d'y ajouter des écouteurs pour stocker le bouton 'dernier clic' qui est ensuite lu par l'écouteur de soumission, non?

Je ne peux pas penser autrement, désolé.

+0

Oui, exactement. C'est cassant parce que si quelque chose d'autre sur la page ajoute un bouton de soumission après que je l'ai accroché, il se cassera. Mais cela semble être la meilleure option, malheureusement. –

+0

Ou devrais-je dire seulement l'option. –

0

Cette solution fonctionne dans Firefox. Je ne l'ai pas vérifié dans d'autres navigateurs compatibles ou IE.
Je ne suis pas trop optimiste pour IE, vous auriez à le regarder et poster vos résultats.

<form id="myForm"> 
    <input type="submit"> 
    <input type="submit"> 
</form> 

_

document.getElementById('myForm').addEventListener('submit', function(e){ 
    e.preventDefault(); 
    e.explicitOriginalTarget.style.background = 'red'; 
}, false); 
+0

C'est assez mignon, mais il ressemble à un non sur le navigateur: http://stackoverflow.com/questions/179826/crossbrowser-equivalent-of-explicitoriginaltarget-event-parameter, et malheureusement, cela doit gérer les 4 grands navigateurs, de sorte qu'on est sorti. –

0

Cliquez sur la bulle d'événements, de sorte que vous pouvez simplement ajouter un « onclick » auditeur à la forme elle-même, qui vérifie si la source cible de clic est un bouton d'envoi; Si c'est le cas, stockez une référence à cet endroit quelque part associé au formulaire auquel vous pouvez accéder à partir de votre gestionnaire d'onsubmit. Si vous souhaitez gérer correctement les formulaires "Enter", écoutez l'événement "onkeypress" ou "onkeydown" du formulaire, vérifiez "Enter" et effacez les informations de votre bouton submit si l'événement cible ISN ' T un bouton de soumission.

Questions connexes