Определение кнопки отправки нажатием на jQuery/JavaScript

14 clifgriffin [2011-04-20 18:08:00]

Я использую некоторые формы из приложения PHP, которое я не писал. Для этого я придумал это умное решение:

jQuery("form").submit(function(event) {
    // get some values from elements on the page:
    var the_form = jQuery(this);
    var data = the_form.serialize();
    var url = the_form.attr( 'action' );
    var button = event.originalEvent.explicitOriginalTarget;

    data = data + "&" + button.name + "=" + button.value;

    // Send the data using post and put the results in a div
    jQuery.post( url, data, function() {
        //Do something crazy
    });

    // stop form from submitting normally
    if (event.preventDefault) 
    { 
        event.preventDefault(); 
    } 
    else 
    {
        event.returnValue = false; 
    }
});

Что работает отлично. Я ушел от радости. Проблема в том, что я случайно использовал свойство Mozilla/Gecko, чтобы определить, какая кнопка была нажата. (event.originalEvent.explicitOriginalTarget) Это означает, что это работает только в Firefox.:-(

Все это необходимо, потому что веб-приложение, которое я увеличиваю, полагается на имя/значение кнопки, находящееся в данных сообщения, чтобы правильно обработать форму. Итак, мой вопрос простыми словами:

Какой лучший, кросс-браузерный способ определить, какая кнопка была нажата в jQuery submit?

Edit: И вот мое решение.

jQuery("some selector that targets your form").find(":submit").click(function(event) {
    // get some values from elements on the page:
    var the_form = jQuery(this).parents("form");
    var data = the_form.serialize();
    var url = the_form.attr( 'action' );
    var button = event.target;

    data = data + "&" + button.name + "=" + button.value;

    // Send the data using post and put the results in a div
    jQuery.post( url, data, function() {
        //Do something crazy
    });

    // stop form from submitting normally
    if (event.preventDefault) 
    { 
        event.preventDefault(); 
    } 
    else 
    {
        event.returnValue = false; 
    }
});

javascript jquery cross-browser


4 ответа


4 Решение greggreg [2011-04-20 18:28:00]

Посмотрите на этот вопрос: эквивалент CrossBrowser параметра события explicitOriginalTarget

Вам нужно будет прикрепить прослушиватели событий к кнопкам вместо формы, чтобы получить хороший надежный способ определить, какой из них отправил submit.


1 leon [2011-04-20 18:17:00]

http://api.jquery.com/event.target/

jquery.event.target должен работать, потому что он нормализуется для большинства браузеров.

jquery.event.currentTarget можно использовать для извлечения текущего элемента в цепочке пузырьков событий.

Edit-- После некоторого размышления и предложения @greg: Я опубликовал фрагмент кода в jsfiddle.


1 Tgr [2011-05-18 14:30:00]

Использование обработчиков кликов для отправки формы является проблематичным beacuse, вы не можете использовать обработчики событий отправки для валидации (что делает его практически любым плагином-валидатором). Кроме того, когда вы не используете AJAX для публикации, отключение кнопок отправки может иметь странные эффекты в некоторых браузерах, если они сделаны в событии клика, а не в событии отправки.

Способ jQuery.Form решает, что это настроить обработчик кликов, который хранит нажатую кнопку (а затем очищает ее с небольшим таймаутом), и используйте обработчик отправки для фактического отправки содержимого формы через AJAX.


1 Shaddy Zeineddine [2012-05-26 00:15:00]

Вот функция, которую я использовал для "ajaxify" моих форм с помощью jQuery.

function ajaxifyForm(form, callback)
{
    var clicked

    form.find("button").click(function()
    {
        if (clicked != null) clicked.removeAttr("data-clicked")
        clicked = $(this)
        $(this).attr("data-clicked", 1)
    })

    form.submit(function(event)
    {
        var data = {}
        var name = ""

        form.find(":input").each(function()
        {
            var input = $(this)

            if (!(name = input.attr("name"))) return

            switch (input.attr("type"))
            {
                case "radio":
                case "checkbox":
                    if (input.attr("checked")) data[name] = input.val()
                    break
                case "submit":
                    if (input.attr("data-clicked")) data[name] = input.val()
                    break
                default:
                    data[name] = input.val()
            }
        })

        $.ajax({
            url: form.attr("action"),
            success: function(data)
            {
                if (typeof callback == "function") callback("success")
            },
            error: function()
            {
                if (typeof callback == "function") callback("error")
            },
            data: data,
            type: form.attr("method")
        })

        return false
    })

    return form
}