Cómo capturar un evento de envío usando jQuery ASP.NET ¿solicitud?
Estoy tratando de manejar el evento submit
de un elemento form
usando jQuery.
$("form").bind("submit", function() {
alert("You are submitting!");
});
Esto nunca se activa cuando el formulario se envía (como parte de un postback, por ejemplo, cuando hago clic en un botón o linkbutton).
¿Hay alguna manera de hacer que esto funcione? Podría adjuntar a eventos de los elementos individuales que activan el envío , pero eso es menos que ideal: hay demasiadas posibilidades (por ejemplo, listas desplegables con autopostback = true, atajos de teclado, sucesivamente.)
Actualización: Aquí hay un caso de prueba mínimo - este es el contenido completo de mi página aspx:
<%@ page language="vb" autoeventwireup="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:scriptmanager id="ScriptManager" runat="server" enablepartialrendering="true">
<scripts>
<asp:scriptreference path="/Standard/Core/Javascript/Jquery.min.js" />
</scripts>
</asp:scriptmanager>
<p>
<asp:linkbutton id="TestButton" text="Click me!" runat="server" /></p>
</div>
</form>
<script type="text/javascript">
$(document).ready(function() {
alert("Document ready.");
$("form").submit(function() {
alert("Submit detected.");
});
});
</script>
</body>
</html>
Recibo la alerta "Document ready", pero no la "Submit detected" al hacer clic en el linkbutton.
8 answers
Gracias, @Ken Browning y @russau por señalarme en la dirección del secuestro __doPostBack. He visto un par de enfoques diferentes a esto:
- Codifique mi propia versión de __doPostBack, y póngala más tarde en la página para que sobrescriba la versión estándar.
- Sobrecarga el renderizado en la página e inyecta mi propio código personalizado en el __doPostBack existente.
- Aproveche la naturaleza funcional de Javascript y cree un gancho para agregar funcionalidad a __doPostBack.
Los dos primeros parecen indeseables por un par de razones (por ejemplo, supongamos que en el futuro alguien más necesita agregar su propia funcionalidad a __doPostBack), así que me he ido con #3.
Esta función addToPostBack
es una variación de una técnica común previa a jQuery que solía usar para agregar funciones a window.onload,
y funciona bien:
addToPostBack = function(func) {
var old__doPostBack = __doPostBack;
if (typeof __doPostBack != 'function') {
__doPostBack = func;
} else {
__doPostBack = function(t, a) {
if (func(t, a)) old__doPostBack(t, a);
}
}
};
$(document).ready(function() {
alert("Document ready.");
addToPostBack(function(t,a) {
return confirm("Really?")
});
});
Editar: Cambiado addToPostBack para que
- puede tomar los mismos argumentos que __doPostBack
- el la función que se añade tiene lugar antes de _ _ doPostBack
- la función que se agrega puede devolver false para abortar postback
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-04 20:25:05
He tenido éxito con una solución con sobreescritura __doPostBack()
para llamar a una anulación en form.submit()
(es decir, $('form:first').submit(myHandler)
), pero creo que está sobre-diseñado. A partir de ASP.NET 2.0, la solución más simple es:
-
Defina una función javascript que desea ejecutar cuando se envía el formulario, es decir,
<script type="text/javascript"> function myhandler() { alert('you submitted!'); } </script>
-
Registre su función de controlador dentro de su código posterior, es decir,
protected override void OnLoad(EventArgs e) { base.OnLoad(e); ScriptManager.RegisterOnSubmitStatement(Page, Page.GetType(), "myHandlerKey", "myhandler()"); }
Eso es todo! myhandler()
se llamará desde directo los envíos de button-input y las llamadas automáticas __doPostBack()
por igual.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-04 17:11:55
Sí, esto es molesto. Remplazo __doPostBack
con el mío propio para poder enviar eventos al fuego.
Iirc, este es un problema cuando se envía un formulario a través de javascript (que llama a __doPostBack
hacer) en IE (tal vez otros navegadores también).
Mis __doPostBack
llamadas de reemplazo $(theForm).submit()
después de replicar el comportamiento predeterminado (valores de relleno en entradas ocultas)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-05 00:32:38
No se como hacerlo con jQuery, pero puedes agregar una propiedad OnClientClick a la ASP.NET control:
<asp:linkbutton id="TestButton" text="Click me!" runat="server" OnClientClick="alert('Submit detected.');" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-05 14:31:00
Si está utilizando.NET Framework 3.5 o superior, puede usar ScriptManager.RegisterOnSubmitStatement () en su código del lado del servidor. El script registrado será llamado tanto en normal submit como en doPostBack.
ScriptManager.RegisterOnSubmitStatement(this, this.GetType(), "myKey", "SomeClientSideFunction();");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-14 19:31:11
Esto funciona para capturar el envío:
$("form input[type=submit]").live("click", function(ev) {
ev.preventDefault();
console.log("Form submittion triggered");
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 08:43:36
$(document).ready(function () {
$(this).live("submit", function () {
console.log("submitted");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-10 22:40:12
Debe agregar OnClientClick a linkbutton
OnClientClick= " if(!form ('#form1').valid ()) devuelve false; "
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-18 16:42:13