Drupal → Как выполнять свой js-код до или после любых AJAX запросов (изменение работы AJAX API)

06.02.2023

Перед сериализацией данных формы:

(function ($, Drupal) {
  var originalAjaxBeforeSerialize = Drupal.Ajax.prototype.beforeSerialize;
  Drupal.Ajax.prototype.beforeSerialize = function (element, options) {
    ... YOUR CODE ...
    return originalAjaxBeforeSerialize.apply(this, arguments);
  };
})(jQuery, Drupal);

Перед отправкой ajax запроса:

(function ($, Drupal) {
  var originalAjaxBeforeSend = Drupal.Ajax.prototype.beforeSend;
  Drupal.Ajax.prototype.beforeSend = function (xmlhttprequest, options) {
    ... YOUR CODE ...
    return originalAjaxBeforeSend.apply(this, arguments);
  };
})(jQuery, Drupal);

После выполнения ajax запроса, но до выполнения ajax-команд:

(function ($, Drupal) {
  var originalAjaxSuccess = Drupal.Ajax.prototype.success;
  Drupal.Ajax.prototype.success = function (response, status) {
    ... YOUR CODE ...
    return originalAjaxSuccess.apply(this, arguments);
  };
})(jQuery, Drupal);

После выполнения ajax-команд:

(function ($, Drupal) {
  var originalAjaxSuccess = Drupal.Ajax.prototype.success;
  Drupal.Ajax.prototype.success = function (response, status) {
    var originalAjaxSuccessPromise = originalAjaxSuccess.apply(this, arguments);
    return originalAjaxSuccessPromise.then(function () {
      ... YOUR CODE ...
    });
  };
})(jQuery, Drupal);

В случае ошибки выполнения ajax запроса:

(function ($, Drupal) {
  var originalAjaxError = Drupal.Ajax.prototype.error;
  Drupal.Ajax.prototype.error = function (response, status) {
    ... YOUR CODE ...
    return originalAjaxError.apply(this, arguments);
  };
})(jQuery, Drupal);

Таким же способом можно переопределять и сами ajax команды:

(function ($, Drupal) {
  var originalInsertCommand = Drupal.AjaxCommands.prototype.insert;
  Drupal.AjaxCommands.prototype.insert = function (ajax, response, status) {
    ... YOUR CODE ...
    return originalInsertCommand.apply(this, arguments);
  };
})(jQuery, Drupal);
Написанное актуально для
Drupal 8+
Похожие записи

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