¿Puedo hacer que un <botón> no envíe un formulario?

516

Tengo un formulario con 2 botones

<a href="index.html"><button>Cancel changes</button></a>

<button type="submit">Submit</button>

También uso el botón de jQuery UI en ellos, simplemente así

$('button').button();

Sin embargo, el primer botón también envía el formulario. Pensé que si no tuviera el type="submit", no lo tendría.

Obviamente podría hacer esto

$('button[type!=submit]').click(function(event) { event.stopPropagation(); });

Pero, ¿hay alguna forma de evitar que el botón Atrás envíe el formulario sin la intervención de JavaScript?

Para ser honesto, usé un botón solo para poder diseñarlo con jQuery UI. Intenté llamar button()al enlace y no funcionó como se esperaba (¡parecía bastante feo!).

alex
fuente
Posible duplicado del botón HTML para NO enviar el formulario
just.another.programmer
2
use <button type="button">para el que no envía el formulario y <input type="submit">para el otro. Entonces $('#formID').submit(function(e){});
tómalo

Respuestas:

1131

El valor predeterminado para el typeatributo de buttonelementos es "enviar". Configúrelo type="button"para producir un botón que no envíe el formulario.

<button type="button">Submit</button>

En palabras del estándar HTML : "No hace nada".

Josh Lee
fuente
14
Según w3schools, eso no es cierto para IE .
R0MANARMY
53
Esa es solo una elección de diseño sorprendentemente mala.
octern
Wow, tú y Alex realmente estaban discutiendo en las revisiones. No veo por qué ninguno de ustedes se preocupa por las citas o no en un atributo.
ADJenks
228

El buttonelemento tiene un tipo predeterminado de submit.

Puede hacer que no haga nada estableciendo un tipo de button:

<button type="button">Cancel changes</button>
s4y
fuente
1
@ B.ClayShannon No realmente. Puede usar el código del lado del servidor para devolver la misma página cuando se hace clic en el botón, pero aún así volverá a cargar la página. Finalmente, el botón es parte del documento y, por lo tanto, las únicas formas de decirle al navegador cómo desea que actúe son HTML y JavaScript.
s4y
17

Solo usa un buen HTML antiguo:

<input type="button" value="Submit" />

Envuélvalo como tema de un enlace, si así lo desea:

<a href="http://somewhere.com"><input type="button" value="Submit" /></a>

O si decide que desea que JavaScript proporcione alguna otra funcionalidad:

<input type="button" value="Cancel" onclick="javascript: someFunctionThatCouldIncludeRedirect();"/>
Jeffrey Blake
fuente
77
Usar un control de botón estándar con el atributo de tipo adecuado es "html viejo y bueno" y crea un marcado mucho más simple.
R0MANARMY
Claramente, no es más simple si en algunos navegadores tiene un tipo de envío predeterminado y en otros tiene un tipo de botón predeterminado. Diablos, incluso solo tener el tipo predeterminado de envío complica las cosas más de lo necesario IMO. Debe haber un marcado que proporcione fácilmente un botón que no hace nada. Y hay:<input type="button" />
Jeffrey Blake
+1 He usado esta técnica exacta muchas veces, y siempre me ha funcionado bien. Una variante es si necesita cancelar el evento de devolución de datos para un botón del lado del servidor basado en algún cálculo del lado del cliente, puede incluir window.event.returnValue = false; en su código que se ejecuta en el evento onclick del lado del cliente para su botón ... es decir, si el uso de un control de validación personalizado no corta la mostaza para usted :)
Adam McKee
1
@ JGB146: El hecho de que no todos los navegadores tengan el mismo valor predeterminado no significa que no respetarán el tipo correcto si se configura manualmente (como lo sugiere jleedev. Sin mencionar las preguntas que específicamente pide una forma de hacerlo sin JavaScript, mientras que su respuesta no tiene eso en cuenta.
R0MANARMY
11
@ JGB146: Buttones un contenedor en HTML. Eso le permite colocar cosas como imágenes o tablas (no estoy seguro de por qué haría esto, pero podría), etc., mientras que inputno es compatible con eso. Hay una diferencia entre los dos, y cada uno tiene su caso de uso apropiado.
R0MANARMY
6
<form onsubmit="return false;">
   ...
</form>
zzjove
fuente
5

Sinceramente, me gustan las otras respuestas. Fácil y sin necesidad de entrar en JS. Pero noté que estabas preguntando por jQuery. Entonces, en aras de la integridad, en jQuery si devuelve false con el controlador .click (), negará la acción predeterminada del widget.

Ver aquí para un ejemplo (y más cosas, también). Aquí está la documentación también .

en pocas palabras, con su código de muestra, haga esto:

<script type="text/javascript">
    $('button[type!=submit]').click(function(){
        // code to cancel changes
        return false;
    });
</script>

<a href="index.html"><button>Cancel changes</button></a>
<button type="submit">Submit</button>

Como beneficio adicional, con esto, puede deshacerse de la etiqueta de anclaje y simplemente usar el botón.

TCCV
fuente
Curiosamente, agregar e.preventDefault()no hace nada para detener el envío (donde comienza function(e)).
Sablefoste
1

Sin establecer el typeatributo, también podría regresar falsede su OnClickcontrolador y declarar el onclickatributo como onclick="return onBtnClick(event)".

DennisVM-D2i
fuente
0

Sí, puede hacer que un botón no envíe un formulario agregando un atributo de tipo de botón de valor: <button type="button"><button>

githaiga geoffrey
fuente
-2
  <form class="form-horizontal" method="post">
        <div class="control-group">

            <input type="text" name="subject_code" id="inputEmail" placeholder="Subject Code">
        </div>
        <div class="control-group">
            <input type="text" class="span8" name="title" id="inputPassword" placeholder="Subject Title" required>
        </div>
        <div class="control-group">
            <input type="text" class="span1" name="unit" id="inputPassword" required>
        </div>
            <div class="control-group">
            <label class="control-label" for="inputPassword">Semester</label>
            <div class="controls">
                <select name="semester">
                    <option></option>
                    <option>1st</option>
                    <option>2nd</option>
                </select>
            </div>
        </div>

        <div class="control-group">
            <label class="control-label" for="inputPassword">Deskripsi</label>
            <div class="controls">
                    <textarea name="description" id="ckeditor_full"></textarea>
 <script>CKEDITOR.replace('ckeditor_full');</script>
            </div>
        </div>



        <div class="control-group">
        <div class="controls">

        <button name="save" type="submit" class="btn btn-info"><i class="icon-save"></i> Simpan</button>
        </div>
        </div>
        </form>

        <?php
        if (isset($_POST['save'])){
        $subject_code = $_POST['subject_code'];
        $title = $_POST['title'];
        $unit = $_POST['unit'];
        $description = $_POST['description'];
        $semester = $_POST['semester'];


        $query = mysql_query("select * from subject where subject_code = '$subject_code' ")or die(mysql_error());
        $count = mysql_num_rows($query);

        if ($count > 0){ ?>
        <script>
        alert('Data Sudah Ada');
        </script>
        <?php
        }else{
        mysql_query("insert into subject (subject_code,subject_title,description,unit,semester) values('$subject_code','$title','$description','$unit','$semester')")or die(mysql_error());


        mysql_query("insert into activity_log (date,username,action) values(NOW(),'$user_username','Add Subject $subject_code')")or die(mysql_error());


        ?>
        <script>
        window.location = "subjects.php";
        </script>
        <?php
        }
        }

        ?>
Andrés
fuente