Jak przesłać formularz z JavaScriptem, klikając link?

123

Zamiast przycisku przesyłania mam link:

<form>

  <a href="#"> submit </a>

</form>

Czy mogę zmusić go do przesłania formularza po kliknięciu?

piaszczysty
źródło
Używam tego do zintegrowania całkowicie ukrytego formularza na stronie. Ale istnieją podziały wierszy przed i po łączu. Czy pochodzą z elementu formy? I chciałbym otworzyć link w nowej karcie / stronie, target="_blank"nie wydaje się działać.
JPT
1
tl; dr <a role="button" aria-label="submit form" href="javascript:void(0)" onclick="document.querySelector('form').submit()">Submit</a>
Josh Habdas

Odpowiedzi:

211

Najlepszym sposobem

Najlepszym sposobem jest wstawienie odpowiedniego tagu wejściowego:

<input type="submit" value="submit" />

Najlepszy sposób na JS

<form id="form-id">
  <button id="your-id">submit</button>
</form>
var form = document.getElementById("form-id");

document.getElementById("your-id").addEventListener("click", function () {
  form.submit();
});

Umieść drugi kod JavaScript w DOMContentLoadedzdarzeniu (wybierz tylko w loadcelu zachowania zgodności wstecznej ), jeśli jeszcze tego nie zrobiłeś:

window.addEventListener("DOMContentLoaded", function () {
  var form = document.... // copy the last code block!
});

Łatwy, niezalecany sposób (pierwsza odpowiedź)

Dodaj onclickatrybut do odsyłacza i iddo formularza:

<form id="form-id">

  <a href="#" onclick="document.getElementById('form-id').submit();"> submit </a>

</form>

Wszystkie sposoby

Jakikolwiek sposób wybierzesz, w formObject.submit()końcu otrzymasz call (gdzie formObjectjest obiekt DOM <form>tagu).

Musisz także powiązać taką procedurę obsługi zdarzeń, która wywołuje formObject.submit(), więc zostanie wywołana, gdy użytkownik kliknie określony link lub przycisk. Istnieją dwa sposoby:

  • Zalecane: powiąż detektor zdarzeń z obiektem DOM.

    // 1. Acquire a reference to our <form>.
    //    This can also be done by setting <form name="blub">:
    //       var form = document.forms.blub;
    
    var form = document.getElementById("form-id");
    
    
    // 2. Get a reference to our preferred element (link/button, see below) and
    //    add an event listener for the "click" event.
    document.getElementById("your-id").addEventListener("click", function () {
      form.submit();
    });
  • Niezalecane: wstaw wbudowany JavaScript. Jest kilka powodów, dla których ta technika nie jest zalecana. Jednym z głównych argumentów jest to, że łączysz znaczniki (HTML) ze skryptami (JS). Kod staje się niezorganizowany i raczej nie do utrzymania.

    <a href="#" onclick="document.getElementById('form-id').submit();">submit</a>
    
    <button onclick="document.getElementById('form-id').submit();">submit</button>

Teraz dochodzimy do punktu, w którym musisz zdecydować o elemencie UI, który wyzwala wywołanie submit ().

  1. Przycisk

    <button>submit</button>
  2. Łącze

    <a href="#">submit</a>

Zastosuj powyższe techniki, aby dodać nasłuchiwanie zdarzeń.

ComFreek
źródło
Chciałem to zastosować, ale wydaje się, że nie działa z mojej strony. Oto skrzypce, jsfiddle.net/rbhr9wt2
user1149244
@ user1149244 W panelu JavaScript na jsFiddle kliknij „JavaScript”, a następnie ustaw „Load Type” na „No wrap - in <body>” (lub <head>). Domyślnie jest ustawiony na „onLoad”, po czym DOMContentReady nie jest już uruchamiany.
ComFreek,
3
Uwaga: jeśli formularz ma przycisk z atr name="submit", submit()metoda formularza nie będzie dostępna.
2540625
Dlaczego metoda onclick nie jest zalecana?
nu everest
@nueverest <input type="submit">ma bardziej znaczenie semantyczne niż, powiedzmy, <a href="#" onclick="...">. Jest to szczególnie ważne w przypadku czytników ekranu. Jeśli musisz skorzystać z tego drugiego, sugerowałbym skorzystanie z ARIA .
ComFreek
65

