Funkce – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Funkce – JavaScript, AJAX, jQuery – Fórum – Programujte.comFunkce – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

harpener0
Newbie
1. 11. 2010   #1
-
0
-

Dobrý den,
potřeboval bych poradit, jak přerušit běžící rekurzivní (snad to říkám správně) funkci v javascriptu.
Jde o to, že si z mysql načtu hodnotu do php a v javascriptu si nastavím čas, po jehož uplynutí (setInterval) se tato hodnota změní a pomocí ajax se zapíše zpět do mysql. Co když ale nechci, aby ten čas uplynul a abych to mohl kdykoli přerušit. Tlačítko, které funkci vyvolá je ve formuláři, zkoušel jsem reset, ale ten nefungoval, jiná funkce se nedostane přes interval té mojí, takže mě zatím nenapadá, jak to vyřešit.
Děkuji, Harpener.

Nahlásit jako SPAM
IP: 212.71.186.–
CZechBoY+4
Věrný člen
1. 11. 2010   #2
-
0
-

clearTimeout ;-)

Nahlásit jako SPAM
IP: 213.192.10.–
harpener0
Newbie
1. 11. 2010   #3
-
0
-

To CZechBoY :
no, abych interval ukončil po uplynutí, používám clearInterval, ale já potřebuju na nějaké tlačítko namapovat jinou funkci/příkaz, který mi ukončí funkci/interval - v podstatě jde o externí Zrušit

asi sem napíšu rovnou tu část kódu, o kterou mi jde:



