Запустить скрипт Greasemonkey только один раз для загрузки страницы? - PullRequest
21 голосов
/ 16 ноября 2010

Если вы создаете сценарий Greasemonkey с @include * и заходите на сайт, такой как youtube, он запускает сценарий более 20 раз при каждом обновлении. Это на Firefox, не уверен насчет Chrome.
Есть ли способ предотвратить это?

Ответы [ 2 ]

35 голосов
/ 16 ноября 2010

Во-первых, вы, вероятно, не хотите запускать скрипт в iFrames.
Вы можете заблокировать это, используя директиву @noframes , которая теперь работает в Greasemonkey и Tampermonkey с октября 2014 года.

Для более старых версий или для механизмов сценариев, которые не поддерживают @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. Они становятся хитрыми, поэтому сохраните их как последнее средство.

0 голосов
/ 16 ноября 2010

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

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

Как хранить постоянные переменные: GM_setValue

...