2013-07-15, 19:05
  #1
Medlem
5kiddies avatar
Hejsan, jag har ett problem som jag ej hittar svar på. Jag undrar hur man hänvisar till en gammal setInterval().

Tex om min kod ser ut så här:
Kod:
var z = setInterval(function(){

text, text, text, text, text, text, text, text, text, text, text, text, text, text, text, text, 
},300);

document.getElementById("q").onmouseover = function (){
clearTimeout(z);
}

Om jag nu vill starta min z intervall, finns det någon som vet hur man gör?

Alltså, om jag nu fått min intervall att sluta, finns det något sätt att starta den igen?

Tack på förhand
Citera
2013-07-15, 19:11
  #2
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av 5kiddie
Alltså, om jag nu fått min intervall att sluta, finns det något sätt att starta den igen?
Anropa setInterval igen med samma argument. Förslagsvis flyttar du ut inline-funktionen till en fristående sådan och skickar med den som argument istället, så slipper du upprepa hela funktionsdefinitionen igen...
Kod:
var intervalHandler = function() { ... };

var z = setInterval(intervalHandler, 300);
clearInterval(z);
z = setInterval(intervalHandler, 300);



(btw, du anropar setInterval() och clearTimeout(). Förmodligen var det clearInterval() du tänkte på...)
Citera
2013-07-15, 19:17
  #3
Medlem
5kiddies avatar
Tack! Var precis vad jag letade efter

och se där vad man kan missa :S

Återigen Tack!
Citera
2013-07-15, 19:27
  #4
Medlem
gadzooxs avatar
Sen kan du ju wrappa det en nivå för bättre enkapsulering och enklare API:
http://jsfiddle.net/KQyaR/
Citera
2013-07-15, 20:06
  #5
Medlem
Povels avatar
Citat:
Ursprungligen postat av gadzoox
Sen kan du ju wrappa det en nivå för bättre enkapsulering och enklare API:
http://jsfiddle.net/KQyaR/



En stilla fråga - varför väljer du att exponera timerRef i APIet? Och varför inte deklarera timer-variabeln hellre än att låta den bli en property på det globala objektet?

/p
Citera
2013-07-15, 20:17
  #6
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av Povel
En stilla fråga - varför väljer du att exponera timerRef i APIet? Och varför inte deklarera timer-variabeln hellre än att låta den bli en property på det globala objektet?

/p
1. Det gör jag inte, den är privat.
2. Borde ha stått 'var' framför ja. Svårt att nå den från knapparna då iofs, med nuvarande fulkod i form av onclick-attribut, så det var mest en quick fix.. Hela poängen var att visa enkapsuleringen, inte att diskutera globala scopet eller event-subscriptions..
Citera
2013-07-15, 20:30
  #7
Medlem
Povels avatar
Citat:
Ursprungligen postat av gadzoox
1. Det gör jag inte, den är privat.
2. Borde ha stått 'var' framför ja. Svårt att nå den från knapparna då iofs, med nuvarande fulkod i form av onclick-attribut, så det var mest en quick fix.. Hela poängen var att visa enkapsuleringen, inte att diskutera globala scopet eller event-subscriptions..

1) Nej, den är inte privat eftersom du tilldelar och läser this.timerRef hela tiden. Alltså hamnar den i det objektet som funktionerna ligger i - d.v.s. det objekt du returnerar som API. Detta är ganska grundläggande när det gäller JavaScripts this. Se https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#As_an_object_method.
Däremot är din var timerRef = null; helt oanvänd och skulle ha kunnat ha vilket innehåll som helst (och förblir orörd).

2) Det är inga problem att anropa den från knapparna även om den deklareras med var. Varför skulle det vara det?

/p
__________________
Senast redigerad av Povel 2013-07-15 kl. 20:35.
Citera
2013-07-15, 20:42
  #8
Medlem
gadzooxs avatar
1. Så genom att bara skippa 'this.' överallt hade den 'lokala' variabeln använts istället och det hade blivit en fungerande closure? Si där, då har även gammgubben lärt sig nå nytt! Ha e no för insnöad på klassisk OOP egentligen, där hade ju saker fungerat som tänkt. Men di ä ju så bekväma, di gamla statiskt typade, kompilerade språken.


2. Scope, var tanken. Men jag har ju lite otur ibland när jag tänker...
Citera
2013-07-15, 21:04
  #9
Medlem
Povels avatar
Citat:
Ursprungligen postat av gadzoox
[...]

2. Scope, var tanken. Men jag har ju lite otur ibland när jag tänker...


Där känner jag igen mig! Skulle behöva ha unit-tests (eller liknande) av mig själv emellanåt.

ONT:

Här är en variant som kan skapa flera oberoende intervallhanterare om man vill:

[PHP]var ticker = (function () {
function Ticker(action, interval) {
this.action = action;
this.interval = interval;
this.ref = void 0;
}
Ticker.prototype = {
"constructor": Ticker
, "start": function () {
this.ref || (this.ref = setInterval(this.action, this.interval));
}
, "stop": function () {
this.ref && (this.ref = clearInterval(this.ref));
}
};
return {
"create": function (action, interval) {
return new Ticker(action, interval);
}
};
})();[/PHP]

En ticker skapas genom att man skickar in en funktion och ett intervall (i ms.). Sedan kan den startas och stoppas.

[PHP]
function intervalHandler() {console.log(+new Date);}
var t = ticker.create(intervalHandler, 1000);
t.start();
// t.stop(); // senare..

// går också bra att skapa flera andra:
var t2 = ticker.create(function () {console.log("t2");}, 5000)
, t3 = ticker.create(function () {console.log("t3");}, 2000);
t2.start();
t3.start();
[/PHP]

Användning passande med gadzoox HTML för att testa:

[PHP]
var target = document.getElementById("output");
var timer = ticker.create(function () {
target.innerHTML += "tick ";
}, 300);
[/PHP]

Knapparna startar och stoppar då alltså tickern vid namn timer.

/p
__________________
Senast redigerad av Povel 2013-07-15 kl. 21:09. Anledning: variabelnamnfix
Citera
2013-07-16, 02:18
  #10
Medlem
Ett tips är att undvika setInterval för om funktionen du anropar skulle ta längre tid än intervallet så kommer hela webbsidan lagga. Det bästa du kan göra är att skriva en omslutande funktion som använder setTimeout istället.
Citera
2013-07-16, 07:33
  #11
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av Povel
...
Snyggt!
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in