2008-11-24 7 views
35

Jaki jest najlepszy sposób uzyskania standardowej kotwicy (<a href="...">) w celu przesłania formularza, w którym jest osadzony po kliknięciu?Jak najlepiej utworzyć łącze przesłać formularz

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

wiem, że najprostszym sposobem przy użyciu jQuery byłoby

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

... ale staram się znaleźć sposób, aby to zrobić bez korzystania z biblioteki.


Edit: Jestem naprawdę starają się znaleźć sposób, który nie wymaga wiedzy o postaci (np: jego nazwa, id, etc). To byłby podobny do tego, jak można umieścić to na element wejściowy: <input onclick="this.form.submit()" />

+10

nie rób tego. Użyj '

+0

masz rację, to byłoby lepsze rozwiązanie. – nickf

Odpowiedz

10

przechodzić przez węzły nadrzędne do momentu znalezienia elementu ze zmienną wskazującą, że jest to formularz!

<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 , użyłem twojej metody i działa idealnie, mam tylko pytanie do tego rozwiązania. Jeśli chcę zmodyfikować składki formularza przed wysłaniem (np. Kryptowanie), czy jest jakiś sposób na zrobienie tego? Chodzi mi o to, że chcę ukryć wartości pól nazwy użytkownika i hasła przed przesłaniem, czy to możliwe w tej funkcji? – Alper

+0

@Alper, 'get_form' zwróci obiekt formularza, sprawdź api: http://www.w3schools.com/jsref/dom_obj_form.asp – hasen

28

Dlaczego nie używacie element <input> lub <button> i po prostu dostosować go z CSS? Następnie działa bez Javascript i dlatego jest bardziej niezawodny.

+0

Nie można wykonać przycisku: najedź na IE6. – nickf

+2

Przycisk/input-submit zachowuje się lepiej, bardziej jak rzecz, którą próbujesz modelować, więc jest lepszym wyborem, nawet jeśli JS jest zagwarantowane dostępne. href = "#" zachowa się dziwnie, jeśli np. kliknij go prawym przyciskiem myszy, kliknij prawym przyciskiem myszy-zakładka itp. Jeśli wskaźnik myszy na IE6 jest rzeczywiście ważny, zawsze możesz wstawić JS. – bobince

+6

Zgadzam się z tą odpowiedzią. Łącza mają być żądaniami GET i nie ma powodu, aby to zmieniać. Nie twórz linków do POST. Zamiast tego skorzystaj z formularza. –

20

Najprostszym sposobem na to byłoby użyć czegoś takiego:


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

to jest to, czego użyłem, ale naprawdę liczyłem na sposób, aby to zrobić, bez potrzeby uzyskania informacji o formularzu (np. Jego nazwa). – nickf

3

najlepszym sposobem jest

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

jednak prawdopodobnie nie chce tego robić, jak to zrobi składania niemożliwe dla użytkowników z JS wyłączonym

+0

Możesz umieścić

+0

@ARemesal: dobry punkt! nie brałem pod uwagę nosokraftu – nickf

+0

Nie myślałem o tym, w rzeczywistości możesz nie chcieć nawet mieć linku w HTML, po prostu dodaj go programowo przez JS, tak aby nie zobaczył go wszystkie bez włączonego JS –

1

Podobny solution do hasen j, ale przy użyciu funkcji rekurencyjnej przemierzać dokument.

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

i formy, oczywiście ...

<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

czy istnieje powód, dla którego używałbyś rekursji zamiast pętli? czy zwiększanie rekurencji nie będzie większe? (oczywiście pomijalne na tym poziomie, ale nadal?) – nickf

+0

Nie jestem pewien co do wydajności. Nie byłoby trudno przetestować z firebug. Napisałem ten przykład, zanim zobaczyłem odpowiedź hasana. Byłem zaskoczony, że jego praca (przetestowałem to na pewno) i cieszę się, że czegoś się nauczyłem, ale pomyślałem, że i tak i tak będę pisał. – enobrev

1

Osobiście wolę używać protokołu javascript: w href zamiast używania onclick zdarzenia ... Jeśli nie ma żadnych problemów z tym , Byłbym szczęśliwy, gdyby mnie poprawiono.

Jeśli masz tylko jeden formularz na stronie, to dość częsty przypadek, można zrobić po prostu:

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

Inaczej, przepuszczając się elementy jak wyżej to rozwiązanie.

[EDYTUJ] Zachowuję odpowiedź, nawet jeśli jest ona odrzucona, jako punkt odniesienia (informacje podane w komentarzach są interesujące).
Kolejna wada techniki protokołu: nie generuje obiektu zdarzenia. Nie stanowi to problemu we fragmencie, który podałem, ale irytującym, gdy dzwonię do obsługi.

+0

co to jest z documents.forms [0]? Czy nie będzie to całkowicie błędne, jeśli na stronie pojawi się więcej niż jeden formularz przed tym? – nickf

+1

To jest to, co napisałem: jest niezawodny tylko wtedy, gdy na pewno masz tylko jedną formę. – PhiLho

+1

Pseudo-protokół javascript może wywoływać nieoczekiwane zachowanie (zwykle brak nowych obrazów/martwego wątku skryptu), ma problemy z bezpieczeństwem na IE w trybie HTTPS, niepowodzenie włączenia powrotu może przekierować do dziwnych miejsc (spróbuj "javascript: document.body. style.display = 'block'; "). Nie działa także dla użytkowników innych niż JS. – Borgar

1

Powinieneś użyć przycisku (i wejścia lub przycisku typu prześlij), aby przesłać formularz.

Jeśli potrzebujesz dodatkowych funkcji, które ma link, ale elementy wejściowe nie mają (takich jak najeżdżanie), to łatwiej jest wdrożyć te z javascript, niż jest to przesłanie formularza.Spowoduje to również gorszą degradację dla ludzi bez javascript.

Można nawet rozwiązać ten z MSIE określonego kodu (i zastosowanie: hover dla innych przeglądarek):

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

Jeśli wciąż naprawdę naprawdę chcesz to zrobić w tył wtedy oto jak ja nie będzie to zrobić:

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 
} 

I HTML będzie wyglądać następująco:

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

Używając Jquery, sprawdzamy, czy dokument został załadowany, czekamy na znacznik zakotwiczenia z identyfikatorem "submit" do kliknięcia. Następnie przesyła formularz z identyfikatorem "rejestracji". Zmień "wyślij" i "zarejestruj się", aby dopasować.

13

Używam tego teraz za każdym razem. Ponieważ przycisk złożyć w moim projekcie zazwyczaj łącza (przez otoczyć obrazek lub CSS), więc to wykorzystać:

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

not forget to przy użyciu jQuery zbyt.

Możesz zawinąć swoją własną funkcję. Dlatego zawsze przesyła element nadrzędny (formularz) do tego linku.

12

Dopóki link jest bezpośrednim dzieckiem formularza, możesz go użyć. Nie musisz znać nazwy formularza. Działa w co najmniej Firefox i Chrome.

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

quirksmode.org mówi mi x.parentNode działa we wszystkich przeglądarkach, więc powinien praca wszędzie.

+0

Czy istnieje sposób na podniesienie rodzica ParentNode o dwa poziomy? – thethakuri

1

Aby wynikają z odpowiedzi powyżej How best to make a link submit a form, drogę Robiłem to niedawno jest

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

i CSS

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

napisałem to ponieważ nie mogłem znaleźć przykład z html/css zrobione. Jeśli ktokolwiek ma jakieś ulepszenia, zaktualizuje się.

6

Włącz przycisk Prześlij do łącza za pomocą znaczników tak:

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

i CSS tak:

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>