2008-11-24 13 views
35

Was ist der beste Weg, um einen normalen Anker (<a href="...">) zu erhalten, um das Formular zu senden, in das er eingebettet ist, wenn er angeklickt wird?Wie man am besten einen Link ein Formular einreicht

<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> 

Ich weiß, dass der einfachste Weg, mit jQuery

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

wäre ... aber ich versuche, einen Weg zu finden, dies zu tun, ohne eine Bibliothek.


bearbeiten: Ich versuche wirklich, ein Verfahren zu finden, die keine Kenntnis der Form erfordert (zB: Name, ID, etc.). Dies wäre ähnlich wie Sie dies auf ein Eingabeelement setzen könnten: <input onclick="this.form.submit()" />

+10

nicht tun Sie. Verwenden Sie einen '

+0

Sie haben Recht, das wäre eine bessere Lösung. – nickf

Antwort

10

Schleife durch Elternknoten, bis Sie ein Element mit Tagname finden, die angibt, dass es ein Formular ist!

<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

Hallo hasen Ich habe Ihre Methode verwendet und funktioniert perfekt, ich habe nur eine Frage für diese Lösung. Wenn ich die Formulardateien vor dem Senden ändern möchte (z. B. Verschlüsselung), gibt es eine Möglichkeit, dies zu tun? Ich meine, ich möchte die Werte von Nutzernamen und Passwortfeldern vor dem Senden verschlüsseln, ist das in dieser Funktion möglich? – Alper

+0

@Alper, die 'get_form' wird das Formular Objekt zurückgeben, check out die API: http://www.w3schools.com/jsref/dom_obj_form.asp – hasen

28

Warum verwenden Sie kein <input> oder <button> Element und nur zwicken es mit CSS? Dann funktioniert es ohne Javascript und ist daher zuverlässiger.

+0

Schaltfläche nicht möglich: Mauszeiger über IE6. – nickf

+2

button/input-submit verhält sich besser, eher wie das, was Sie zu modellieren versuchen, also ist es eine bessere Wahl, auch wenn JS garantiert verfügbar ist. href = "#" wird sich seltsam verhalten, wenn Sie z. Klicken Sie mit der mittleren Maustaste darauf, klicken Sie mit der rechten Maustaste auf das Lesezeichen usw. Wenn der Mauszeiger auf IE6 wirklich wichtig ist, können Sie immer einen JS-Hack einfügen. – bobince

+6

Stimmen Sie dieser Antwort zu. Links sind GET-Anfragen, und es gibt keinen Grund, sie zu ändern. Machen Sie keine Links POST. Verwenden Sie stattdessen Formularübermittlungen. –

20

Der einfachste Weg, das wäre die Verwendung so etwas wie dies zu tun:


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

Dies ist, was ich am Ende verwendet habe, aber wirklich auf eine Möglichkeit gehofft hatte, ohne das Formular (zB seinen Namen) kennen zu müssen. – nickf

3

beste Weg ist,

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

aber Sie wahrscheinlich nicht wollen, zu tun, dass, da es unmöglich Einreichung machen für Benutzer mit JS deaktiviert

+0

Sie könnten eine

+0

@ ARemesal: guter Punkt! Ich habe noscript nicht berücksichtigt – nickf

+0

Dachte nicht, in der Tat möchten Sie vielleicht nicht einmal den Link in HTML haben, einfach fügen Sie es programmgesteuert über JS, so dass sie nicht alles ohne JS aktiviert sehen wird –

1

ähnliche solution-hasen j, aber eine rekursiven Funktion mit dem Dokument zu durchlaufen.

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); 
    } 
} 

Und die Form, natürlich ...

<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

Gibt es einen Grund, warum Sie Rekursion statt einer Schleife verwenden würden? ist nicht der Overhead mit Rekursion größer? (offensichtlich auf dieser Ebene vernachlässigbar, aber immer noch?) – nickf

+0

Nicht sicher über die Effizienz. Wäre nicht schwer mit Feuerwanzen zu testen. Ich habe dieses Beispiel geschrieben, bevor ich die Antwort von hasan j sah. Ich war überrascht, dass er arbeitete (getestet, um sicher zu sein) und froh war, etwas gelernt zu haben, aber ich dachte mir, ich würde es trotzdem veröffentlichen. – enobrev

