Заставить Tampermonkey запускать/выполнять скрипт с опозданием

Как заставить Tampermonkey запускать/выполнять скрипт с опозданием после загрузки каждого документа AJAX?

Я хочу получить доступ к этим элементам в моем сценарии и изменить их. Но, несмотря на то, что я установил @run-at на document-end на странице настроек, он выполняется, пока документ не был загружен полностью. И это происходит на этом конкретном сайте !!

Я пробовал эти способы, но безуспешно:

  1. Событие загрузки.
  2. Я попробовал оператор while, чтобы проверить, все ли документы были загружены, а затем продолжить выполнение моего скрипта, но он разбился и попал в бесконечный цикл.
  3. Я попробовал консоль для выполнения функции (но недоступной для консоли).

Итак, что мне делать?


person e4gle    schedule 01.08.2013    source источник


Ответы (1)


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

Самый простой способ сделать это — использовать waitForKeyElements(). Что-то типа:

// ==UserScript==
// @name     _YOUR_SCRIPT_NAME
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

waitForKeyElements (
    "jQUERY SELECTOR TO THE NODE(S) YOU WANT",
    changeFontColor
);

function changeFontColor (jNode) {
    jNode.css ("color", "red");
}
person Brock Adams    schedule 02.08.2013
comment
Спасибо, а что, если я захочу изменить цвет шрифта, когда все дочерние узлы загружены/добавлены к родительскому узлу, возможно ли это? - person e4gle; 03.08.2013
comment
Это то, что делает waitForKeyElements. Однако концепция загрузки всех дочерних узлов часто не применяется к страницам AJAX. Что конкретно вы хотите от этого решения и почему? - person Brock Adams; 04.08.2013
comment
Мне просто нужно, чтобы функция waitForKeyElements вызывала мою функцию, когда все узлы загружаются один раз. но вместо этого он вызывает более одного раза ‹div id=parent›‹/div› - person e4gle; 04.08.2013
comment
Обычно это так не работает. Приведите рабочий пример, чтобы мы могли увидеть проблему. - person Brock Adams; 04.08.2013
comment
‹div id=parent› ‹div class=child›‹/div› здесь много дочерних элементов ‹/div› waitForKeyElements ( #parent , ...) Я успешно сделал что-то подобное с SetInterval и ClearInterval, но теперь мне любопытно. - person e4gle; 04.08.2013