¿Cómo enviar un formulario con JavaScript haciendo clic en un enlace?

123

En lugar de un botón de envío, tengo un enlace:

<form>

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

</form>

¿Puedo hacer que envíe el formulario cuando se hace clic en él?

arenoso
fuente
Utilizo esto para integrar un formulario completamente oculto en una página. Pero hay saltos de línea antes y después del enlace. ¿Vienen del elemento de forma? Y me gustaría abrir el enlace en una nueva pestaña / página, target="_blank"no parece funcionar.
JPT
1
tl; dr <a role="button" aria-label="submit form" href="javascript:void(0)" onclick="document.querySelector('form').submit()">Submit</a>
Josh Habdas

Respuestas:

210

La mejor manera

La mejor forma es insertar una etiqueta de entrada adecuada:

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

La mejor forma de 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();
});

Incluya el último código JavaScript junto a un DOMContentLoadedevento (elija solo loadpara compatibilidad con versiones anteriores ) si aún no lo ha hecho:

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

La forma fácil, no recomendable (la respuesta anterior)

Agregue un onclickatributo al enlace y un idal formulario:

<form id="form-id">

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

</form>

Todas las formas

Cualquiera que sea la forma que elija, tendrá que llamar formObject.submit()eventualmente (donde formObjectestá el objeto DOM de la <form>etiqueta).

También debe vincular dicho controlador de eventos, que llama formObject.submit(), por lo que se llama cuando el usuario hace clic en un enlace o botón específico. Hay dos maneras:

  • Recomendado: vincule un detector de eventos al objeto 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();
    });
    
  • No recomendado: inserte JavaScript en línea. Hay varias razones por las que esta técnica no es recomendable. Un argumento importante es que mezcla el marcado (HTML) con los scripts (JS). El código se vuelve desorganizado y bastante inmanejable.

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

Ahora, llegamos al punto en el que debe decidir el elemento de la interfaz de usuario que activa la llamada de submit ().

  1. Un botón

    <button>submit</button>
  2. Un enlace

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

Aplique las técnicas antes mencionadas para agregar un detector de eventos.

ComFreek
fuente
Quería aplicar esto pero no parece funcionar de mi lado. Aquí hay un violín, jsfiddle.net/rbhr9wt2
user1149244
@ user1149244 En el panel de JavaScript en jsFiddle, haga clic en "JavaScript" y luego configure "Tipo de carga" en "No envolver - en <body>" (o <head>). De forma predeterminada, se establece en "onLoad", después de lo cual DOMContentReady ya no se activa.
ComFreek
3
Nota: Si su formulario tiene un botón con atributo name="submit", el submit()método de su formulario no será accesible.
2540625
¿Por qué no se recomienda el método onclick?
nu Everest
Un @nueverest <input type="submit">tiene un significado más semántica que, por ejemplo, <a href="#" onclick="...">. Esto es especialmente importante con respecto a los lectores de pantalla. Si debe utilizar este último, le sugiero que utilice ARIA .
ComFreek
65

Si usa jQuery y necesita una solución en línea, esto funcionaría muy bien;

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

Además, es posible que desee reemplazar

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

con

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

para que el usuario no se desplace hasta la parte superior de su página al hacer clic en el enlace.

Maurice
fuente
1
Creo que sería preferible hacerlo en un <span> texto </span>. No es un enlace y href: javascript no es bueno. (pronto se volverá malo con los siguientes motivos de seguridad ... javascript en línea será prohibido algún día.
Milche Patern
Estoy de acuerdo. A juzgar por la naturaleza de la pregunta, busqué una respuesta simple. Lo que yo personalmente hago es usar href="#"y luego seleccionar todos esos enlaces con jquery y llamar e.preventDefault()al clickcontrolador de eventos para que el navegador no se desplace.
Maurice
3
Yo personalmente prefiero esta respuesta. Simple, limpio y fácil de implementar si su página usa JQuery. Muy flexible también, ya que tengo una página con varios formularios y funciona perfectamente.
John Contarino
Se puede usar href = "#" si se agrega al final de la llamada javascript onClick "return false"
Lumis
23

Puede darle al formulario y al enlace algunos identificadores y luego suscribirse al onclickevento del enlace y submitel formulario:

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

y entonces:

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

Le recomendaría que use un botón de envío para enviar formularios, ya que respeta la semántica de marcado y funcionará incluso para usuarios con JavaScript desactivado.

Darin Dimitrov
fuente
4

HTML y CSS: sin solución de JavaScript

Haga que su botón aparezca como un enlace de 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
fuente
Excelente, ¿por qué complicarlo cuando puede ser simple? Sin embargo, creo que se ve aún mejor si también agrega "cursor: pointer;" en la clase de desplazamiento, por lo que el cursor se convierte en la mano.
Lumis
3

esto funciona bien sin necesidad de ninguna función especial. También es mucho más fácil de escribir con php.<input onclick="this.form.submit()"/>

chris
fuente
OP indicado haciendo clic en un enlace, no en un elemento de entrada.
Rahil Wazir
¿Puede esto funcionar haciendo algo como<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
fuente
3
¿Puede explicar cómo su respuesta realmente responde a la pregunta? Agregue más contexto por favor.
1
document.getElementById("theForm").submit();

Funciona perfecto en mi caso.

puedes usarlo en función también como,

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

Establezca "theForm" como su ID de formulario. Está hecho.

Chintan Thummar
fuente
0

aquí está la mejor solución a su pregunta: dentro del formulario tiene este código:

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

en el archivo CSS, haga esto:

button{
  display: none;
}

en JS haces esto:

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

Ahí tienes.

iamwave007
fuente