¿Cómo cancelo el envío del formulario en el evento al hacer clic en el botón Enviar?

99

Estoy trabajando en una aplicación web ASP.net.

Tengo un formulario con un botón de envío. El código del botón de enviar se parece a <input type='submit' value='submit request' onclick='btnClick();'>.

Quiero escribir algo como lo siguiente:

function btnClick() {
    if (!validData())
        cancelFormSubmission();
}

¿Cómo hago esto?

Río vivian
fuente
ay, esto me está haciendo doler la cabeza. Tengo varias submitentradas diferentes . Creo que intentaré usar los controles del lado del servidor en esta página.
Vivian River

Respuestas:

183

Es mejor que hagas ...

<form onsubmit="return isValidForm()" />

Si isValidForm()regresa false, entonces su formulario no se envía.

Probablemente también debería mover su controlador de eventos desde en línea.

document.getElementById('my-form').onsubmit = function() {
    return isValidForm();
};
alex
fuente
Bien, pero parece que no puedo ir onsubmita trabajar cuando uso ASP.net porque asp.net envuelve TODO en su propia forma ...
Vivian River
5
Puede utilizar su segunda sugerencia. Javascript en línea es el diablo de todos modos.
Stephen
3
Si está utilizando formularios web ASP.NET (pista: no lo haga), no intente incluir otros formularios. Son simplemente incompatibles. Escuché que ASP.NET MVC le permite crear aplicaciones web usando marcado idiomático.
Quentin
@David, si el uso de otros formularios es incompatible con los formularios web de ASP.net, ¿debería usar solo controles del lado del servidor?
Vivian River
2
Alguien más ha respondido EXACTAMENTE como usted stackoverflow.com/a/23604664/1639385 . Creo que fue demasiada coincidencia.
Ulysses Alves
43

Cambie su entrada a esto:

<input type='submit' value='submit request' onclick='return btnClick();'>

Y devuelve falso en tu función

function btnClick() {
    if (!validData())
        return false;
}
Mikefrey
fuente
13

Necesitas cambiar

onclick='btnClick();'

a

onclick='return btnClick();'

y

cancelFormSubmission();

a

return false;

Dicho esto, trataría de evitar los atributos de evento intrínsecos a favor de JS discreto con una biblioteca (como YUI o jQuery) que tenga una buena API de manejo de eventos y se vincule con el evento que realmente importa (es decir, el evento de envío del formulario en su lugar del evento de clic del botón).

Quentin
fuente
2
El uso de onclick permitirá al usuario presionar enter y omitir la verificación.
Cfreak
7

A veces onsubmitno funcionaría con asp.net.

Lo resolví de manera muy fácil.

si tenemos tal forma

<form method="post" name="setting-form" >
   <input type="text" id="UserName" name="UserName" value="" 
      placeholder="user name" >
   <input type="password" id="Password" name="password" value="" placeholder="password" >
   <div id="remember" class="checkbox">
    <label>remember me</label>
    <asp:CheckBox ID="RememberMe" runat="server" />
   </div>
   <input type="submit" value="login" id="login-btn"/>
</form>

Ahora puede obtener ese evento antes de la devolución del formulario y detener la devolución y hacer todo el ajax que desee con este jquery.

$(document).ready(function () {
            $("#login-btn").click(function (event) {
                event.preventDefault();
                alert("do what ever you want");
            });
 });
Sherif sombrío
fuente
5

debe cambiar el tipo de submita button:

<input type='button' value='submit request'>

en vez de

<input type='submit' value='submit request'>

luego obtiene el nombre de su botón en javascript y asocia la acción que desee

var btn = document.forms["frm_name"].elements["btn_name"];
btn.onclick = function(){...};

funcionó para mí espero que ayude.

Mahoma
fuente
4

Necesitas return false;:

<input type='submit' value='submit request' onclick='return btnClick();' />

function btnClick() {
    return validData();
}
SLaks
fuente
1

¿Por qué no cambiar el botón de enviar por un botón normal y, en el evento de clic, enviar su formulario si pasa las pruebas de validación?

p.ej

<input type='button' value='submit request' onclick='btnClick();'>

function btnClick() { 
    if (validData()) 
        document.myform.submit();
} 
George Johnston
fuente
1
Al presionar Enter, se omitirá el cheque. Usar onSubmit
Cfreak
Entonces no funcionará en absoluto si JavaScript no está disponible. <a href=" icant.co.uk/articles/pragmatic-progressive-enhancement/… sobre cosas que funcionan</a>.
Quentin
1

Necesitas onSubmit. De lo onClickcontrario, alguien puede simplemente presionar enter y omitirá su validación. En cuanto a cancelar. debe devolver falso. Aquí está el código:

<form onSubmit="return btnClick()">
<input type='submit' value='submit request'>

function btnClick() {
    if (!validData()) return false;
}

Editar onSubmit pertenece a la etiqueta de formulario.

Cfreak
fuente
esto no funcionará. si los datos son válidos, no devuelve verdadero. poner retorno verdadero; al final de la función btnClick ()
NickSoft
1

Es simple, solo devuelve falso;

El siguiente código va dentro del clic del botón enviar usando jquery.

if(conditionsNotmet)
{
return false;
}
omar-ali
fuente
0

utilizar onclick='return btnClick();'

y

function btnClick() {
    return validData();
}
Adán
fuente
2
presionar enter omitirá el cheque. Usar onSubmit
Cfreak
0
function btnClick() {
    return validData();
}
mbeckish
fuente
1
Es necesario hacer más que esto para que funcione. He intentado hacer que el functino devuelva verdadero o falso y no parece haber ninguna diferencia.
Vivian River
1
Su respuesta es correcta. Voto a favor. También debe devolverlo en la etiqueta de entrada
Cfreak
1
Además, prefiero usar ev.preventDefault()o ev.returnValue = falsecancelar el comportamiento predeterminado pero no evitar la propagación de eventos, en caso de que otros controles observen el mismo evento en el mismo elemento. Úselo return falsesolo cuando desee detener la propagación del evento y cancelar la acción predeterminada. Vea este artículo .
Klemen Slavič
Tener que devolverlo en el propio controlador de eventos es la información más importante que faltaba en la respuesta. Sin eso, la respuesta está incompleta y no ayuda lo suficiente como para merecer un voto positivo.
Quentin
0
<input type='button' onclick='buttonClick()' />

<script>
function buttonClick(){
    //Validate Here
    document.getElementsByTagName('form')[0].submit();
}
</script>
Persona
fuente
2
Para obtener una respuesta útil, esta reacción debe ampliarse. Explique por qué esta es una respuesta a la pregunta.
Jeroen Heier
0

Con JQuery es aún más simple: funciona en Asp.Net MVC y Asp.Core

<script>
    $('#btnSubmit').on('click', function () {

        if (ValidData) {
            return true;   //submit the form
        }
        else {
            return false;  //cancel the submit
        }
    });
</script>
Tidoy007
fuente