Вопрос по jquery, webforms, form-submit, asp.net – Как перехватить событие отправки с помощью jQuery в приложении ASP.NET?

28

я пытаюсь справиться сsubmit событиеform Элемент, используя jQuery.

    $("form").bind("submit", function() {
        alert("You are submitting!");
    });

Это никогда не срабатывает, когда форма отправляется (как часть обратной передачи, например, когда я нажимаю на кнопку или кнопку ссылки).

Есть ли способ сделать эту работу? Я мог бы прикрепить к событиям отдельных элементов, которые вызывают отправку, но этоЭто не идеально - слишком много возможностей (например, выпадающие списки с autopostback = true, сочетания клавиш и т. д.)

Обновить: Вот'Это минимальный тестовый пример - это все содержимое моей страницы aspx:






    


    
        
            
                
                    
                
            
            <p>
                </p>
        
    

    
        $(document).ready(function() {
            alert("Document ready.");
            $("form").submit(function() {
                alert("Submit detected.");
            });
        });
    



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

Ваш Ответ

8   ответов
0

Это работает для захвата представить:

$("form input[type=submit]").live("click", function(ev) {
    ev.preventDefault();
    console.log("Form submittion triggered");
  });
34

Спасибо, @Ken Browning и @russau за то, что они указали мне на угон __doPostBack. Я'Мы видели несколько разных подходов к этому:

Напечатайте мою собственную версию __doPostBack и поместите ее позже на страницу, чтобы перезаписать стандартную.Перегрузите Render на странице и вставьте свой собственный код в существующий __doPostBack.Воспользуйтесь Javascript 's функциональный характер и создать хук для добавления функциональности в __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, чтобы прервать обратную передачу
Большое спасибо за этот ответ! Мне было очень тяжело с этим в Sharepoint, но я не могне понимаю, почему. Я думал, что оставлю комментарий на тот случай, если кто-то еще будет зацикливаться на этом. Для Sharepoint, в дополнение к вашему коду, вам нужно добавить следующее прямо перед возвратом анонимной функции: _spFormOnSubmitCalled = false; electrichead
Очень элегантное решение. Sarin
отличное решение для отображения уведомлений о загрузке с помощью jQuery при использовании AutoPostBack для элементов управления на панелях обновления. Bobby Borszich
Я взял это решение и поместил его в плагин jQuery:plugins.jquery.com/beforePostBackI» Peter
Большое спасибо за то, что поделились этим. У меня просто была противоположная проблема - обработчик jQuery для формысобытие отправки s было запущено (и показывает загрузочный gif), но _doPostBack не былне вызывается, потому что проверка не удалась. Очень странно, но больше не проблема! tomfumb
12

у нас был успех срешение с переопределением__doPostBack() чтобы вызвать переопределение наform.submit() (Т.е.$('form:first').submit(myHandler)), но я думаю, что этос перепроектирован. Начиная с ASP.NET 2.0, самый простой обходной путь:

Определите функцию javascript, которую вы хотите запустить при отправке формы, т.е.



function myhandler()
{
    alert('you submitted!');
}


Зарегистрируйте свою функцию-обработчик в своем коде, т.е.

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    ScriptManager.RegisterOnSubmitStatement(Page, Page.GetType(), 
                                            "myHandlerKey", "myhandler()");
}

Тот'все!myhandler() будет вызываться из простой отправки с помощью кнопки и автоматически__doPostBack() звонит одинаково.

Я исправлен, спасибо за обновление, Джеймс - whitneyland
Чтобы уточнить: веб-формы позволяют только одну форму на странице, объявленной сRunat =»сервер», У вас могут быть другие несерверные формы на странице. James McCormack
Мне это нравится. Это'это правильно ".NET way " обработки вещей. m-albert
Просто чтобы уточнить, в вашем примереmyHandlerKey» это идентификатор тега формы. Как это: <form id = "myHandlerKey» Runat =»Сервер "> whitneyland
Извините, нет - проверьте документацию:msdn.microsoft.com/en-us/library/bb301794.aspx,ключ уникально идентифицирует скрипт, чтобы предотвратить повторную регистрацию. Кстати, не должно быть необходимости однозначно идентифицировать элемент формы, поскольку веб-формы допускают только одну форму на страницу. James McCormack
1

Я неНе знаю, как это сделать с помощью jQuery, но вы можете добавить свойство OnClientClick к элементу управления ASP.NET:


Это нене поможет в моей ситуации. Во-первых, если бы я собирался обработать каждый элемент управления, который мог бы вызвать обратную передачу, было бы лучшим решением использовать jQuery для захвата событий по ним по всем направлениям. Но мне нужно глобальное решение для множества различных форм, и я неЯ не хочу возвращаться и трогать каждый элемент управления, который может вызвать обратную передачу. Herb Caudill
4

Да, это раздражает. Я заменяю__doPostBack со своим, чтобы я мог отправить события на огонь.

Iirc, это проблема при отправке формы через JavaScript (который вызывает__doPostBack делать) в IE (возможно, и в других браузерах).

мой__doPostBack вызовы замены$(theForm).submit() после репликации поведения по умолчанию (вставка значений в скрытые входы)

@russau - ЭтоМое впечатление от статьи, что угон постбэка не долженНе нужно ли с Whidbey (VS2005)? Herb Caudill
Угон __doPostBack:weblogs.asp.net/vga/archive/2004/03/01/... russau
@ Трава Ну, причина их кражи отличается от вашей. Похоже, их причина была устранена. Твой определенно не имеет. Если вы хотите, чтобы события отправки jQuery запускались всякий раз, когда обратная передача инициируется вызовом __doPostBack, тогда вы 'Вам нужно будет захватить __doPostBack. Ken Browning
1

Если вы используете .NET Framework 3.5 или выше, вы можете использоватьScriptManager.RegisterOnSubmitStatement () в вашем коде на стороне сервера. Зарегистрированный скрипт будет вызываться как при обычной отправке, так и при DoPostback.

ScriptManager.RegisterOnSubmitStatement(this, this.GetType(), "myKey", "SomeClientSideFunction();");
0
 $(document).ready(function () {

          $(this).live("submit", function () {

                console.log("submitted");
             }
}
-2

Вам нужно добавить OnclientClick для кнопки ссылки

OnClientClick =»если (! $ (»# Form1') .valid ()) return false; "

Похожие вопросы