2008-11-24 7 views
35

Quel est le meilleur moyen d'obtenir une ancre régulière (<a href="...">) pour soumettre le formulaire dans lequel il est incorporé?Comment faire un lien pour envoyer un formulaire

<form> 
    <ul> 
     <li> 
      <p> 
       The link could be <span>embedded <a href="" onclick="?">at any level</a></span> 
       in the form, so "this.parentNode.parentNode..." is no good. :(
      </p> 
     </li> 
    </ul> 
</form> 

Je sais que la façon la plus facile en utilisant jQuery serait

$('#myLink').click(function() { 
    $(this).parents('form:first').submit(); 
}); 

... mais je suis en train de trouver un moyen de le faire sans utiliser une bibliothèque.


Modifier: Je suis vraiment essayer de trouver une méthode qui ne nécessite pas la connaissance de la forme (par exemple: son nom, id, etc.). Ce serait similaire à la façon dont vous pouvez mettre cela sur un élément d'entrée: <input onclick="this.form.submit()" />

+10

Ne fais pas ça. Utilisez un

+0

vous avez raison, ce serait une meilleure solution. – nickf

Répondre

10

bouclez les nœuds parents jusqu'à ce que vous trouviez un élément avec une variable qui indique qu'il s'agit d'un formulaire!

<form> 
    <ul> 
     <li> 
      <p> 
       The link could be <span>embedded <a href="" onclick="get_form(this).submit(); return false">at any level</a></span> 
       in the form, so "this.parentNode.parentNode..." is no good. :(
      </p> 
     </li> 
    </ul> 
</form> 



<script type="text/javascript"> 
    //<![CDATA[ 
    function get_form(element) 
    { 
     while(element) 
     { 
      element = element.parentNode 
      if(element.tagName.toLowerCase() == "form") 
      { 
       //alert(element) //debug/test 
       return element 
      } 
     } 
     return 0; //error: no form found in ancestors 
    } 
    //]]> 
</script> 
+0

Hi hasen , j'ai utilisé votre méthode et fonctionne parfaitement, j'ai seulement une question pour cette solution. Si je veux modifier le formulaire fileds avant d'envoyer (par exemple cryptage) est-il possible de le faire? Je veux dire que je veux crypter les valeurs des champs de nom d'utilisateur et de mot de passe avant de soumettre, est-ce possible dans cette fonction? – Alper

+0

@Alper, le 'get_form' va retourner l'objet de formulaire, consultez l'API: http://www.w3schools.com/jsref/dom_obj_form.asp – hasen

28

Pourquoi utilisez-vous pas un élément <input> ou <button> et juste tweak avec CSS? Ensuite, cela fonctionne sans Javascript et est donc plus fiable.

+0

Vous ne pouvez pas faire le bouton: survolez sur IE6. – nickf

+2

button/input-submit se comporte mieux, ressemble plus à la chose que vous essayez de modéliser, donc c'est un meilleur choix même si JS est garanti disponible. href = "#" se comportera étrangement si vous par exemple. Cliquez sur le bouton du milieu, cliquez avec le bouton droit de la souris sur le signet, etc. Si le vol stationnaire sur IE6 est réellement important, vous pouvez toujours mettre un hack JS. – bobince

+6

D'accord avec cette réponse. Les liens sont censés être des requêtes GET, et il n'y a aucune raison de le changer. Ne faites pas de liens faire POST. Utilisez les soumissions de formulaire à la place. –

20

La façon la plus simple de le faire serait d'utiliser quelque chose comme ceci:


<a href="#" onclick="document.formName.submit();"> 
+0

c'est ce que j'ai fini par utiliser, mais j'espérais vraiment un moyen de le faire sans avoir besoin de rien savoir sur le formulaire (par exemple, son nom) – nickf

3

meilleure façon est

<a href="#" onclick="document.forms[0].submit();return false;">Submit Form</a> 

mais vous ne voulez probablement pas le faire comme il fera la présentation impossible pour les utilisateurs avec JS désactivé

+0

Vous pouvez mettre un

+0

@ARemesal: bon point! Je n'avais pas considéré noscript – nickf

+0

N'a pas pensé à cela, en fait vous pouvez ne pas avoir le lien en HTML, il suffit de l'ajouter par programmation via JS afin qu'ils ne verront pas tout sans JS activé –

1

similaires solution-hasen j, mais en utilisant une fonction récursive pour parcourir le document.

function findParentForm(element) { 
    if (element.parentNode.tagName.toLowerCase() == 'html') { 
     throw('No Parent Form Found'); 
    } else if (element.parentNode.tagName.toLowerCase() == 'form') { 
     return element.parentNode; 
    } else { 
     return findParentForm(element.parentNode); 
    } 
} 

Et la forme, bien sûr ...

<form> 
    <ul> 
     <li> 
      <p> 
       The link could be <span>embedded <a href="" onclick="findParentForm(this).submit(); return false;">at any level</a></span> 
       in the form, so "this.parentNode.parentNode..." is no good. :(
      </p> 
     </li> 
    </ul> 
</form> 
+0

Y at-il une raison pour laquelle vous utiliseriez la récursivité au lieu d'une boucle? les frais généraux ne seront-ils pas plus importants avec la récursivité? (évidemment négligeable à ce niveau, mais quand même?) – nickf

+0

Pas sûr de l'efficacité. Ce ne serait pas difficile à tester avec firebug. J'ai écrit cet exemple avant de voir la réponse de hasan j. J'ai été surpris que son travail (testé pour être sûr) et heureux d'avoir appris quelque chose, mais pensé que je publierais le mien aussi de toute façon. – enobrev

1

Personnellement, je préfère utiliser le protocole javascript: dans le href au lieu d'utiliser l'événement onclick ... S'il y a des problèmes avec cette , Je serais heureux d'être corrigé.

Si vous avez un seul formulaire dans la page, un cas assez fréquent, vous pouvez le faire simplement:

<li><p><a href="javascript:document.forms[0].submit();">Click here to submit</a></p></li> 

Sinon, bouillonne les éléments comme ci-dessus est une solution.

[EDIT] Je garde la réponse, même si elle est downvoted, comme référence (l'information donnée dans les commentaires est intéressante).
Un autre inconvénient de la technique de protocole: elle ne génère pas d'objet événement. Pas un problème dans l'extrait que j'ai donné, mais ennuyeux lors de l'appel d'un gestionnaire.

+0

ce qui est avec documents.forms [0]? Est-ce que ce ne serait pas complètement faux s'il y avait plus d'un formulaire sur la page avant celle-ci? – nickf

+1

C'est ce que j'ai écrit: il n'est fiable que si vous êtes sûr de n'avoir qu'une seule forme. – PhiLho

+1

Le pseudo-protocole javascript peut déclencher un comportement inattendu (généralement pas de nouvelles images/thread de script mort), il a des problèmes de sécurité sur IE en mode HTTPS, l'échec d'inclure un retour peut rediriger vers des endroits étranges (essayez "javascript: document.body. style.display = 'bloquer'; "). Il échoue également pour les utilisateurs non-JS. – Borgar

1

Vous devez utiliser un bouton (et une entrée ou un bouton de type submit) pour soumettre un formulaire.

Si vous avez besoin de fonctionnalités supplémentaires qu'un élément de liaison n'a pas (comme hover), alors il est plus facile d'implémenter ceux avec javascript, que c'est la soumission du formulaire.Il se dégradera également plus gracieusement pour les personnes sans javascript.

Vous pouvez même résoudre ce avec MSIE code spécifique (et l'utilisation: hover pour les autres navigateurs):

<input type="submit" value="send" class="linkstyles" 
     onmouseenter="this.className+=' hovered';" 
     onmouseleave="this.className=this.className.replace(/(^|\s)hovered(\s|$)/g, '');" /> 

Si vous encore vraiment voulez vraiment faire en arrière alors voici comment je ne le ferais pas:

function submitByLink (elm) { 
    // Move up domtree until we hit no parentNode or find a form 
    while (elm) { 
    elm = elm.parentNode; 
    if (elm && elm.tagName == 'FORM') { 
     // First chance we get, we submit the form and exit. 
     // The return on the node it kills the event bubble by forwarding false to browser 
     elm.submit(); 
     return false; 
    } 
    } 
    // If we got here then there is no form parent and user will be sent to link href 
} 

Et le code HTML devrait ressembler à ceci:

<a href="aPageExplainingWhyYouNeedJavascript.html" onclick="return submitByLink(this);">Send</a> 
1
$(document).ready(function(){$('#submit').click(function(){$('#signup').submit();});}); 

En utilisant Jquery, nous vérifions que le document a été chargé, puis nous attendons qu'un point d'ancrage avec un identifiant de 'submit' soit cliqué. Il soumet ensuite le formulaire avec un identifiant de 'inscription'. Changez 'soumettre' et 'inscription' en conséquence.

13

Je l'utilise maintenant à chaque fois.

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

Ne pas oublier qu'il utilise jQuery trop: Parce que (une image ou CSS par enveloppe), donc j'utiliser ce bouton soumettre dans mon projet en général un lien.

Vous pouvez envelopper dans votre propre fonction. Donc, il soumet toujours l'élément parent (formulaire) sur ce lien.

12

Tant que le lien est un enfant direct du formulaire, vous pouvez l'utiliser. Vous n'avez pas besoin de connaître le nom du formulaire. Fonctionne dans au moins Firefox et Chrome.

<form action=""> 
    <a href="" onclick="parentNode.submit();return false;">Submit</a> 
</form> 

quirksmode.org me dit x.parentNode fonctionne dans tous les navigateurs, donc ce devrait travail partout.

+0

Y at-il un moyen d'obtenir le parent parentNode jusqu'à deux niveaux? – thethakuri

1

Pour faire suite de la réponse ci-dessus How best to make a link submit a form, la façon dont je l'ai fait récemment est

<button class="submit" type="submit"><a href="#" onclick="return false;">Link Text</a></button> 

et CSS

.submit { 
    background: transparent; 
    border:0; 
    display: inline; 
    margin: 0; 
    padding: 0; 
    cursor:pointer; 
} 
.submit a 
{ 
    color: #CEA249; 
} 
.submit:hover a 
{ 
    color: white; 
} 

Je posté depuis que je ne pouvais pas trouver un exemple du html/css fait. Si quelqu'un a des améliorations mettra à jour.

6

Tourner un bouton d'envoi dans un lien en utilisant comme ce balisage:

<input id="submitlink" type="submit" value="Text" /> 

Et CSS comme ceci:

input#submitlink { 
    background: transparent; 
    border: 0; 
    cursor:pointer; 
    margin: 0; 
    padding: 0; 
    color: #034af3; 
    text-decoration: underline; 
} 

input#submitlink:visited { 
    color: #505abc; 
} 

input#submitlink:hover { 
    color: #1d60ff; 
    text-decoration: none; 
} 

input#submitlink:active { 
    color: #12eb87; 
} 
1
<form> 
<input type="submit" id="submit" style="display:none;"/> 
<a href="#" onclick="$('#submit').click();">Sample Submit Trick</a> 
</form> 
Questions connexes