Как я могу узнать, какой Javascript вызывает запрос Ajax?

У меня возникла проблема с приложением Java JSF: в определенном случае действие пользователя вызывает HTTP-запрос Ajax, который правильно обновляет пользовательский интерфейс, но затем сразу же запускается второй запрос, вызывающий второе, неправильное обновление.

Как я могу узнать (желательно с помощью Firebug), где именно срабатывает этот второй запрос? Существует много минимизированного JS-кода фреймворка, поэтому я не знаю, где разместить точки останова. Установка обработчика формы onsubmit на console.trace не помогла, я полагаю, потому что это независимые запросы Ajax.


person Michael Borgwardt    schedule 28.12.2010    source источник


Ответы (5)


Пробуя предложения в ответах, я обнаружил, что Firebug уже имеет именно то, что мне нужно из коробки: на вкладке «Консоль» отображаются все запросы, а для запросов Ajax он показывает файл и номер строки, откуда они исходят, что говорит мне, где установить точку останова...

person Michael Borgwardt    schedule 28.12.2010
comment
Разве это не реализовано в инструментах разработчика Chrome? - person eugene; 12.06.2013
comment
@eugene: вполне возможно, да. - person Michael Borgwardt; 12.06.2013
comment
Спасибо, Майкл. Для записи, это на вкладке «Сеть» — «Инициатор». наведите курсор на ссылку, и она покажет стек вызовов. - person eugene; 12.06.2013

Используя Firebug, вы можете установить точки останова на событиях мутации DOM (HTML), если у вас есть Изменения HTML в вашем обновлении пользовательского интерфейса.

person Dean Burge    schedule 28.12.2010
comment
Но это сработает при получении response, не так ли? Мне нужно выяснить, откуда исходит запрос. - person Michael Borgwardt; 28.12.2010
comment
Конечно, но это сужает выбор того, где вы можете начать отладку. Вы также можете профилировать запрос, ответ, цикл обновления пользовательского интерфейса, чтобы сузить область действия. - person Dean Burge; 28.12.2010

Если инфраструктура абстрагирует запросы AJAX, вы сможете отслеживать вызовы абстракций. Например, jQuery позволяет это сделать с помощью своих глобальных обработчиков событий AJAX. .

Другой, более надежный способ решить эту проблему — заменить объект XHR и отследить вызовы, сделанные на это (т. е. если инфраструктура не предоставляет вышеуказанную абстракцию или если вызовы, которые вы хотите использовать, не используют абстракцию). Просто замените GM_log на console.trace в скрипте в конце страницы и включите его в тестируемую страницу.

person Alex Gyoshev    schedule 28.12.2010

Что я лично сделал в этом случае, так это использовал прокси-сервер HTTP, который может «приостановить» запрос или ответ. Например. Burp Proxy (на самом деле это инструмент безопасности, но он отлично подходит для отладки)

Запустите прокси и настройте свой браузер для его использования. Перейдите на страницу, откуда исходят запросы roque, и активируйте перехват запросов (это может потребовать некоторой практики, поскольку Burp Proxy может быть довольно сложным инструментом).

Теперь выполните действие пользователя, если все идет хорошо, прокси-сервер перехватывает его и ждет вашего подтверждения, чтобы пропустить его. Сделай это. Затем вы, вероятно, увидите второй запрос, который также перехватывается прокси-сервером. Не позволяйте этому пройти, а вместо этого переключитесь на Firebug и приостановите работу в отладчике. Надеюсь, тогда вы сможете увидеть, откуда оно взялось. Изменить: если подумать, асинхронный характер AJAX, вероятно, означает, что вы все равно не сможете увидеть точное место с помощью этого метода... :(

По крайней мере, вы также можете настроить его для перехвата ответов. И запросы, и ответы можно редактировать «на лету», что удобно для экспериментов и отладки, а также помогает сузить круг проблем.

person Arjan Tijms    schedule 28.12.2010

Возможно, это поможет, вызывающий объект - это метод в объекте Function javascript.

console.log(arguments.callee.caller.toString());

person Ratna Dinakar    schedule 28.12.2010