1

Ich persönlich bevorzuge das javascript: Protokoll im href zu verwenden, anstatt Onclick-Ereignis zu verwenden ... Wenn irgendwelche Probleme gibt mit diesem ist, Ich würde mich freuen, korrigiert zu werden.

Wenn Sie nur ein Formular auf der Seite haben, ein ganz gewöhnlicher Fall, können Sie einfach tun:

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

Ansonsten wie oben die Elemente sprudelt es eine Lösung.

[EDIT] Ich behalte die Antwort, auch wenn es downvoted ist, als Referenz (die in den Kommentaren angegebene Information ist interessant).
Ein weiterer Nachteil der Protokolltechnik: Es generiert kein Ereignisobjekt. Kein Problem in dem Snippet, das ich gab, aber nervig, wenn ich einen Handler anrufe.

+0

Was ist mit documents.forms [0]? Ist das nicht völlig falsch, sollte es auf der Seite mehr als ein Formular geben? – nickf

+1

Das habe ich geschrieben: es ist nur dann zuverlässig, wenn Sie sicher sind, nur ein Formular zu haben. – PhiLho

+1

Das JavaScript-Pseudoprotokoll kann unerwartetes Verhalten auslösen (normalerweise keine neuen Bilder/toten Skript-Threads), es hat Sicherheitsprobleme im IE im HTTPS-Modus, Fehler bei der Rückgabe können zu seltsamen Orten umleiten (versuchen Sie "javascript: document.body. style.display = 'Blockieren'; "). Es schlägt auch für Nicht-JS-Benutzer fehl. – Borgar

1

Sie sollten eine Schaltfläche (und Eingabe oder Schaltfläche vom Typ Senden) verwenden, um ein Formular zu senden.

Wenn Sie zusätzliche Funktionen benötigen, die ein Link hat, aber Eingabeelemente nicht haben (z. B. Hover), dann ist es einfacher, diese mit Javascript zu implementieren, als es das Senden des Formulars ist.Es wird auch graziöser für Menschen ohne Javascript degradieren.

Sie können dies selbst lösen mit MSIE spezifischen Code (und Verwendung: schweben für andere Browser):

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

Wenn Sie noch wirklich, wirklich tun möchte, es rückwärts dann ist hier, wie ich es nicht tun würde:

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 
} 

Und die HTML würde wie folgt aussehen:

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

Mit Jquery überprüfen wir, ob das Dokument geladen wurde. Dann warten wir auf ein Anker-Tag mit der ID 'submit', auf das geklickt werden soll. Dann reicht es das Formular mit der ID "Anmeldung" ein. Ändern Sie "Senden" und "Anmelden" entsprechend.

13

Ich benutze dies jetzt jedes Mal. Da die Taste in meinem Projekt einreichen in der Regel ein Link (durch Wrap ein Bild oder CSS), so dass ich dies:

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

Vergessen Sie nicht, es jQuery auch verwendet.

Sie können in Ihrer eigenen Funktion verpacken. Es übermittelt also immer das Elternelement (Formular) auf diesem Link.

12

Solange der Link ein direktes Kind des Formulars ist, können Sie dies verwenden. Sie müssen den Namen des Formulars nicht kennen. Funktioniert zumindest in Firefox und Chrome.

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

quirksmode.org sagt mir x.parentNode in allen Browsern funktioniert, so dass diese sollte überall Arbeit.

+0

Gibt es eine Möglichkeit, den Eltern ParentNode zwei Ebenen zu erhalten? – thethakuri

1

zu folgen aus der Antwort oben How best to make a link submit a form, so, wie ich es habe ist

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

und CSS kürzlich tun

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

ich gepostet, da ich kein Beispiel gefunden der HTML/CSS getan. Wenn jemand irgendwelche Verbesserungen hat, wird aktualisiert.

6

einen Submit-Button in einen Link drehen Markup wie folgt aus:

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

und CSS wie:

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> 
Verwandte Themen