Подтвердить что ты не робот

Как захватить событие отправки, используя 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>

Я получаю предупреждение "Документ готов", но не "Отправить обнаружен" при нажатии на ссылку.

4b9b3361

Ответ 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;"