jQuery: автоматическая отправка при вводе или автозаполнение браузера - PullRequest
0 голосов
/ 03 февраля 2012

Я использую этот код JavaScript для отправки ближайшей кнопки, если пользователь нажимает кнопку «ввод» в форме:

jQuery.fn.installDefaultButton = function()
{
$('form input, form select').live('keypress', function(e)
{
    if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13))
    {
        if ($(this).closest('form').find('button').size() <= 0)
        {
            return true;
        }
        var defaultButton = $(this).closest('form').find('button:first');
        defaultButton.click();
        $(this).blur();
        return false;
    }
    else
    {
        return true;
    }
});
return this;

};

Если автозаполнение браузера включено ипользователь выбрал предложенное значение, нажав клавишу «Ввод», чтобы форма была отправлена.Но это не желаемое поведение.Отправка не должна быть выполнена в этом случае.Есть ли способ предотвратить это?

edit: Вот небольшой пример:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1 /DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
    <form action="action.do">
        <input name="input1"/>
        <input name="input2"/>
        <button type="submit" name="button_action1" class="button">Button 1</button>
        <input name="input3"/>
        <input name="input4"/>
        <button type="submit" name="button_action2" class="button">Button 2</button>
    </form>
</body>

1 Ответ

1 голос
/ 03 февраля 2012

У меня не было возможности попробовать это, но это должно сработать для вас.

$("form").live('change', function(e) {
   $(this).data('changed', true); 
});

$('form input, form select').live('keypress', function(e)
{
    var form = $(this).closest('form');
    if (((e.which && e.which == 13 || (e.keyCode && e.keyCode == 13)) && form.data('changed') == true)
    {
         if ($(this).closest('form').find('button').size() <= 0)
        {
            return true;
        }

        var defaultButton = form.find('button:first');
        defaultButton.click();
        $(this).blur();
        console.log("Submitted!");
        form.data('changed', false);
        return false;
    }
    else
    {
        return true;
    }
});

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

Редактировать:

Чтобы показать вам, что я имел в виду

$("form").live('focus', function(e) {
   $(this).data('changed', true); 
});
...