Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Перехват функций/методов (https://javascript.ru/forum/misc/4319-perekhvat-funkcijj-metodov.html)

SunnyDay 10.07.2009 18:46

Перехват функций/методов
 
Всем доброго времени суток, мне очень потребовался плагин-сканер для фаерфокса, который к примеру, после нажатия кнопки старт, выводит последовательный список вызовов всех функций/методов в рантайме.

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

SunnyDay 13.07.2009 11:10

Народ, ответьте, перехват вызовов можно сделать как-либо?)

Dmitry A. Soshnikov 13.07.2009 12:25

Вам нужно посмотреть call-стек? Можно отладчиком (Firebug, Venkman).

SunnyDay 13.07.2009 12:34

Dmitry A. Soshnikov, спасибо, а подскажите как на фаербаге смотреть стек, там есть кнопка Stack во вкладке Script, но там ничего не отображается..

Kolyaj 13.07.2009 12:41

В Firefox'е можно сделать
alert(new Error().stack);

SunnyDay 13.07.2009 13:00

Kolyaj, он выдаёт какую-то непонятную строчку - но это точно не список выполненных функций..

Kolyaj 13.07.2009 13:25

(function test1() {
    (function test2() {
        (function test3() {
            alert(new Error().stack);
        })();
    })();
})();


Цитата:

Error()@:0
test3()@http://javascript.ru/forum/misc/4319-perekhvat-funkcijj-metodov.html#post24272:68
test2()@http://javascript.ru/forum/misc/4319-perekhvat-funkcijj-metodov.html#post24272:67
test1()@http://javascript.ru/forum/misc/4319-perekhvat-funkcijj-metodov.html#post24272:66
Дальше идут файебаговские скопы.

B~Vladi 13.07.2009 13:28

...

SunnyDay 13.07.2009 13:43

Kolyaj, понял, но мне нужно немножко не это. Мне нужен сканер выолненных функций - к примеру я нажал кнопку "start", и все функции/методы, которые выполнятся в скрипте до нажатия кнопки "stop" добавились в какой либо список, где всего лишь есть названия функций, и параметры.. Больше мне не надо.

SunnyDay 13.07.2009 13:51

Такая ситуация, что я пишу плагин для рессурса с очень крупными скриптами - онлайн игра. Разбираться в них и долго и ненужно. При симуляции события я обычно просто брал элемент, который его пускает, и брал событие из параметров типа OnClick="..", итп. тут я столкнулся с той проблеммой, что элемент вроде бы и реагирует на щелчок к примеру, но внутри него не прописаны никакие события. Вот мне и надо узнать, какая функция выполняется по щелчку на объект - element.click undefined, поэтому только так..

B~Vladi 13.07.2009 14:38

Объект event создаётся при срабатывании обработчика, поэтому невозможно прослушивать window, ожидая вызова обработчика и тем более получить тело ф-ции (если обработчик добавлен через методы DOM).

B~Vladi 13.07.2009 14:41

Разве что все выполняемые ф-ции будут сами себя регистрировать и добавлять в с писок.

SunnyDay 13.07.2009 14:58

Понятно.. Тоесть нельзя? Значит будем тыкать пальцем в небо)

SunnyDay 13.07.2009 15:34

Вся проблемма в принципе в том что у меня не получается ссимулировать событие - тоесть к примеру по щелчку левой кнопки мышки что либо происходит. Пытаюсь вызвать это событие:
так
doc.getElementById('element').click();
и так (там используется jQuery)
$('#element').click();
действие не выполняется

Может быть вы подскажете, в чём может быть проблемма?

B~Vladi 13.07.2009 15:51

Цитата:

Сообщение от SunnyDay
doc.getElementById('element').click();

Не есть метод узла. Для генерирования события скриптом используются методы DOM:

Для Gecko
var evt = new Event;
evt.initEvent('click', true, true);
document.body.dispatchEvent(evt);


Для ИЕ:
var evt = document.createEventObject();
document.body.fireEvent('onclick', evt);


Про jQuery ничего сказать не могу.

SunnyDay 13.07.2009 16:24

B~Vladi,
спасибо большое! у меня все работает, сделал так -
var evObj = doc.createEvent('MouseEvents');
evObj.initEvent('click', true, true);
ellinat.dispatchEvent(evObj);


Последнее, не подскажите как сделать так чтобы кликало правой кнопкой мышки, а не левой?

B~Vladi 13.07.2009 16:56

Цитата:

Сообщение от SunnyDay
var evObj = doc.createEvent('MouseEvents');
evObj.initEvent('click', true, true);
ellinat.dispatchEvent(evObj);

Это не будет работать в ИЕ. Нужно создать кросс-браузерную ф-цию:
function xInitEvt(e,type){
   if(e.initEvent&&e.dispatchEvent){
      var evt = e.createEvent('MouseEvents');
      evt.initEvent(type, true, true);
      e.dispatchEvent(evt);
   }else{
      var evt = document.createEventObject();
      document.body.fireEvent(type, evt);
   }
}

И ею пользоваца...

Про левую кнопку пока не знаю... нада смотреть... Но в любом случае это не кроссбраузерный вариант + это, например, в Опере, можно отключать.

SunnyDay 13.07.2009 17:02

Понятно, спасибо.
Насчёт кнопки - попробовал заменить метод
evObj.initEvent('click', true, true);

на частный метод
evObj.initMouseEvent('click', true, true, doc.defaultView, 1, 1, 1, 1, 1, false, false, false, false, 2, null);

где предпоследний параметр - номер кнопки мышки, всёравно кликает левой. Ладно, дальше уже попробую сам заставить кликать правой

B~Vladi 13.07.2009 17:05

Цитата:

Сообщение от SunnyDay
всёравно кликает левой

Мда, странно... пробуй в разных браузерах... Сам я так не заморачивался, т.к. ненадёжно...

Kolyaj 13.07.2009 17:15

SunnyDay,
http://testcase.rubyforge.org/ru/docs/events здесь покопайтесь. А может даже и раскапывать не придется, самой библиотекой можно воспользоваться.

x-yuri 13.07.2009 23:10

Цитата:

Сообщение от SunnyDay
Вся проблемма в принципе в том что у меня не получается ссимулировать событие

вот с этого и надо было начинать, по-крайней мере указать это в самом первом посте

по поводу списка функций, можно еще профайлер запустить

по поводу эмуляции событий: а зачем?


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