[Javascript] Stoppen van functie

Pagina: 1
Acties:

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Ik heb een html pagina met daarin een div genaamd "content".
Wanneer een pagina geladen wordt, wordt de inhoud daarvan d.m.v. een ajax script ingeladen (zie hieronder). Wanneer ik vervolgens met behulp van de functie selectItem() nieuwe content ophaal dan verschijnt na 10 minuten het oude content weer over het nieuwe.

Dit komt doordat er een timer zit op de de vorige ingeladen content. Hoe kan ik, wanneer ik nieuwe content wil inladen de timer van de huidige stoppen?

Met andere woorden: Ervoor zorgen dat er geen content over content geladen wordt?
JavaScript:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function getRequest(selectedDiv, URL) {
    var xmlHttp;
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        // Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
    xmlHttp.onreadystatechange = function() {
        if(xmlHttp.readyState == 4) {
            result = xmlHttp.responseText;
            document.getElementById(selectedDiv).innerHTML = result;
        }
    }
    xmlHttp.open("GET",URL,true);
    xmlHttp.send(null);
}

var timer;
function reGetRequest(selectedDiv, URL) {
    getRequest(selectedDiv, URL);
    clearTimeout(timer);
     timer = setTimeout("reGetRequest('"+selectedDiv+"', '"+URL+"');",300000);
}

function selectItem(target) {
    if (document.Locaties.Locaties.value == 'K13' | target == 'K13') {
        document.Locaties.Locaties.value = 'K13';
        document.getElementById('content').innerHTML = '<br /><img src=\"images/loading.gif\" onload=\"reGetRequest(\'content\', \'mijnurl\');\" /><br /><br />Loading data...';
    } else if (document.Locaties.Locaties.value == 'IJmond'| target == 'IJmond') {
        document.Locaties.Locaties.value = 'IJmond';
        document.getElementById('content').innerHTML = '<br /><img src=\"images/loading.gif\" onload=\"reGetRequest(\'content\', \'mijnurl\');\" /><br /><br />Loading data...';
    } else if (document.Locaties.Locaties.value == 'Maasmond' | target == 'Maasmond') {
        document.Locaties.Locaties.value = 'Maasmond';
        document.getElementById('content').innerHTML = '<br /><img src=\"images/loading.gif\" onload=\"reGetRequest(\'content\', \'mijnurl\');\" /><br /><br />Loading data...';
    } else if (document.Locaties.Locaties.value == 'Overzichtskaart') {
        document.Locaties.Locaties.value = 'Overzichtskaart';
        document.getElementById('content').innerHTML = '<img src=\"images/map.jpg\" border=\"0\" />';
    }
}

[ Voor 12% gewijzigd door DeepFreeze.NL op 20-06-2007 15:26 ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
een simpele boolean 'moetcontentophalen' bijhouden?
wanneer die true is gewoon niet de innerhtml van je element aanpassen en je reRequest niet meer aanroepen.

netter is natuurlijk om de timer te stoppen, maar ik weet zo 123 niet hoe dat meot

[ Voor 7% gewijzigd door BasieP op 06-06-2007 16:23 ]

This message was sent on 100% recyclable electrons.


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

setTimeOut en setInterval kan je toewijzen aan een variabele:
JavaScript:
1
var ctime = setTimeOut...

Waarna je hem kan clearen met
JavaScript:
1
clearTimeout(ctime);




En dit had je serieus makkelijk kunnen vinden door te [google=cancel setTimeout] ;)

[ Voor 21% gewijzigd door BtM909 op 06-06-2007 16:24 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
BtM909 schreef op woensdag 06 juni 2007 @ 16:22:
En dit had je serieus makkelijk kunnen vinden door te [google=cancel setTimeout] ;)
Dankje....Hmm, daar had ik inderdaad nog niet op gezocht...

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Het is mij nog steeds niet gelukt om de timer te stoppen met behulp van clearTimeout();
Ik heb inmiddels van alles geprobeerd, maar nog steeds wordt er oude content over het nieuwe content geladen.

Ik heb momenteel het volgende stukje code, maar dit werkt dus nog niet:
JavaScript:
1
2
3
4
5
function reGetRequest(selectedDiv, URL) {
    getRequest(selectedDiv, URL);
    clearTimeout(timer);
    var timer = setTimeout("reGetRequest('"+selectedDiv+"', '"+URL+"');",300000);
}


Wanneer ik een andere locatie selecteer door middel van de functie selectItem() wordt de functie reGetRequest() aangeroepen. De timer wordt dan eerst leeg gemaakt/geannuleerd en vervolgens opnieuw aangemaakt. Dat moet, lijkt mij, toch goed zijn?!

Wat zie ik over het hoofd? :|

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 01-12 10:11

RM-rf

1 2 3 4 5 7 6 8 9

let op de scope van en variabele,
een variabele die binnen een function als 'var' gedefinieerd wordt heeft enkel een scope _binnen_ die functie:

JavaScript:
1
2
3
4
5
6
var timer
function reGetRequest(selectedDiv, URL) {
    getRequest(selectedDiv, URL);
    clearTimeout(timer);
     timer = setTimeout("reGetRequest('"+selectedDiv+"', '"+URL+"');",300000);
}

zal wél doen wat je wilt, omdat de variabele timer dan als global variabele gedefinieerd is.

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
RM-rf schreef op woensdag 20 juni 2007 @ 15:06:
let op de scope van en variabele,
een variabele die binnen een function als 'var' gedefinieerd wordt heeft enkel een scope _binnen_ die functie:

JavaScript:
1
2
3
4
5
6
var timer
function reGetRequest(selectedDiv, URL) {
    getRequest(selectedDiv, URL);
    clearTimeout(timer);
     timer = setTimeout("reGetRequest('"+selectedDiv+"', '"+URL+"');",300000);
}

zal wél doen wat je wilt, omdat de variabele timer dan als global variabele gedefinieerd is.
Ja, ik weet dat variabelen alleen binnen de scope van een functie valt, het gekke is dan ook dat de oplossing die jij vermeld hetzelfde effect oplevert. Nog steeds wordt er oude content over het nieuwe content gekopieerd.

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Weet je zeker dat je je interval cancelt voordat er een nieuw request wordt uitgevoerd? Want het kan natuurlijk ook zo zijn dat je AJAX request al wordt uitgevoerd :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.

Pagina: 1