9
// ==UserScript==
// @name         Test
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://myanimelist.net/*
// @require http://code.jquery.com/jquery-3.4.1.slim.min.js
// @grant        none
// ==/UserScript==
var index = 0;
(function() {
    'use strict';
    $(document).ready(function () {
        console.log(index);
        index++;
        setTimeout(() => {  console.log(index); }, 2000);
    });
})();

So has you can see this code should return in the console : 0 then 1 but the result is different, actually the script run multiple times.

My only clue is that come from the site in question, any idea ?

Excepted : (low rep image 1)

Actual : (low rep image 2)

ButchMonkey
  • 1,873
  • 18
  • 30
SadPanda
  • 135
  • 7
  • 1
    Runs fine for me with and without using tampermonkey. Are you sure you don't have multiple instances of the script? – ButchMonkey Jan 17 '20 at 21:46
  • Without test, I see an IIFE plus the `ready(` event. Using slow internet, jquery is not loaded yet (header cache change not yet suceed 200OK), but the IIFE has already tigger since it's pure javascript. – NVRM Jan 18 '20 at 01:10
  • 2
    The site may have iframes which you can test in devtools. Add `// @noframes` in metablock comment. Also you don't need jquery here at all and neither the $(document).ready wrapper. – wOxxOm Jan 18 '20 at 04:22
  • 2
    `// @noframes` did the job ty ! (Solved) – SadPanda Jan 20 '20 at 05:26

2 Answers2

15

your script could be loading for each frame in the page.

add // @noframes to prevent this.

// ==UserScript==
// @name         Test
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://myanimelist.net/*
// @require http://code.jquery.com/jquery-3.4.1.slim.min.js
// @grant        none
// @noframes
// ==/UserScript==
RASG
  • 5,988
  • 4
  • 26
  • 47
2

you can use Lodash to run a function once

_.once( //Function to run only once )

Raphael Castro
  • 907
  • 1
  • 8
  • 26