xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Запретить установку ajax-кнопке атрибута disabled при клике

Опубликовано в

Друпал при клике на ajax кнопку устанавливает ей атрибут disabled для запрета повторной отправки формы до того, как придёт ответ. Чтобы отключить такое поведение и разрешить многократное нажатие ajax-кнопки, нужно во-первых, подключить js файл со следующим кодом:

(function ($) {
  var originalBeforeSendCallback = Drupal.ajax.prototype.beforeSend;
  Drupal.ajax.prototype.beforeSend = function(xmlhttprequest, options) {
    originalBeforeSendCallback.apply(this, arguments);
 
    if ('disabled' in this && !this.disabled) {
      this.ajaxing = false;
      $(this.element).removeClass('progress-disabled').attr('disabled', false);
    }
  }
})(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,
  ),
);

Пользоваться стоит крайне аккуратно, особенно с динамическими формами, так как могут вылезти проблемы связанные с кэшированием ajax форм.

Ну а ещё это пример как подменять системные функции в Drupal.ajax и расширять #ajax своими свойствами.

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

Комментарии RSS

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

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

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

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

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

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

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

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

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании