[JS] Check wanneer een <span> verdwijnt

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Het gaat om het script hieronder. Wat ik probeer te doen is het volgende:
  • het script runnen in de browser console
  • script checkt elke seconde of een bepaalde <span> bestaat of niet
  • zodra de <span> verschijnt, output naar de console "span exists"
  • blijf elke seconde checken. Zolang de <span> er is, doe niets. Maar zodra hij verdwijnt, schrijf in console "span disappeared"
  • de <span> kan meerdere inhoud hebben (buy, sell, etc) maar dat doet er op dit moment niet toe. Maar daarom heb ik dus dat if-statement
Wat goed gaat:
  • Zodra de <span> verschijnt, krijg ik de verwachte uitput
code:
1
span appeared


Maar zodra de <span> verdwijnt, gaat het fout en raakt de console in een infinite loop:

code:
1
2
3
4
5
6
span disappeared 
span appeared 
span disappeared 
span appeared 
span disappeared
...


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function f() {
    try {
        b = document.querySelector('#main > header > div>div>span').textContent;
    } 
    catch (TypeError) { // element does not exit
        if (span_exists) {
            // if it does not exist, but it did previously, then it just disappeared
            console.log("span disappeared" + "\n");
            span_exists = false;
        }
        return;
    }

    if (b === "buy") { // element exists
        if (span_exists) {
            // span existed already.. do nothing
        }
        else { // span just appeared
            console.log("span appeared" + "\n");
            span_exists = true;
        }
    }
}


function check_span() {
    span_exists = false;
    interval = setInterval(f, 1000);
    alert("checking for span");
    return interval;
}

> check_span()


Wat doe ik verkeerd?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."

Beste antwoord (via Reveller op 05-04-2020 12:51)


  • Groentjuh
  • Registratie: September 2011
  • Laatst online: 04-10 19:39
Probeer het eens met regel 14 t/m 22 eens in de try/catch-block.

Ik denk dat de waarde b blijft staan van de vorige check. Daardoor kom je door de if-statement op regel 14 heen, terwijl de span niet meer bestaat. Daardoor krijg je dus regel 8 en 19 achter elkaar in één call van f

Als b een lokale var zou zijn, dan zou het ook werken.

[ Voor 9% gewijzigd door Groentjuh op 05-04-2020 12:47 ]

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Groentjuh
  • Registratie: September 2011
  • Laatst online: 04-10 19:39
Probeer het eens met regel 14 t/m 22 eens in de try/catch-block.

Ik denk dat de waarde b blijft staan van de vorige check. Daardoor kom je door de if-statement op regel 14 heen, terwijl de span niet meer bestaat. Daardoor krijg je dus regel 8 en 19 achter elkaar in één call van f

Als b een lokale var zou zijn, dan zou het ook werken.

[ Voor 9% gewijzigd door Groentjuh op 05-04-2020 12:47 ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Groentjuh Dat is geweldig! Wist niet dat het zo simpel was, sorry voor het openen van een topic maar ik had al van alles geprobeerd (behalve dit) en zag het echt niet meer. Thanks!

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • +6 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Hiervoor is trouwens de MutationObserver uitgevonden.

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


Acties:
  • 0 Henk 'm!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

Wat @Juup zegt, kijk eens naar de MutationObserver, dan heb je een 'native' implementatie, die niet met zo'n lelijke setinterval werkt.

Raar... Is zo gek nog niet


Acties:
  • 0 Henk 'm!

  • JustAnotherDev
  • Registratie: Augustus 2004
  • Laatst online: 03-10 20:53
(jarig!)
Wat Jaaap] en Tsjilp beide inderdaad zeggen.
Hieronder zie je een (snel gehackt) voorbeeld van een implementatie ervan om je op gang te helpen.
Het voordeel van een MutationObserver is dat je reageert op een verandering en je code dus niet continue aangeroepen wordt.

Voor exacte werking kan je het best de API bekijken in de link van @Juup

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// ==UserScript==
// @name         Remove Login Dialog Instagram
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Scrolling instragram without logging in
// @author       You
// @match        https://www.instagram.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';
    console.log('GreaseMonkey: creating observer');
    var observer = new MutationObserver(function (mutationsList, observer) {

        if (mutationsList.length > 0 &&
                mutationsList[0].type === 'attributes' &&
                mutationsList[0].attributeName &&
                mutationsList[0].attributeName === 'style') {

            // Enable scrolling
            console.log("GreaseMonkey: remove overflow hidden.");
            document.getElementsByTagName('body')[0].style.overflow = null;
            // Check if dialog exist
            var dialog = document.querySelector("div[role='dialog']");
            if (dialog) {
                // Remove dialog
                dialog.parentElement.parentElement.removeChild(dialog.parentElement);
                console.log("GreaseMonkey: remove login dialog.");
            }
        }
    });
    observer.observe(document.getElementsByTagName('body')[0], {attributes: true, childList: false, subtree: false});
})();
Pagina: 1