Jeśli używasz jQuery i potrzebujesz rozwiązania wbudowanego, zadziałaby to bardzo dobrze;

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

Możesz także chcieć wymienić

<a href="#">text</a>

z

<a href="javascript:void(0);">text</a>

dzięki czemu użytkownik nie przewija do góry strony po kliknięciu łącza.

Maurice
źródło
1
Uważam, że lepiej byłoby zrobić to w <span> tekście </span>. To nie jest link, a href: javascript nie jest dobry. (wkrótce stanie się zły z następnych powodów bezpieczeństwa ... wbudowany javascript ma zostać kiedyś zbanowany.
Milche Patern
Zgadzam się. Sądząc po naturze pytania, poszedłem na prostą odpowiedź. Co ja osobiście zrobić, to użyć href="#", a następnie zaznacz wszystkie te linki z jQuery i rozmowy e.preventDefault()w clickobsługi zdarzeń więc przeglądarka nie przewijania.
Maurice
3
Osobiście wolę tę odpowiedź. Proste i przejrzyste oraz łatwe do wdrożenia, jeśli Twoja strona korzysta z JQuery. Również bardzo elastyczny, ponieważ mam stronę z wieloma formularzami i działa bezbłędnie.
John Contarino,
Można użyć href = "#", jeśli dodaje się na końcu wywołania javascript onClick "return false"
Lumis
23

Możesz podać formularzowi i linkowi kilka identyfikatorów, a następnie zapisać się na onclickwydarzenie linku i submitformularza:

<form id="myform" action="" method="POST">
    <a href="#" id="mylink"> submit </a>
</form>

i wtedy:

window.onload = function() {
    document.getElementById('mylink').onclick = function() {
        document.getElementById('myform').submit();
        return false;
    };
};

Polecam użycie przycisku przesyłania do przesyłania formularzy, ponieważ szanuje on semantykę znaczników i będzie działał nawet dla użytkowników z wyłączoną obsługą JavaScript.

Darin Dimitrov
źródło
4

HTML i CSS - brak rozwiązania JavaScript

Spraw, aby przycisk wyglądał jak łącze Bootstrap

HTML:

<form>
    <button class="btn-link">Submit</button>
</form>

CSS:

.btn-link {

    background: none;
    border: none;
    padding: 0px;
    color: #3097D1;
    font: inherit;

}

.btn-link:hover {

    color: #216a94;
    text-decoration: underline;

}
Darren Murphy
źródło
Doskonale, po co to komplikować, skoro może to być proste. Jednak wydaje mi się, że wygląda to jeszcze lepiej, jeśli dodasz również „kursor: wskaźnik;” w klasie hover, więc kursor zamienia się w dłoń.
Lumis
3

działa to dobrze bez żadnej specjalnej funkcji potrzebnej. Dużo łatwiej też pisać w php.<input onclick="this.form.submit()"/>

chris
źródło
OP określone przez kliknięcie linku, a nie elementu wejściowego.
Rahil Wazir
Czy to zadziała, robiąc coś w stylu<input onclick="this.form.submit()"> Some Text</input>
CodyBugstein,
2
<form id="mailajob" method="post" action="emailthijob.php">
    <input type="hidden" name="action" value="emailjob" />
    <input type="hidden" name="jid" value="<?php echo $jobid; ?>" />
</form>

<a class="emailjob" onclick="document.getElementById('mailajob').submit();">Email this job</a>
Shashank
źródło
3
Czy możesz wyjaśnić, w jaki sposób Twoja odpowiedź faktycznie odpowiada na pytanie? Dodaj do tego więcej kontekstu.
1
document.getElementById("theForm").submit();

W moim przypadku działa idealnie.

Możesz go również używać w funkcji,

function submitForm()
{
     document.getElementById("theForm").submit();
} 

Ustaw „theForm” jako identyfikator formularza. Zrobione.

Chintan Thummar
źródło
0

oto najlepsze rozwiązanie twojego pytania: w formularzu masz ten kod:

<li><a href="#">Singup</a></li>
<button type="submit" id="haha"></button>

w pliku CSS wykonaj następujące czynności:

button{
  display: none;
}

w JS robisz to:

$("a").click(function(){
   $("button").trigger("click");
})

Proszę bardzo.

iamwave007
źródło