Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отловить ajax запрос. (https://javascript.ru/forum/misc/74712-otlovit-ajax-zapros.html)

Bond 02.08.2018 13:27

Отловить ajax запрос.
 
Всем привет.
Вопрос такой возник.
Можно ли отловить ajax запрос на странице и добавить в него параметров? GET или POST.
Отловить то понятно - а че дальше делать?
$(document).on('ajaxSend', function(e){
   console.log(e);
});

Вывел в консоль, там параметров целая гора.
Буду признателен за помощь.

Nexus 02.08.2018 14:06

Цитата:

Сообщение от Bond
Можно ли отловить ajax запрос на странице и добавить в него параметров? GET или POST.

Слушая event на document - вряд ли.
Можно в глобальных настройках jq.ajax установить в кач-ве опции beforeSend свой обработчик, в котором можно изменить параметры запроса.
Однако если опция beforeSend будет установлена при вызове метода, то глобальный обработчик, вроде как, будет проигнорирован.

Bond 02.08.2018 14:23

Nexus,
а как можно в beforeSend изменить параметры запроса?
По сути мне не обязательно глобально его устанавливать, я могу и локально втулить.
Вопрос то вообще в чем - у меня есть таблица Dynatable - вот она отправляет ajax запросы для загрузки данных - при загрузке страницы, при пагинации и т.д. Так вот мне нужно при каждом таком запросе добавлять параметры в урл - каждый запрос они могут быть разные. И я не могу отслеживать все события которые инициируют ajax запрос. А евент хуков в этой таблице как кот наплакал - init, удачный запрос, апдейт и еще парочка, короче все срабатывают после загрузки данных.

Bond 02.08.2018 14:29

Nexus,
А нет, сорри. Я могу втулить beforeSend, но он не такой как в обычном ajax - он не передает функции параметры, но сама функция срабатывает. А в обычном запросе все норм.

Nexus 02.08.2018 14:37

Bond,
Цитата:

Сообщение от Bond
А нет, сорри. Я могу втулить beforeSend, но он не такой как в обычном ajax - он не передает функции параметры, но сама функция срабатывает. А в обычном запросе все норм.

не понял.

Изменить тип запроса:
$.ajaxSetup({
	beforeSend:function(xhr,settings){
		this.type='POST';
	}
});
$.ajax(location.href,{type:'get'});

Bond 02.08.2018 17:38

Nexus,
Все таки не срабатывает так у меня.
Вот такая у меня засада:
var dynatable = $('#tblLeads').dynatable({
			// Параметры ajax запроса - по сути такие же как в $.ajax
			dataset: {
				ajax: true,
				beforeSend: updateUrl,
				ajaxUrl: '/dynatable-operation.html',
				ajaxCache: null,
				ajaxOnLoad: true,
				ajaxMethod: 'GET',
				ajaxDataType: 'json',
				ajaxData: {},
				records: []
});
const updateUrl = function (e, a) {
			$.ajaxSetup({
				beforeSend: function (xhr, settings) {
					this.type = 'POST';
				}
			});
		}

Если ваш пример запустить при загрузке страницы то - да он меняет в данном случае тип.
но если поставить в функцию updateUrl, то не работает. Сама функция срабатывает, а вот параметры запроса не меняются.
Смысл в то что мне при отправке запроса нужно добавлять данные которые есть в данный момент, а не те которые были при загрузке страницы

Nexus 02.08.2018 22:40

Bond, а так?
$('#tblLeads').dynatable({
    // Параметры ajax запроса - по сути такие же как в $.ajax
    dataset: {
        ajax: true,
        beforeSend: function(xhr, settings) {
            this.type = 'POST';
        },
        ajaxUrl: '/dynatable-operation.html',
        ajaxCache: null,
        ajaxOnLoad: true,
        ajaxMethod: 'GET',
        ajaxDataType: 'json',
        ajaxData: {},
        records: []
    });
});

Bond 03.08.2018 00:15

Nexus,
Так тоже не пашет. В любом случае спасибо за подсказки.
Я решил по другому - немного костыльно правда.
При клике на пагинацию пока плагин таблицы думает и решает свои дела прежде чем отправить ajax, паралельно исполняется мой клик и он по шустрому пишет параметры в ajaxData ну а они свою очередь добавляются в урл как обычные GET.
Конечно так делать нельзя, но сколько раз пробовал - отказа не было ни разу - всегда мой клик успевает записать параметры прежде чем плагин отправит запрос.


Часовой пояс GMT +3, время: 22:55.