После загрузки страницы для каждой ссылки с классом use-ajax
создаётся объект Drupal.Ajax
, в котором фиксируется адрес, на который по клику отправится ajax запрос. После создания этого объекта менять href ссылки уже бесполезно, надо вручную лезть в Drupal.ajax.instances
и менять options.url
у нужного объекта.
Ниже пример того, как можно перед отправкой ajax запроса автоматически менять его адрес на значение атрибута ссылки data-ajax-url
:
(function (Drupal) {
/**
* Override AJAX "beforeSerialize" callback.
*/
var originalAjaxBeforeSerialize = Drupal.Ajax.prototype.beforeSerialize;
Drupal.Ajax.prototype.beforeSerialize = function (element, options) {
// Change request url to url from element data-ajax-url attribute
if (this.element) {
var elementAjaxUrl = this.element.dataset.ajaxUrl;
if (elementAjaxUrl) {
var wrapperFormatIndex = options.url.indexOf(Drupal.ajax.WRAPPER_FORMAT);
if (wrapperFormatIndex > 0) {
elementAjaxUrl += (elementAjaxUrl.indexOf('?') === -1) ? '?' : '&';
elementAjaxUrl += options.url.substring(wrapperFormatIndex);
}
options.url = elementAjaxUrl;
}
}
// Call original callback
return originalAjaxBeforeSerialize.apply(this, arguments);
};
})(Drupal);
Так же это будет полезно, когда нужно чтобы ссылка вела на один адрес, а ajax запрос отправлялся на другой:
<a href="/node/123#body" data-ajax-url="/ajax/show-node-body/123" class="use-ajax">
Показать содержимое
</a>
Или можно создавать ajax-ссылки совсем без адреса:
<a href="#" data-ajax-url="/ajax/show-node-body/123" class="use-ajax">
Показать содержимое
</a>
Написанное актуально для
Drupal 8+
Похожие записи
- Однократное выполнение ajax запроса
- Отключить автоматический аплоад файлов у определённого поля
- Восстанавливаем позицию текстового курсора при ajax обновлении формы
- Как выполнять свой js-код до или после любых AJAX запросов (изменение работы AJAX API)
- Добавляем возможность указывать тип прогрессбара для ajax ссылок
Комментарии
Норм вариант. Я делал так проверку запроса на ajax в контроллере:
Добавить комментарий