Как мога да разбера кой Javascript предизвиква Ajax заявка?

Имам проблем с Java JSF приложение: В определен случай потребителско действие предизвиква Ajax HTTP заявка, която актуализира правилно потребителския интерфейс, но веднага след това се задейства втора заявка, причинявайки втора, неправилна актуализация.

Как мога да разбера (за предпочитане с помощта на Firebug) къде точно се задейства тази втора заявка? Има много минимизиран JS код на рамката, така че не знам къде да поставя точки на прекъсване. Задаването на манипулатора на формуляра onsubmit на console.trace не помогна, предполагам, защото това са независими Ajax заявки.


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


Отговори (5)


Докато изпробвах предложенията в отговорите, открих, че Firebug вече има точно това, което ми трябва: разделът Console показва всички заявки, а за 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
Но това ще се задейства при получаване на отговора, нали? Трябва да разбера откъде произлиза заявката. - 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

Може това да помогне, caller е метод във Function обект на javascript.

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

person Ratna Dinakar    schedule 28.12.2010