Drupal → Запретить дизейблить ajax-кнопки при клике и ajax-поля при keyup

09.09.2016

Друпал при клике на 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 8+. Для Drupal 7 надо заменить Drupal.Ajax на Drupal.ajax.

Написанное актуально для
Drupal 7, Drupal 8+
Похожие записи

Комментарии

А где это может пригодиться? В смысле сложно представить ситуацию, когда нужно разрешить повторную отправку форму до возвращения ответа. Обычно такое поведение стремятся как раз таки обойти. У Вас был какой-то специфичный функционал?

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

Посмотрите на подход к решению этой проблемы в views exposed forms. Я имею в виду, что если в настройках view указано, что она должна обрабатываться аяксом, то в раскрытом фильтре (текстовом) нет никакой блокировки поля. Вводи текст сколько хочешь. Там запрос уходит по таймауту, а сам таймер сбрасывается при вводе текста.

в раскрытом фильтре (текстовом) нет никакой блокировки поля

потому что ajax там навешен на кнопку, а не на конкретное поле

потому что ajax там навешен на кнопку, а не на конкретное поле

Точно, Вы правы.

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

/offtop
У Вас, кажется, не работает опция Уведомлять меня о новых комментариях.

Без разницы сколько уйдёт запросов, поле при любом количестве будет дизаблиться.

Добавить комментарий