Ich versuche, das Ereignis submit
eines Elements form
mit jQuery zu behandeln.
$("form").bind("submit", function() {
alert("You are submitting!");
});
Dies wird nie ausgelöst, wenn das Formular gesendet wird (als Teil eines Postbacks, z. B. wenn ich auf eine Schaltfläche oder einen Link-Button klicke).
Gibt es eine Möglichkeit, diese Arbeit zu machen? Ich könnte Ereignisse der einzelnen Elemente anhängen, die die Übermittlung auslösen, aber das ist nicht ideal - es gibt einfach zu viele Möglichkeiten (z. B. Dropdown-Listen mit Autopostback = true, Tastaturkürzel usw.)
Update: Hier ist ein minimaler Testfall - das ist der gesamte Inhalt meiner aspx-Seite:
<%@ 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>
Ich erhalte die Warnung "Dokument bereit", aber nicht "Senden erkannt", wenn ich auf den Link-Button klicke.
Danke, @Ken Browning und @russau, dass sie mich in die Richtung des Hijacking __doPostBack gerichtet haben. Ich habe dazu verschiedene Ansätze gesehen:
Die ersten beiden scheinen aus mehreren Gründen unerwünscht zu sein (zum Beispiel, in der Zukunft muss ein anderer Benutzer __doPostBack seine eigene Funktionalität hinzufügen), also habe ich mit # 3 angefangen.
Diese addToPostBack
-Funktion ist eine Variation einer üblichen Pre-jQuery-Technik, mit der ich window.onload,
Funktionen hinzufügte, und sie funktioniert gut:
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?")
});
});
Edit: addToPostBack geändert
Ich hatte Erfolg mit einer Lösung mit Überschreiben von __doPostBack()
, um eine Überschreibung von form.submit()
(d. H. $('form:first').submit(myHandler)
) aufzurufen, aber ich denke, es ist übertrieben. Ab ASP.NET 2.0 besteht die einfachste Problemumgehung darin,
Definieren Sie eine Javascript-Funktion, die beim Senden des Formulars ausgeführt werden soll, d. H.
<script type="text/javascript">
function myhandler()
{
alert('you submitted!');
}
</script>
Registrieren Sie Ihre Handler-Funktion in Ihrem Codebehind, d. H.
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ScriptManager.RegisterOnSubmitStatement(Page, Page.GetType(),
"myHandlerKey", "myhandler()");
}
Das ist alles! myhandler()
wird von einfachen Eingaben der Tastatureingaben und automatischen __doPostBack()
-Aufrufen gleich aufgerufen.
Ja, das ist nervig. Ich ersetze __doPostBack
durch meinen eigenen, damit ich Ereignisse einreichen kann, die ausgelöst werden sollen.
Iirc, dies ist ein Problem beim Senden eines Formulars über Javascript (das Aufruf an __doPostBack
do) in IE (möglicherweise auch anderen Browsern).
Mein __doPostBack
-Ersatz ruft $(theForm).submit()
auf, nachdem das Standardverhalten repliziert wurde (Werte in ausgeblendete Eingaben füllen).
Wenn Sie .NET Framework 3.5 oder höher verwenden, können Sie ScriptManager.RegisterOnSubmitStatement () in Ihrem serverseitigen Code verwenden. Das registrierte Skript wird sowohl beim normalen Senden als auch beim DoPostback aufgerufen.
ScriptManager.RegisterOnSubmitStatement(this, this.GetType(), "myKey", "SomeClientSideFunction();");
Ich weiß nicht, wie es mit jQuery geht, aber Sie können dem ASP.NET-Steuerelement eine OnClientClick-Eigenschaft hinzufügen:
<asp:linkbutton id="TestButton" text="Click me!" runat="server" OnClientClick="alert('Submit detected.');" />
Dies funktioniert zum Erfassen des Einreichens:
$("form input[type=submit]").live("click", function(ev) {
ev.preventDefault();
console.log("Form submittion triggered");
});
$(document).ready(function () {
$(this).live("submit", function () {
console.log("submitted");
}
}