Как захватить событие отправки, используя jQuery в приложении ASP.NET?
Я пытаюсь обработать событие submit
элемента form
, используя jQuery.
$("form").bind("submit", function() {
alert("You are submitting!");
});
Это никогда не срабатывает, когда форма отправляется (как часть обратной передачи, например, когда я нажимаю кнопку или ссылку).
Есть ли способ сделать эту работу? Я мог бы присоединяться к событиям отдельных элементов, которые запускают представление, но это меньше, чем просто идеал. Есть слишком много возможностей (например, dropdownlists с autopostback = true, быстрыми клавишами и т.д.).
Обновление: Здесь минимальный тестовый пример - это все содержимое моей страницы 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>
Я получаю предупреждение "Документ готов", но не "Отправить обнаружен" при нажатии на ссылку.
Ответы
Ответ 1
Спасибо, @Ken Browning и @russau за то, что указали мне в сторону угона __doPostBack.
Я видел несколько разных подходов к этому:
- Жесткий код моей собственной версии __doPostBack и поместите его позже на страницу, чтобы он перезаписывал стандартный.
- Перегрузка Render на странице и ввод моего собственного кода в существующий __doPostBack.
- Воспользуйтесь функциональностью Javascript и создайте крючок для добавления функциональности в __doPostBack.
Первые два кажутся нежелательными по нескольким причинам (например, предположим, что в будущем кому-то еще нужно добавить свои собственные функции в __doPostBack), поэтому я пошел с №3.
Эта функция addToPostBack
является вариацией общего метода pre-jQuery, который я использовал для добавления функций в window.onload,
, и он работает хорошо:
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?")
});
});
Изменить: Изменен addToPostBack, чтобы
- он может принимать те же аргументы, что и __doPostBack
- добавляемая функция выполняется до __doPostBack
- добавленная функция может возвращать false для отмены обратной передачи
Ответ 2
У меня был успех с решение с переопределением __doPostBack()
, чтобы вызвать переопределение на form.submit()
(т.е. $('form:first').submit(myHandler)
), но я думаю, что это слишком сложно. Начиная с ASP.NET 2.0, наиболее простым способом является:
-
Определите функцию javascript, которую вы хотите запустить, когда форма отправлена i.e.
<script type="text/javascript">
function myhandler()
{
alert('you submitted!');
}
</script>
-
Зарегистрируйте свою функцию обработчика внутри вашего кода. i.e.
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ScriptManager.RegisterOnSubmitStatement(Page, Page.GetType(),
"myHandlerKey", "myhandler()");
}
Это все! myhandler()
будет вызываться с помощью простых кнопок ввода-вывода и автоматического вызова __doPostBack()
.
Ответ 3
Да, это раздражает. Я заменяю __doPostBack
своим собственным, чтобы я мог запускать события отправки.
Iirc, это проблема при отправке формы через javascript (который вызывает __doPostBack
do) в IE (возможно, другие браузеры тоже).
My __doPostBack
заменяет вызовы $(theForm).submit()
после репликации поведения по умолчанию (значения набивки в скрытых вводах)
Ответ 4
Я не знаю, как это сделать с помощью jQuery, но вы можете добавить свойство OnClientClick в элемент управления ASP.NET:
<asp:linkbutton id="TestButton" text="Click me!" runat="server" OnClientClick="alert('Submit detected.');" />
Ответ 5
Если вы используете .NET Framework 3.5 или выше, вы можете использовать ScriptManager.RegisterOnSubmitStatement() в своем серверном коде. Зарегистрированный script будет вызван как на обычный submit, так и на DoPostback.
ScriptManager.RegisterOnSubmitStatement(this, this.GetType(), "myKey", "SomeClientSideFunction();");
Ответ 6
Это работает для захвата submit:
$("form input[type=submit]").live("click", function(ev) {
ev.preventDefault();
console.log("Form submittion triggered");
});
Ответ 7
$(document).ready(function () {
$(this).live("submit", function () {
console.log("submitted");
}
}
Ответ 8
Вам нужно добавить OnclientClick в linkbutton
OnClientClick = "if (! $('# form1'). valid()) возвращает false;"