Run a Greasemonkey script only once per page load?

怎甘沉沦 提交于 2019-11-26 20:23:32

问题


If you create a Greasemonkey script with @include * and go to a site like youtube, it runs the script 20+ times every time you refresh. This is on Firefox, not sure about Chrome.
Is there a way to prevent this?


回答1:


First, you probably don't want the script to run in iFrames.
You can block that using the @noframes directive which now works in both Greasemonkey and Tampermonkey as of October, 2014.

For older versions, or for script engines that don't support @noframes, you can use this code, just after the metadata block:

if (window.top != window.self)  //don't run on frames or iframes
{
    //Optional: GM_log ('In frame');
    return;
}


Second, you can wait and fire your GM code, once, on page load. Wrap everything in a main() and call it on the load event, like so:

window.addEventListener ("load", LocalMain, false);

function LocalMain () {
    // Your code goes here.
}


Third, you can exclude sites or pages by adding // @exclude directives to the metadata block.

Overall, it's best to avoid universally included GM scripts, if possible.

Other methods might set flags or reload the page with URL parameters. These get tricky so save them as a last resort.




回答2:


You can for example store the given location in a persistent variable. On page load you have to check, if the current location is already stored in this variable.

If not, you set the variable and run your function, if yes do nothing.

How to store persistent variables: GM_setValue



来源:https://stackoverflow.com/questions/4190442/run-a-greasemonkey-script-only-once-per-page-load

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!