Как заставить скрипт Tampermonkey ожидать завершения страницы после события hashchange? - PullRequest
0 голосов
/ 25 декабря 2018

Я пишу скрипт Tampermonkey и настраиваю слушатель на hashchange.
Внутри этого слушателя я вызываю функцию, которая управляет DOM.Проблема в том, что функция вызывается до полной загрузки страницы.

Страница не полностью перезагружается при переключении с одного раздела на другой, поэтому on load будет работать только один раз, поэтому я слушаю hashchange вместо load.

window.addEventListener('hashchange', function (e) {
    if (!/step=view&ID=/.test(location.hash)) {
        //TODO clean up if leaving active trade
        return
    }
    console.log('hash changed', e)
    setup()
});

function setup() {
    //wait for page load here
    $('.myclass').after(<span>foo</span>);
}

Я попытался добавить on load внутри установки, но это ничего не дало.

Редактировать:

Добавление прослушивателя для load за пределами setup также будет работать только один раз, если перейти кточная ссылка, так что это тоже не вариант.

1 Ответ

0 голосов
/ 26 декабря 2018

Это задание для waitForKeyElements, или MutationObserver, или setTimeout

Почти на всех таких страницах достаточно waitForKeyElements, не требуется hashchange прослушиватель:

// ==UserScript==
// @name     _spans of foo
// @match    *://YOUR_SERVER.COM/YOUR_PATH/*
// @require  https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// @grant    GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
/* global $, waitForKeyElements */

waitForKeyElements (".myclass", setupMyClass);

function setupMyClass (jNode) {
    jNode.after ('<span>foo</span>');
}

Поскольку добавленные вами <span>foo</span>, по-видимому, не сохраняются после хеширования, вероятно, эта техника - все, что вам нужно.


Однако, если на странице есть , то используется .myclass узлов (¿но как-то разрушает ваши пролеты?) вместо того, чтобы воссоздавать их, затем используйте технику, подобную показанной в этом другом ответе .

В этом случае MutationObserver может быть лучшим выбором.Но это зависит от деталей, не указанных в вашем вопросе.


См. Также Как перезагрузить скрипт Greasemonkey, когда AJAX изменяет URL-адрес без перезагрузки страницы? .

...