Диалог jquery-ui: сделать кнопку в диалоге действием по умолчанию (клавиша Enter) - PullRequest
55 голосов
/ 26 марта 2010

В модальном диалоговом окне jquery есть способ выбрать кнопку в качестве действия по умолчанию (действие, которое выполняется, когда пользователь нажимает клавишу ввода)?

Пример веб-сайта jquery: модальное сообщение jquery

В приведенном выше примере диалоговое окно закрывается, когда пользователь нажимает клавишу Esc. Я хотел бы, чтобы действие кнопки «ОК» вызывалось, когда пользователь нажимает клавишу Enter.

Ответы [ 14 ]

36 голосов
/ 26 марта 2010

В функции открытия вашего диалогового окна вы можете сфокусировать кнопку:

$("#myDialog").dialog({
    open: function() {
      $(this).parents('.ui-dialog-buttonpane button:eq(0)').focus(); 
    }
});

Измените :eq(0), если он имеет другой индекс, или найдите по имени и т. Д.

33 голосов
/ 26 января 2012

Мне нравится этот (он работает для меня), который оставляет фокус, где я хотел быть (текстовое поле)

    $("#logonDialog").keydown(function (event) {
        if (event.keyCode == $.ui.keyCode.ENTER) {
            $(this).parent()
                   .find("button:eq(0)").trigger("click");
            return false;
        }
    });

Однако, это работает только для одной кнопки (кнопка Ok), при необходимости можно установить ': eq (n)', чтобы выбрать другую кнопку.

Примечание: Я добавил новую строку, возвращающую значение false, чтобы предотвратить образование пузырей при обработке клавиши ввода, надеюсь, это поможет лучше, чем раньше.

20 голосов
/ 12 декабря 2011

попробуйте так:

$("#myDialog").dialog({
    open: function() {
         $(this).siblings('.ui-dialog-buttonpane').find('button:eq(1)').focus(); 
    }
});
12 голосов
/ 26 марта 2010

Этот другой вопрос о стековом потоке должен привести вас туда, куда вы хотите:

$('#DialogTag').keyup(function(e) {
    if (e.keyCode == 13) {
        //Close dialog and/or submit here...
    }
});
8 голосов
/ 29 августа 2013

Другая опция, которая дает вам больше контроля над всеми кнопками в диалоговом окне, заключается в добавлении их в виде массива кнопок. Затем в открытое событие вы можете получить кнопки по идентификатору и делать все, что вы хотите (в том числе установить фокус )

$('#myDialog').dialog({
    buttons: [  
                {
                    id: "btnCancel",
                    text: "Cancel",
                    click: function(){
                        $(this).dialog('close');
                    }
                },
                {
                    id: "btnOne",
                    text: "Print One",
                    click: function () {
                        SomeFunction(1);
                    }
                },
                {
                    id: "btnTwo",
                    text: "Print Two",
                    click: function(){
                        SomeFunction(0);
                    }
                }
            ],
    open: function () {
        if ($('#hiddenBool').val() != 'True') {
            $('#btnOne').hide();
        }
        $("#btnTwo").focus();
    }
});
5 голосов
/ 21 мая 2013

Небольшое отклонение для использования названия кнопок в качестве селектора. Это выглядит немного лучше, но есть очевидное дублирование с текстовой строкой кнопки. Фактор по вкусу.

$("#confirm-dialog").dialog({
    buttons: {
        "Cancel" : function(){},
        "OK" : function(){}
    },
    open: function() {
        $(this).siblings('.ui-dialog-buttonpane').find("button:contains('OK')").focus(); 
    }
});
2 голосов
/ 09 марта 2012

Самым простым способом было бы использовать действие отправки в форме в диалоговом окне, однако:

  • Я не хотел запрашивать форму в диалоговом окне (например, разные браузеры по-разному обрабатывают клавишу ввода, а некоторые не всегда выполняют ввод при вводе).
  • Я хотел, чтобы это работало, если пользователь нажимает на панели заголовка или панели кнопок перед нажатием Enter.
  • Я хотел создать библиотечный метод, который я могу использовать для ЛЮБОГО Диалог jQueryUI.

Компания, в которой я работаю, это 'EBL', и я избегаю глобальных возможностей ... отсюда и префикс следующих функций:

EBL.onUiDialogOpen = function (event, ui, hideX, actionFirstButtonOnEnterKey) {

    if (hideX) {
        // There is no option to hide the 'X' so override.
        $(".ui-dialog-titlebar-close").hide();
    }

    if (actionFirstButtonOnEnterKey) {
        /* (event.target) will give the div that will become the content 
        of a UI dialog, once div is 'opened' is it surrounded by a 
        parent div that contains title and buttonpane divs as well as 
        content div - so I use .parent()

        ...The keyup function is binded to all descendants, therefore:
              -We need the e.stopPropagation() line.
              -This code is NOT what you want if you DON'T want enter 
               key to initiate first button regardless of selected control.
        */
        $(event.target).parent().bind('keydown.justWhileOpen', function (e) {
            if (e.keyCode === $.ui.keyCode.ENTER) {
                e.stopPropagation();
                $(event.target).next('.ui-dialog-buttonpane')
                    .find('button:first').click();
            }
        });
    }
};

... работает в комбинации с:

EBL.onUiDialogClose = function (event, ui) {
    // Remove keyup handler when we close dialog
    $(event.target).parent().unbind('.justWhileOpen');
};

Вам не нужен .onUiDialogClose, если вы используете динамически созданный div и впоследствии уничтожаете его.

Ниже вы можете увидеть, как я использую эти библиотечные функции при инициализации нединамического диалога ...

$('#divName').dialog({
    //...
    open: function (event, ui) { EBL.onUiDialogOpen(event, ui, false, true); },
    close: function (event, ui) { EBL.onUiDialogClose(event, ui); },
    //...
});

До сих пор я проверял это в IE9 и последней версии Chrome / Firefox. Вы должны подтвердить диалог как необходимый в вашей функции 'Ok'.

1 голос
/ 02 ноября 2013

Это работало для меня в диалоге с использованием jquery 1.10.2

dialog({
    focus: function() {
        $(this).on("keyup", function(e) {
            if (e.keyCode === 13) {
                $(this).parent().find("button:eq(1)").trigger("click");
                return false;
            }
        });
    },

больше опций ...

1 голос
/ 18 октября 2013
$("#logonDialog").keydown(function (event) {if (event.keyCode == 13) {
        $(this).parent().find("button:eq(0)").trigger("click");
        return false;
    }
});
1 голос
/ 27 июня 2013

Я использую версию 1.10.0. Я не мог заставить его работать с открытым, но с фокусом. Здесь фокусируется вторая кнопка:

focus: function(){
  $(this).siblings('.ui-dialog-buttonpane').find('button:eq(1)').focus();
}
...