Drupal → Запретить установку ajax-кнопке атрибут disabled при клике
Друпал при клике на ajax кнопку устанавливает ей атрибут disabled
для запрета повторной отправки формы. Чтобы отключить такое поведение и разрешить многократное нажатие ajax-кнопки, нужно во-первых, подключить js файл со следующим кодом:
(function ($) { var originalAjaxBeforeSend = Drupal.ajax.prototype.beforeSend; Drupal.ajax.prototype.beforeSend = function(xmlhttprequest, options) { var elementFocused = $(this.element).is(':focus'); // Call original function originalAjaxBeforeSend.apply(this, arguments); if ('disabled' in this && !this.disabled) { this.ajaxing = false; $(this.element).removeClass('progress-disabled').prop('disabled', false); // Restore focus if (elementFocused) { $(this.element).focus(); } // Abort previous ajax request if (this.$form && this.$form.data('jqxhr')) { this.$form.data('jqxhr').abort(); } } } })(jQuery);
Во-вторых, в свойстве #ajax
нужной кнопки добавить 'disabled' => FALSE
:
$form['submit'] = array( ... '#type' => 'submit', '#ajax' => array( ... 'disabled' => FALSE, ), );
Profit.
Этим же способом можно запретить дизаблить textfield-ы при keyup:
$form['textfield'] = array( ... '#type' => 'textfield', '#ajax' => array( ... 'event' => 'keyup', 'disabled' => FALSE, ), );
Будет работать как с Drupal 7 так и с Drupal 8+.
Комментарии
А где это может пригодиться? В смысле сложно представить ситуацию, когда нужно разрешить повторную отправку форму до возвращения ответа. Обычно такое поведение стремятся как раз таки обойти. У Вас был какой-то специфичный функционал?
Например запретить дизаблить текстовый input при вводе текста, так как в него нельзя ввести текст длиннее одного символа.
Посмотрите на подход к решению этой проблемы в
views exposed forms
. Я имею в виду, что если в настройкахview
указано, что она должна обрабатываться аяксом, то в раскрытом фильтре (текстовом) нет никакой блокировки поля. Вводи текст сколько хочешь. Там запрос уходит по таймауту, а сам таймер сбрасывается при вводе текста.потому что ajax там навешен на кнопку, а не на конкретное поле
Точно, Вы правы.
Но все же, что при таком подходе, как в посте, уйдет столько запросов, сколько символов будет введено в текстовое поле. А по идее запрос должен быть один.
/offtop
У Вас, кажется, не работает опция
Уведомлять меня о новых комментариях
.Без разницы сколько уйдёт запросов, поле при любом количестве будет дизаблиться.
Оставить комментарий