function ohen_funkce_jednu_minutu()
{
cas = 60;
var cas_prace_ohen = setInterval(function () {
document.getElementById("prace_cas_id").value = cas;
cas--;
if (cas==(-1)) {cas_prace_ohen = clearInterval(cas_prace_ohen);
exps();
alert("Práce byla dokončena!");}
}, 1000);
}
function exps(){
if (window.XMLHttpRequest) {xmlhttp=new XMLHttpRequest();}
else {xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
xmlhttp.onreadystatechange=function() {
if ((xmlhttp.readyState==4) && (xmlhttp.status==200))
{document.getElementById("expy").innerHTML=xmlhttp.responseText;}
//else {alert("Vámi definovaný prostředek nelze nalézt!");}
}
var uzivatel = document.getElementById("name_user_id").innerHTML;
xmlhttp.open("GET","ajax_expy.php?user=" + uzivatel,true);
xmlhttp.send();
}



ta první funkce řeší odpočítávání a ta druhá zápis přes ajax, já potřebuju tu první kdykoli přerušit a celé se to má chovat, jako bych ji ani nespustil

Nahlásit jako SPAM
IP: 212.71.186.–
m->29+6
Super člen
2. 11. 2010   #4
-
0
-

Tak ten kód je nič moc (nie písaný, ale jeho logika). Namiesto setInterval() použi setTimeout() a pozri si rozdiel medzi nimi. Tým ti odpadne aj rušenie to intervalu potom vo funkcii. To zrušenie nie je problém. Stačí definovať premennú cas_prace_ohen ako globálnu čo vyrieši len zmena riadku č. 5

var cas_prace_ohen = setInterval(function () {
na tento:
cas_prace_ohen = setTimeout(function () {
Potom si len definuješ novú funkciu:
function ohen_funkce_zrus_jednu_minutu() {

clearTimeout(cas_prace_ohen);
}
a priradíš ju tomu druhému tlačítku na zrušenie.

Nahlásit jako SPAM
IP: 83.208.112.–
harpener0
Newbie
2. 11. 2010   #5
-
0
-

no musel jsem si změnit i řádek 8, ale důvod, proč tam byl setInterval je, aby se to provedlo vícekrát a nestálo to na hodnotě 60, což teď dělá, pokud je to ale způsobeno něčím jiným, tak na to zkusím přijít

asi jsem špatně pochopil rozdíl mezi setInterval a setTimeout - myslel jsem, že timeout je jedno spuštění za čas a interval je spouštění pořád dokola, dokud ho nevypnu (clearInterval), tj. timeout bych musel volat pokaždé znova při nějaké události (např. onLoad u body)

Nahlásit jako SPAM
IP: 212.71.186.–
m->29+6
Super člen
2. 11. 2010   #6
-
0
-

To si potom pochopil správne. A stojí ti to teraz práve pre ten Timeout. Kľudne teda môžeš pracovať s intervalom, pred tým som si moc nevšímal, že tým časom aktualizuješ aj stránku (moja chyba). Niečo podobné som nedávno robil tak sa na to môžeš mrknúť http://koduj.cz/viewtopic.php?f=19&t=462.

Nahlásit jako SPAM
IP: 83.208.112.–
harpener0
Newbie
2. 11. 2010   #7
-
0
-

To m->29 :
Moc hezký kód :), zkusím z něj vyjít.
Akorát moc nevím, jak funguje arguments.callee.timeId (a zkoušel jsem si to objasnit pomoci googlu).
Jedná se o nějaký unikátní argument funkce, pomocí kterého s ní pracuješ?

Nahlásit jako SPAM
IP: 212.71.186.–
m->29+6
Super člen
2. 11. 2010   #8
-
0
-

arguments je dostupný vnútri každej funkcie a je to pole argumentov predaných funkcii (ale myslím, že nie inštancia Array). Má ale aj špeciálnu vlastnosť callee, ktorá obsahuje vlastne samotný objekt funkcie v ktorej sa práve nachádzaš. Ak je funkcia pomenovaná tak ju môžeš zavolať menom. Ak je ale anonymná tak sa k nej dostaneš práve takto. Je to však doporučované aj keď je funkcia pomenovaná, pretože nikdy nevieš či ju niekto nepremenuje ;-)

Nahlásit jako SPAM
IP: 83.208.112.–
harpener0
Newbie
2. 11. 2010   #9
-
0
-

No, zdá se, že jsem to rozchodil, díky moc za pomoc.
Pomohl mi tvůj kód a taky jsem objevil jednu zvláštnost, já mám v php includovaný javascript v <head> a musel jsem ho přesunout do <body>, nevěděl jsem, že na tom sejde :)

Nahlásit jako SPAM
IP: 212.71.186.–
m->29+6
Super člen
2. 11. 2010   #10
-
0
-

Skripty by sa mali zahŕňať až na koniec stránky pred body

...

<script src="/path/to/script.js" type="text/javascript"></script>
</body>
Je to preto aby nezdržovali načítanie stránok a hlavne aby bol už postavený kompletný model DOM (až na body a html). Predpokladám, že ti to nešlo, lebo si aktualizoval pomocou getElementById() element, ktorý ešte neexistoval. Možno ale niečo iné - firebug je dobré riešenie ako to nájsť.

Nahlásit jako SPAM
IP: 83.208.112.–
harpener0
Newbie
25. 11. 2010   #11
-
0
-

Zdravím, potřeboval bych poradit.
Po obnovení stránky (např. F5, ctrl+r ...) se přeruší právě probíhající javascriptová funkce (s intervalem).
Lze tomu čistě teoreticky zabránit nějakou záchranou parametrů funkce těsně před obnovením, nebo musím postavit funkci na jiné logice?

Nahlásit jako SPAM
IP: 212.71.186.–
m->29+6
Super člen
25. 11. 2010   #12
-
0
-

Ak sa užívateľ rozhodne znovunačítať stránku tak tomu nič nezabráni. Jedinou možnosťou je asi uložiť si zostávajúci čas do nejakého úložiska (cookie?) a potom pokračovať tam kde sa prestalo s uloženým časom. Neskúšal som a momentálne sa mi nechce skúšať, ale pri obnovení stránky by sa mala vyvolať udalosť onunload a následne onload ;-)

Nahlásit jako SPAM
IP: 83.208.112.–
harpener0
Newbie
26. 11. 2010   #13
-
0
-

to je dobrý nápad, zkusím vymyslet to použití s událostmi onbeforeload a onbeforeunload, které reagují na signál obnovení stránky a dám vědět

Nahlásit jako SPAM
IP: 213.194.220.–
harpener0
Newbie
29. 11. 2010   #14
-
0
-

Tak se mi to povedlo s pomocí těch událostí onLoad a onUnload a samozřejmě použití cookies (u kterých je použitý kód z internetu). Objevil jsem ale drobný zádrhel, a to když obnovím stránku těsně před vypršením času, potom se jaksi propletou funkce "záchrana parametrů" a ajax odeslání a výsledkem je přičtení dvojnásobného množství zkušeností (jako kdyby se ajax provedl dvakrát po sobě). Asi je to tím, že se stihne vyhodnotit těsně před skriptem obnovení stránky. Dám sem ukázku kódu. Vím, že je dost neohrabaný a příšerně složitý, ale právě se snažím o funkčnost, ne jednoduchost. Ta počká.



function Set_Cookie( name, value, expires, path, domain, secure )
{
var today = new Date();
today.setTime( today.getTime() );

if (expires)
{
expires = expires * 1000 * 60 * 60 * 24;}
var expires_date = new Date( today.getTime() + (expires) );
document.cookie = name + "=" + escape( value ) +
((expires) ? ";expires=" + expires_date.toGMTString() : "" ) +
((path) ? ";path=" + path : "" ) +
((domain) ? ";domain=" + domain : "" ) +
((secure) ? ";secure" : "" );
}

function Get_Cookie( check_name ) {

var a_all_cookies = document.cookie.split( ';' );
var a_temp_cookie = '';
var cookie_name = '';
var cookie_value = '';
var b_cookie_found = false;

for ( i = 0; i < a_all_cookies.length; i++ )
{
a_temp_cookie = a_all_cookies[i].split( '=' );
cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');

if (cookie_name == check_name)
{
b_cookie_found = true;
if ( a_temp_cookie.length > 1 )
{cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );}
return cookie_value;
break;
}
a_temp_cookie = null;
cookie_name = '';
}
if (!b_cookie_found)
{return null;}
}

