Если вы создаете Greasemonkey script с @include *
и переходите на сайт, такой как youtube, он запускает script 20 + раз при каждом обновлении. Это на Firefox, не уверен в Chrome.
Есть ли способ предотвратить это?
Запустить Greasemonkey script только один раз на загрузку страницы?
Ответ 1
Во-первых, вы, вероятно, не хотите, чтобы script запускался в iFrames.
Вы можете заблокировать это с помощью директивы @noframes
, которая теперь работает как в Greasemonkey, так и в Tampermonkey по состоянию на октябрь 2014 года.
Для более старых версий или для двигателей script, которые не поддерживают @noframes
, вы можете использовать этот код сразу после блока метаданных:
if (window.top != window.self) //don't run on frames or iframes
{
//Optional: GM_log ('In frame');
return;
}
Во-вторых, вы можете подождать и запустить свой GM-код один раз, при загрузке страницы. Оберните все в main()
и вызовите его в событии load
, например:
window.addEventListener ("load", LocalMain, false);
function LocalMain () {
// Your code goes here.
}
В-третьих, вы можете исключить сайты или страницы, добавив директивы // @exclude
в блок метаданных.
В целом, лучше всего избегать универсальных включенных сценариев GM, если это возможно.
Другие методы могут устанавливать флаги или перезагружать страницу с параметрами URL. Они становятся сложными, поэтому сохраняйте их как последнее средство.
Ответ 2
Вы можете, например, сохранить данное местоположение в постоянной переменной. При загрузке страницы вы должны проверить, будет ли текущее местоположение уже сохранено в этой переменной.
Если нет, вы устанавливаете переменную и запускаете свою функцию, если да ничего не делают.
Как хранить постоянные переменные: GM_setValue