Hoe overschrijf ik in JavaScript een self-invoking functie?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:56
Ik probeer een stukje JavaScript in een bestaande website te injecteren om zo het e.e.a. voor mijzelf gebruiksvriendelijker te maken. Tot nu toe is al veel gelukt, maar ik krijg het nog niet voor elkaar om een "self-invoking" functie te vervangen door een aangepaste functie.

Ik heb nu mijn testje zo staan:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<head>
    <title>Main</title>
     <meta charset="UTF-8"> 
</head>
<body>
    <script>
        (function () {
            var x = 0;
            
            setInterval(Timer, 1000);

            function Timer() {
                x++;
                document.getElementById("TestP1").innerHTML = x;
                document.getElementById("TestP2").innerHTML = x;
            }
        })();
    </script>
    <p id="TestP1">Counter<p>
    <p id="TestP2">Counter<p>
    <p id="TestP3">Counter<p>
</body>
</html>

Ik gebruik Firefox 64.0, en via about:debugging laadt ik handmatig mijn aangepaste script in:
JSON:
1
2
3
4
5
6
7
8
9
10
11
12
{
  "manifest_version": 2,
  "name": "modify-page",
  "version": "1.0",

  "content_scripts": [
    {
      "matches": ["http://127.0.0.1/Test/*"],
      "js": ["Test.js"]
    }
  ]
}

En dit is mijn code van Test.js:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
(function () {
    var x = 0;
    
    setInterval(Timer, 1000);

    function Timer() {
        x--;
        document.getElementById("TestP2").innerHTML = x;
        document.getElementById("TestP3").innerHTML = x;
    }
})();

De scripts werken op zich prima. TestP1 telt naar boven op, en TestP3 telt naar beneden.
Helaas wordt bij het injecteren van het tweede script, het eerste script niet overschreven en het wordt er gewoon onder aan toegevoegt. (Dat is te zien dat TestP1 optelt.)
Hoe kan ik die eerste functie aanpassen (of verwijderen) terwijl ik geen voorgedefinieerde variabele heb waar ik met het tweede stukje JavaScript naar kan verwijzen?

Speel ook Balls Connect en Repeat

Alle reacties


Acties:
  • +1 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Kan niet.
Je kunt er wel omheen werken door alle relevante id's in de HTML te veranderen.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Laatst online: 22:43
Wat je hier hebt is een closure (google naar meer info zodat je het goed begrijpt). Het hele doel hiervan is juist dat wat erin staat private is en niet door andere scripts aangepast kan worden (tenzij je nadrukkelijk in de closure weer iets global maakt met window.yolovar = true, met makkelijkste hier is volgens mij om dat bij de setInterval te doen, want dan wordt deze overschreven, waardoor de eerste niet meer wordt uitgevoerd, als je dit heel vaak doet krijg je wel een memory leak)

[ Voor 26% gewijzigd door BarôZZa op 30-12-2018 11:47 ]


Acties:
  • 0 Henk 'm!

  • Guido1982
  • Registratie: Juni 2014
  • Laatst online: 30-05-2023
Is er een bepaalde reden dat je het in een IIFE (Immediately Invoked Function Expression) hebt staan? Het (function{})() patroon. Dit gebruik je normaal inderdaad eigenlijk in twee situaties:

- Je wilt je Timer functie als closure gebruiken zoals eerder aangegeven zodat hij privé is en niet overschreven kan worden (wat juist is wat je wel wilt).
- Je wilt in een for-loop een functie aanmaken en direct gebruiken zonder alle iteraties de laatste iteratie te gebruiken.

Aangezien je niet loopt, weet je zeker dat je een IIFE nodig hebt?

Acties:
  • 0 Henk 'm!

  • TomsDiner
  • Registratie: November 2014
  • Laatst online: 18-07 23:44
Vat ik het goed samen:
  • We hebben een naamloze functie die een interval opzet voor een teller.
  • We voegen er een naamloze functie aan toe die ook een interval op een teller heeft[/i]
En nou moet de eerste uit...

Is het heel stom om de eerste functie een naam te geven, en parameter voor set en unset?

Op de unset zet je dan een clearinterval...

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:56
Het is een bestaande website wat zo'n functie heeft, en is inderdaad bedoeld als een soort timer (oneindige loop). Ik heb geen invloed op de gegenereerde code van de website, dus wil ik d.m.v. extra javascript de huidige functie overschrijven door een iets aangepaste code.

De codes die in mijn startpost staan heb ik zelf gemaakt a.d.h. van mijn bevindingen en om de basis van het het probleem te reproduceren en visueel weer te geven. De daadwerkelijke functie is veel complexer. :)

Speel ook Balls Connect en Repeat

Pagina: 1