function Delete_Cookie( name, path, domain )
{if (Get_Cookie(name)) document.cookie = name + "=" + ((path) ? ";path=" + path : "") + ((domain) ? ";domain=" + domain : "") + ";expires=Thu, 01-Jan-1970 00:00:01 GMT";}

function obnoveni() //OnLoad u <body>
{
document.getElementById("div_typ_prace_id").style.display="none";
document.getElementById("div_cas_prace_id").style.display="none";
alert("Obnovila se stránka!")
if (!Get_Cookie ("cas_funkce"))
{alert ("Nenačetl jsem funkci!");}
else {cas = Get_Cookie ("cas_funkce");
document.getElementById("div_typ_prace_id").style.display="block";
document.getElementById("div_cas_prace_id").style.display="block";
alert("Já funguju :)");
cas = Get_Cookie ('cas_funkce');
fce = Get_Cookie ('druh_funkce');
celkovy_cas = Get_Cookie ('vychozi_cas_funkce');
if (fce == "funkce1")
{//příprava stránky na scriptovou funkci
document.getElementById("prace_typ_id").value = "Udržovat oheň 1 minutu";
document.getElementById("div_typ_prace_id").style.display="block";
document.getElementById("div_cas_prace_id").style.display="block";
document.getElementById("ohen_id").disabled = true;
document.getElementById("lov_id").disabled = true;
document.getElementById("sber_id").disabled = true;
fce = "funkce1";
//nastavení intervalu
ohen_funkce.time1Id = setInterval(ohen_funkce, 999);
//možnost zrušení intervalu pomocí tlačítka
zrusit.onclick = function() {clearInterval(ohen_funkce.time1Id);
document.getElementById("ohen_id").disabled = false;
document.getElementById("lov_id").disabled = false;
document.getElementById("sber_id").disabled = false;
document.getElementById("div_typ_prace_id").style.display="none";
document.getElementById("div_cas_prace_id").style.display="none";
document.getElementById("prace_typ_id").value = "";
document.getElementById("prace_cas_id").value = "";
fce = "nic";}}
else if (fce == "funkce2")
{
document.getElementById("prace_typ_id").value = "Lovit v lese 1 minutu"";
document.getElementById("div_typ_prace_id").style.display="block";
document.getElementById("div_cas_prace_id").style.display="block";
document.getElementById("ohen_id").disabled = true;
document.getElementById("lov_id").disabled = true;
document.getElementById("sber_id").disabled = true;
fce = "funkce2";
lov_funkce.time2Id = setInterval(lov_funkce, 999);
zrusit.onclick = function() {clearInterval(lov_funkce.time2Id);
document.getElementById("ohen_id").disabled = false;
document.getElementById("lov_id").disabled = false;
document.getElementById("sber_id").disabled = false;
document.getElementById("div_typ_prace_id").style.display="none";
document.getElementById("div_cas_prace_id").style.display="none";
document.getElementById("prace_typ_id").value = "";
document.getElementById("prace_cas_id").value = "";
fce = "nic";}}
else if (fce == "funkce3")
{
document.getElementById("prace_typ_id").value = "Sbírat bobule 1 minutu"";
document.getElementById("div_typ_prace_id").style.display="block";
document.getElementById("div_cas_prace_id").style.display="block";
document.getElementById("ohen_id").disabled = true;
document.getElementById("lov_id").disabled = true;
document.getElementById("sber_id").disabled = true;
fce = "funkce3";
sber_funkce.time3Id = setInterval(sber_funkce, 999);
zrusit.onclick = function() {clearInterval(sber_funkce.time3Id);
document.getElementById("ohen_id").disabled = false;
document.getElementById("lov_id").disabled = false;
document.getElementById("sber_id").disabled = false;
document.getElementById("div_typ_prace_id").style.display="none";
document.getElementById("div_cas_prace_id").style.display="none";
document.getElementById("prace_typ_id").value = "";
document.getElementById("prace_cas_id").value = "";
fce = "nic";}}
}
Delete_Cookie('cas_funkce', '/', '');
Delete_Cookie('druh_funkce', '/', '');
Delete_Cookie('vychozi_cas_funkce', '/', '');
}

function pred_obnoveni()//OnUnload u <body>
{
alert("Chystá se obnovit stránka!");
if (fce == "funkce1"){alert("Běží ti funkce udržovat oheň!");
Set_Cookie ('cas_funkce', cas, '', '/', '', '');
Set_Cookie ('druh_funkce', fce, '', '/', '', '');
Set_Cookie ('vychozi_cas_funkce', celkovy_cas, '', '/', '', '');}
else if (fce == "funkce2") {alert("Běží ti funkce lovit v lese!");
Set_Cookie ('cas_funkce', cas, '', '/', '', '');
Set_Cookie ('druh_funkce', fce, '', '/', '', '');
Set_Cookie ('vychozi_cas_funkce', celkovy_cas, '', '/', '', '');}
else if (fce == "funkce3") {alert("Běží ti funkce sbírat bobule!");
Set_Cookie ('cas_funkce', cas, '', '/', '', '');
Set_Cookie ('druh_funkce', fce, '', '/', '', '');
Set_Cookie ('vychozi_cas_funkce', celkovy_cas, '', '/', '', '');}
else {fce = "nic";
alert("Neběží ti žádná funkce!");}
}

Nahlásit jako SPAM
IP: 212.71.186.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý