Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Greasemonkey и вызов функции со страницы


Автор: Elerond 13.8.2011, 15:21
Есть сторонний сайт. В коде страницы функция wm.makeRequest({params: {blocks: ['street_market_body'], wblocks_params: $H({street_market_body: $H({booth_id: '8', room: 'buy_room'})})}}) повешенная на onclick.
Использую Greasemonkey. Как можно вызвать эту функцию, прямой вызов не работает, консоль говорит что такой функции нет. С самой консоли она конечно же вызывается. Подгружать файл js с этой функций смысла нет, очень много зависимостей. 

Автор: Amphiluke 13.8.2011, 17:54
А можете собрать минимальный пример, который иллюстрировал бы проблему?
Возможно, вы вызываете функцию слишком рано? Попробуйте вызвать ее в обработчике события load объекта window.

Автор: Elerond 13.8.2011, 18:06
Amphiluke, не рано это точно. 
После загрузки страницы, создается кнопка, при нажатии на которую обрабатывается функция , которая в свою очередь должна запустить проблемную.

Автор: Amphiluke 13.8.2011, 18:11
Так. Еще раз. На чужом сайте есть кнопка вида примерно следующего, как я понял:
Код

<input type="button" onclick="wm.makeRequest({params: {blocks: ['street_market_body'], wblocks_params: $H({street_market_body: $H({booth_id: '8', room: 'buy_room'})})}});" />

Правильно?
А что будет, если вы вызовете клик на этой кнопке программно, с помощью метода click()?

Автор: Elerond 13.8.2011, 19:17
Код
Код

<a onclick="wm.makeRequest({params: {blocks: ['street_market_body'], wblocks_params: $H({street_market_body: $H({booth_id: '8', room: 'buy_room'})})}})" href="javascript: undefined">Текст</a>

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

Автор: Amphiluke 13.8.2011, 19:41
Насколько я помню, скрипты Greasemonkey выполняются в обособленной от основной страницы области видимости, так что прямое взаимодействие с функциями, определенными в документе, вполне может быть затруднено.
Есть еще один (нерекомендованый, в общем-то) способ обхода этого — использование объекта unsafeWindow. Попробуйте вызвать метод через него
Код

unsafeWindow.wm.makeRequest(...

Автор: Elerond 13.8.2011, 19:58
Попробовал. Консоль выдала ошибку:
Код

Ошибка: $H is not defined
Источник: jar:file:///C:/Users/vasilev/AppData/Roaming/Mozilla/Firefox/Profiles/apz9ciu0.default/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D.xpi!/components/greasemonkey.js
Строка: 145

если смотреть куда он ссылается то это строка 145
Код

      for (var i=0; i<fbContext.activeConsoleHandlers.length; i++) {

из 
Код

    function findActiveContext() {
      for (var i=0; i<fbContext.activeConsoleHandlers.length; i++) {
        if (fbContext.activeConsoleHandlers[i].window == unsafeContentWin) {
          return fbContext.activeConsoleHandlers[i];
        }
      }
      return null;
    }


Похоже надо искать совсем другой подход в решении этого вопроса

Автор: Amphiluke 13.8.2011, 20:09
Ну, блин.
Видимо, к $H (как и к другим глобальным свойствам window) тоже надо обращаться через unsafeWindow.
Код

... unsafeWindow.$H ...

Автор: Elerond 13.8.2011, 20:11
Amphiluke, так у меня нету его, это функция похоже со страницы сайта, вообще непонятно когда и где она вызывается.

Автор: Amphiluke 13.8.2011, 20:13
Цитата(Elerond @  13.8.2011,  23:58 Найти цитируемый пост)
Похоже надо искать совсем другой подход в решении этого вопроса

Вообще, да. Как уже сказал, unsafeWindow не рекомендовано к использованию, ибо «открывает некоторые дыры безопасности» в скрипте, как выразились в документации.
Программная генерация клика — вполне так ничего решение, ИМХО. По крайней мере, безопаснее.

Добавлено через 1 минуту и 35 секунд
Цитата(Elerond @  14.8.2011,  00:11 Найти цитируемый пост)
Amphiluke, так у меня нету его, это функция похоже со страницы сайта, вообще непонятно когда и где она вызывается.

Ну понятно, что со страницы сайта. Так ведь и объект wm и его метод makeRequest тоже со страницы сайта. Не?

Автор: Elerond 13.8.2011, 20:21
Amphiluke, makeRequest со страницы, а $H уже зарыта где то в подключаемых многочисленных скриптах на этой странице. Искать не стал ее там. Попробую сделать регенерацию клика. В Greasemonkey оно вроде тоже не просто так работает. 

Автор: Amphiluke 13.8.2011, 20:23
Почему? Должно все нормально быть.
Вот они сами примеры приводят для этого: http://wiki.greasespot.net/Generate_Click_Events. smile

Автор: Elerond 13.8.2011, 20:30
Amphiluke, Огромное спасибо. Работает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)