Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  funktsioon JS ajastamine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 09.06.2014 22:35:27 funktsioon JS ajastamine vasta tsitaadiga

Tere. Tahan teha funktsiooni, mis jooksutab paraleelselt mitut elementi, hetkel liidab numbreid viitega kuni on väiksem 10

function timeo(el, nu){   
   setTimeout(function (){ele = document.getElementById(el);num = nu + 1;ele.innerHTML = num;if(num < 10){return timeo(el, num);}}, 1000);
}


see töötab kenasti, kui käivitad teise elemendi nimega väljundi töötab ka esimene kenasti lõpuni. Nüüd küsimus, kuidas seda funktsiooni mis hetkel on otse setTimeout sisse kirjutatud saaks eraldi kirjutada?
Proovisin

var func1 =  function (el2, nu2){ele jne...


aga see ei saaandmeid kätte

Edit: saan aru, et hetkel tehakse iga kord kui käivitatakse uus timeo(el, nu) ka uus alam funktsioon seal timeout sees aga kui ma defineerin ennem selle ära, siis vist polegi see asi võimalik ja kood jookseb kokku või ei tee seda mida soovin.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 09.06.2014 23:34:52 vasta tsitaadiga


function myfunction(el, nu){
    ele = document.getELem.....// et cetera
}

function timeo(el, nu){
    setTimeOut(myfunction(el, nu), 1000);
}


Seletan lahti ka igaks juhuks - see function(){..} mis sa timeouti paned on t2iesti tavaline funktsioon, mis võtab igasuguseid parameetreid.

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 10.06.2014 11:46:42 vasta tsitaadiga

Asi pole sugugi nii lihtne kui sa arvad, selliselt väljapool olev funktsioon ei hakka tööle, esiteks tuleb ta kutsuda välja jutumärkide sees ja siis hakkab rääkima, et el ja nu defineerimata, panen ka kogu timiva proovikoodi

<html>
<!-- Created on: 9.06.2014 -->
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<style>
#l1, #l2{width:30px;height:30px;border:solid 1px #000;text-align:center;line-height:30px;}
</style>

<script>   

window.onload = function() {
var link = document.getElementById("link");
link.onclick = function() {
         timeo ("l2", 1);
        return false;
    };    
   
timeo ("l1", 1);

};


 
function myf(el, nu){
       ele = document.getElementById(el);
       num = nu + 1;
       ele.innerHTML = num;
       if(num < 10){return timeo(el, num);}
       }

function timeo(el, nu){   
    
   // selliselt ei tööta, leiab, et el ja nu on sobimatud argumendid
   // setTimeout('myf(el, nu)', 1000);break; break;
   // sellisel kujul töötab.   
    setTimeout(function (){ele = document.getElementById(el);num = nu + 1;ele.innerHTML = num;if(num < 10){return timeo(el, num);}}, 1000);
}
</script>
</head>   
<body>
   <div id="l1">c</div>
       <div id="l2">c</div>
   <a href="#" id="link">Link</a>
</body>
</html>



võin nad ära defineerida, see järal ei saa ta funktsiooni andmeid, ok nüüd teen uued muutujad, defineerin need ära ja timeo funktsiooni sees väärtustan ning sinu pakutud variant hakkab tööle (selleni jõudsin ma ka ennem siia foorumisse postitamist) kuid ta ei tee seda mis vaja. Käivitades hakkab esimene number kenasti jooksma, kuid kui nüüd panen poole pealt teist korda funktsiooni teise elemendi sees käima, katkestab esimene töö ja teine hakkab tööle. Minu algel variandil võib neid funktsioone välja kutsuda mitu ja ka eelmised töötavad oma tsükli lõpuni.


// NB mittetoimiv kood ei tee seda mida vaja!!!

var el2, nu2;
window.onload = function() {
var link = document.getElementById("link");
link.onclick = function() {
         timeo ("l2", 1);
        return false;
    };    
   
timeo ("l1", 1);

};


 
function myf(el, nu){
       ele = document.getElementById(el);
       num = nu + 1;
       ele.innerHTML = num;
       if(num < 10){return timeo(el, num);}
       }

function timeo(el, nu){   
    el2=el;
    nu2=nu;
   // selliselt töötab, kuid ei tee seda mis vaja
    setTimeout('myf(el2, nu2)', 1000);
   // sellisel kujul töötab.   
    //setTimeout(function (){ele = document.getElementById(el);num = nu + 1;ele.innerHTML = num;if(num < 10){return timeo(el, num);}}, 1000);
}

_________________


viimati muutis andrusny 10.06.2014 12:19:50, muudetud 1 kord
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 10.06.2014 11:56:03 vasta tsitaadiga

http://jsfiddle.net/Y4SNt/

ja

http://jsfiddle.net/Y4SNt/1/

Milles probleem?

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 10.06.2014 12:16:07 vasta tsitaadiga

Probleem selles, et na tahan selle funktsiooni, mis seal setTimeout sees on välja tõsta, et ma saaks pikema funktsiooni korral seda eraldi kirjutada.

Variant 1
setTimeout(function (){ele = document.getElementById(el);num = nu + 1;ele.innerHTML = num;if(num < 10){return timeo(el, num);}}, 1000);


Variant 2
setTimeout('myf(el2, nu2)', 1000);



Sinul on ju ka mõlemal timeoutil funktsioon sisse kirjutatud, mitte funktsioon välja kutsutud mujalt. Väljakutsumises iseenesest probleemi ju polegi, ma teises koodis kirjutasin ja see teeb täpselt seda mida kirjutad aga mitte seda mida ma tahan.

Katsun veel korra selgitada.
Mul hetkel kaks numbri loendit, mis väljastavad kumbki eri div sisse 2-10
Esimene hakkab kohe tööle, teise käivitan hiljem suvalisel ajal ja nad töötavad sõltumatult lõpuni, kasutades sama timeout funktsiooni.
Selliselt võiks neid suvalise arvu käima lasta.

See variant, millele ma kirjutasin ette // NB mittetoimiv kood ei tee seda mida vaja!!! teebki selliselt, et algul esimene loendi hakkab tööle, peale teise käivitumist seiskub esimene ja teine hakkab tööle.

Variant 1 puhul tehakse vist iga timerile oma uus funktsioon, mis töötab eraldi, variant 2 kasutab sama funktsiooni ja ei saagi vist lõpuni joosta eelmise tsükliga, kuna saab ju uued argumendid kätte.

Vähemalt selliselt ei saa seda kasutada.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 10.06.2014 12:17:05 vasta tsitaadiga

http://jsfiddle.net/cSc2D/

Toimib ka v2ga h2sti... ei saa aru, kus probleem on...

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 10.06.2014 12:40:34 vasta tsitaadiga

neros kirjutas:
http://jsfiddle.net/cSc2D/

Toimib ka v2ga h2sti... ei saa aru, kus probleem on...


See ei toimi. Pane timeout 5000 peale ja vaata mis tulemuseks on. Antud kood kutsub funktsiooni foo välja kohe mitte timeouti peale.

Aga ma endiselt ei saa andrusny'i probleemist aru:

Siin on ju su funktsioon väljaspool setTimeouti:
http://jsfiddle.net/Y4SNt/1/

Milles siin probleem seisneb?

http://jsfiddle.net/Y4SNt/2/
Siin kutsun välja kaks timerit mis jooksevad eri aegadel ning kasutavad välist funktsiooni.

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 10.06.2014 12:41:18 vasta tsitaadiga

Esimene kood on kirjutatud otse timeout sisse ja peale lingi kaudu teise lahtri käivitamist jookseb ka esimene lõpuni, teine kood on tehtud nii nagu te siin soovitate ja peale teise lahtri käivitamist seiskub loendur esimeses.

http://www.muffimaania.net.ee/average/sodi/paralel.html
http://www.muffimaania.net.ee/average/sodi/paralel2.html

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 10.06.2014 12:54:21 vasta tsitaadiga

Teine kood ei ole ju kirjutatud nii nagu me soovitame...

See kood on nii kirjutatud nagu me soovitame, ja minuarust töötab väga hästi:
http://jsfiddle.net/Y4SNt/3/

Ja teiseks on olemas veel selline asi nagu. setInterval... Ei pea timeouti ise jooksutama 10 korda.

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 10.06.2014 12:58:40 vasta tsitaadiga

Tänud, ikka ise loll, ei kutsunud seda funktsiooni teise funktsiooni sees esile, nüüd ta teeb ikkagi põhimõtteliselt seda, mis mu algne koodki, tekitab neid alam funktsioone lõpmatult,
function() {
myf(el, nu);
}
kuid tegevus toimub eraldi funktsioonis.
Täpselt seda vaja oligi.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
kuunar
Kreisi kasutaja

liitunud: 20.02.2009



Autoriseeritud ID-kaardiga

sõnum 10.06.2014 13:46:43 vasta tsitaadiga

Redikate kirjutas:


See kood on nii kirjutatud nagu me soovitame, ja minuarust töötab väga hästi:


Mitu korda järjest lingile vajutades lööb sassi lugemise... ei kujuta ette kas sel on muidugi mingit tähtsust üldse.
Kommentaarid: 14 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 10.06.2014 14:21:54 vasta tsitaadiga

setTimeout(funktsiooniNimi, 5000, parameeter1, parameeter2, ...)
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 10.06.2014 15:59:39 vasta tsitaadiga

mikk36 kirjutas:
setTimeout(funktsiooniNimi, 5000, parameeter1, parameeter2, ...)


Ka toimiv jah, ning ilus clean lahendus, kuid sellel on comapability probleeme.

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 10.06.2014 17:07:15 vasta tsitaadiga

kuunar kirjutas:
Redikate kirjutas:


See kood on nii kirjutatud nagu me soovitame, ja minuarust töötab väga hästi:


Mitu korda järjest lingile vajutades lööb sassi lugemise... ei kujuta ette kas sel on muidugi mingit tähtsust üldse.


See pole hetkel määrav, funktsioon tuleb siuliselt sootuks midagi muud hetkel oligi probleem, et saaks mitu korraga toimima. Praeguseks asi lahendatud. Tänud veelkord.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  funktsioon JS ajastamine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.