Autor | Zpráva | ||
---|---|---|---|
Pinqui Profil |
#1 · Zasláno: 15. 7. 2009, 17:07:15
Prosím už to zkouším ěnjakou chvíli mám index.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="cs"> <head> <title>TEST</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="description" content=""> <meta name="keywords" content=""> <meta name="author" content=""> <meta name="robots" content="all"> <style type="text/css" media="screen, projection"> @import "style.css"; </style> </head> <body> <script type="text/javascript"> /*var vystup = null;*/ var room = '<?php print $_GET["rid"] ?>'; /*function repeat(akce, last, kam) { clearTimeout(); setTimeout('stahniData('+akce+', '+last+', '+kam+')', 10000); }*/ function stahniData(akce, last, kam) { // odmazeme stary skript, pokud existoval text = document.getElementById(kam); var hlavicka = document.getElementsByTagName('head')[0]; var dataLoader = document.getElementById('scriptLoader'); if(dataLoader) hlavicka.removeChild(dataLoader); // vytvorime novy element script var script = document.createElement('script'); script.id = 'scriptLoader'; script.src = 'test.php?akce='+akce+'&room='+room+'&id='+last+'&kam='+kam+'&r='+Math.random(); // POZOR, DULEZITE!! Skript musime vlozit do stranky pomoci DOM - appendChild() // Ihned po vlozeni prohlizec stahne skript a spusti jej var x = document.getElementsByTagName('head')[0]; x.appendChild(script); setTimeout('stahniData('+akce+', '+last+', '+kam+')', 10000); return false; } function vypisText(txt) { // nejsnazsi cesta, vlozime novy kod ke staremu na konec text.innerHTML = txt+text.innerHTML; /*alert(vystup.childNodes[0]);*/ if(text == 'msgT'){ while(text.childNodes[50]) text.removeChild(text.childNodes[50]); return false; } } function chyba(txt) { // obycejny alert s hlaskou alert(txt); return true; } function vymazData() { // v jednoduchem cyklu smazeme vsechny elementy v prvku vystup while(text.hasChildNodes()) text.removeChild(text.childNodes[0]); return false; } </script> <div id="around"> <div id="header"></div> <div id="msgB"><div id="msgT"></div></div> <div id="userB"><div id="userT"></div></div> <div id="footer"> <form action="" method="post" onsubmit="return !odeslat(this);"> <label for="txt">Jack06: </label><input type="text" name="text" id="txt"> <input type="checkbox" name="visp" id="check"> <select name="nick"> <option value="value1">Value1</option> <option value="value2">Value2</option> <option value="value3">Value3</option> </select> <input type="submit" value="Odešli"> <input type="button" value="test" onclick="stahniData('gtext', '1', 'msgT');"> </form> </div> </div> </body> </html> a test.php: <?php header('Content-Type: text/html; charset=utf-8'); if (isset($_GET['akce'])) { switch ($_GET['akce']) { case "gtext": echo gtext($_GET['room'], $_GET['id'], $_GET['kam']); break; default: echo "chyba('Byla zavolána neplatná metoda!');"; break; } } function gtext($room = '',$last = '', $kam = ''){ $last = $last+1; $text = "<p>text text text<p>"; return "vypisText('$text');";exit; }?> ukázka zde: http://superpokec.cz/matrix/ při kliknutí na tlačítko test to funguje.. jakmile se to má ovšem spustit přez setTimeout tak to nahlásí: gtext is not defined a nevím proč když to poprvé normálně všechno šlo |
||
_es Profil |
#2 · Zasláno: 15. 7. 2009, 17:23:38
Pinqui
Ten script najprv zjednoduš, aby sa v ňom dalo vyznať. Skús použiť rady, ktoré si dostal v iných vláknách a možno tento problém zanikne. |
||
Chamurappi Profil |
#3 · Zasláno: 15. 7. 2009, 17:24:40
Reaguji na Pinquiho:
Ten řetězec, se kterým na řádku 36 voláš setTimeout, vypadá jak? Když si ho před tím vyalertuješ, pochopíš, v čem je chyba. |
||
Pinqui Profil |
#4 · Zasláno: 15. 7. 2009, 17:25:08 · Upravil/a: Pinqui
_es
nevím, ale jaké. už jsem to zkusil zjednodušit, nejsem odborník v javascriptu. Trochu jsem to tedy zkusil ještě upravit, kódy jsou vidět ve zdrojovém kódu -> php je vidět ve zdrojovém kódu souboru v odkazu vedle tlačítka test |
||
Chamurappi Profil |
#5 · Zasláno: 15. 7. 2009, 17:27:45
Reaguji na Pinquiho:
„nejsem odborník v javascriptu“ Tak se buď snaž pochopit, co ti radíme, nebo si nějakého odborníka sežeň do týmu. |
||
_es Profil |
#6 · Zasláno: 15. 7. 2009, 17:28:38
Pinqui
„nevím, ale jaké.“ Napríklad radu ohľadne vhodného parametra pre setTimeout. |
||
Pinqui Profil |
#7 · Zasláno: 15. 7. 2009, 18:24:26 · Upravil/a: Pinqui
Takže když potřebuji, aby se to spustilo hned při najetí stránky a pak v intervalech a pak ještě po kliknutí na tlačítko,tak to asi přez tu první možnost nepujde ..? při zaždém zavolání té funkce se totiž mění id, podle toho kolikátý to vybralo text z mysql, což znamená že potřebuji předávat proměnnou last.
zkusil jsem to druhým typem, ale ani se mi to nespustí.: <script type="text/javascript"> var room = '<?php print $_GET["rid"] ?>'; setTimeout(function() { function stahniData(akce, last, kam) { text = document.getElementById(kam); var hlavicka = document.getElementsByTagName('head')[0]; var dataLoader = document.getElementById('scriptLoader'); if(dataLoader) hlavicka.removeChild(dataLoader); var script = document.createElement('script'); script.id = 'scriptLoader'; script.src = 'test.php?akce='+akce+'&room='+room+'&id='+last+'&kam='+kam+'&r='+Math.random(); var x = document.getElementsByTagName('head')[0]; x.appendChild(script); return false; } }, 10000); function vypisText(txt) { text.innerHTML = txt+text.innerHTML; if(text == 'msgT'){ while(text.childNodes[50]) text.removeChild(text.childNodes[50]); return false; } } </script> takto to funguje po 10vteřinách ale jen jednou, ale nespustí se to hned při najetí stránky, a při stisknutí tlačítka... kdybych to chtěl při stisku tlačítka, tak to nebudu moci mít vnořené ne? hlavní problém je tedy v tom že preř return potřebuji volat tu funkci na stáhnutí dat tzn: return "data('funkce php', 'posledni id z php funkce', 'kam se bude obsah ukládat');"; ještě mě něco napadlo zkusím to napsat a přepíšu sem. |
||
_es Profil |
#8 · Zasláno: 15. 7. 2009, 18:45:46 · Upravil/a: _es
Pinqui
Nehodilo by sa ti viac ako setTimeout setInterval? Asi by sa ti to zišlo znovu premyslieť od základov. Treba ti načítavať externé javascripty? A musí byť ten javascript taký zložitý? Skús to spraviť tak, aby sa celý JavaScript načítal na začiatku a potom si už len sťahoval a spracúval samotné dáta, ktoré ti pošle PHP script. |
||
Chamurappi Profil |
#9 · Zasláno: 15. 7. 2009, 18:46:04
Reaguji na Pinquiho:
Chceš-li při zavolání funkce nastavit nový timeout, musíš setTimeout zavolat zevniř té funkce. Je rozdíl mezi funkcí, deklarací funkce a voláním funkce. Představ si funkci jako proměnnou či objekt. Funkce je „vypisText“ nebo „function(a, b){ … }“, deklarace funkce je „function vypisText(txt) { … }“ (je to vlastně přiřazení funkce do identifikátoru „vypisText“), volání funkce je „vypisText("text")“. Zpožděné volání funkce nastavíš tak, že do setTimeoutu dáš jako první argument funkci. Ne její deklaraci. Ne její volání. Volání funkce můžeš dát dovnitř jiné funkce. Kompletní řešení ti dát nechci, ale už nevím, jak jinak to vysvětlit. Přenechám tě ostatním :-) |
||
_es Profil |
#10 · Zasláno: 15. 7. 2009, 19:15:34 · Upravil/a: _es
Chamurappi
Tie tvoje vysvetlenia asi nebudú celkom presné. Má vôbec zmysel uvažovať v JavaScripte o deklarácii funkcie ako v C? Podľa mňa sa dá uvažovať len o definícii pomenovanej funkcie, alebo o definícii nepomenovanej funkcie, ktorú možno priradiť nejakej premennej alebo ju použiť ako parameter inej funkcie. |
||
Pinqui Profil |
#11 · Zasláno: 15. 7. 2009, 20:16:55
_es
Mě to nepřipadne složité, spíše mě nenapadá jiné řešení než toto. Přez univerzální funkci ajaxu to nechci, jelikož tam jsou velké časové prodlevy. a setInterval tam také nechci zase kvůli spoždění.. Takto budu mít jistotu, že se to vždy spustí po 10 vteřinách od stáhnutí dat. |
||
Chamurappi Profil |
#12 · Zasláno: 15. 7. 2009, 20:28:46
Reaguji na Pinquiho:
Dobře, tak jinak. V příspěvku [#3] jsem ti už jasně napsal, který řádek způsobuje chybu. Vyrábíš tam řetězec, ve kterém je volání funkce a do toho volání cpeš jako argumenty řetězce, kolem kterých ale chybí uvozovky, takže se berou jako proměnné (proto ti píše, že není gtext definováno). Na to bys přišel, kdybys udělal, co jsem psal v příspěvku #3. Místo toho řádku dej tohle: setTimeout(function() { stahniData(akce, last, kam); }, 10000); Reaguji na _es: „Má vôbec zmysel uvažovať v JavaScripte o deklarácii funkcie ako v C?“ Myslím, že má. Funkce je v JS vnímána jako proměnná/objekt a pokud jde deklarovat proměnnou, jde deklarovat i funkci. Jak jinak bys nazval to, co Pinqui v [#7] strčil do funkce, která byla v setTimeoutu? Nějak tomu říkat musíme. Není to ani volání funkce, ani samotná funkce, je to jen funkce přiřazená do lokální proměnné. |
||
Pinqui Profil |
#13 · Zasláno: 15. 7. 2009, 20:43:26
vyřešeno:
<script type="text/javascript"> var room = '<?php print $_GET["rid"] ?>'; var funkce = null; function repeat(akce, last, kam){ funkce = eval("setTimeout(\"stahniData('"+akce+"', '"+last+"', '"+kam+"')\", 10000);"); } function stahniData(akce, last, kam) { text = document.getElementById(kam); var hlavicka = document.getElementsByTagName('head')[0]; var dataLoader = document.getElementById('scriptLoader'); if(dataLoader) hlavicka.removeChild(dataLoader); var script = document.createElement('script'); script.id = 'scriptLoader'; script.src = 'test.php?akce='+akce+'&room='+room+'&id='+last+'&kam='+kam+'&r='+Math.random(); var x = document.getElementsByTagName('head')[0]; x.appendChild(script); clearTimeout(funkce); return false; } function vypisText(txt) { text.innerHTML = txt+text.innerHTML; if(text == 'msgT'){ while(text.childNodes[50]) text.removeChild(text.childNodes[50]); return false; } } </script> |
||
_es Profil |
#14 · Zasláno: 15. 7. 2009, 20:45:13 · Upravil/a: _es
Chamurappi
Ja si skôr myslím, že v JavaScripte má zmysel uvažovať len o deklarácii všeobecnej premennej (var x;), v iných jazykoch typu variant a pod. Ako by si chcel v JavaScripte deklarovať funkciu bez toho, aby nebola zároveň definovaná? „Jak jinak bys nazval to, co Pinqui v [#7] strčil do funkce, která byla v setTimeoutu?“ Je to definícia pomenovanej vnorenej funkcie, ktorej pomenovanie nie je využité. |
||
_es Profil |
#15 · Zasláno: 15. 7. 2009, 20:57:00
Pinqui
Ak ti stači, že to funguje... Ak to budeš chcieť neskôr nejako viac prerábať, tak si si tam pridal ďalšiu problematickú vec - eval, ktorá ti môže spôsobiť nové ťažkosti. |
||
Pinqui Profil |
#16 · Zasláno: 15. 7. 2009, 22:38:07 · Upravil/a: Pinqui
_es
Bohužel jsem nepřišel, jak to udělat jinak tak aby mi to fungovalo: 1) při prvním načtení stránky 2) po určitém intervalu 3) při stisknutí tlačítka (s tím že při stisknutí se čas počítá odznovu) když jsem to zkoušel vkládat jinak, tak mi to nešlo buď volat tlačítkem, nebo spustit hned při najetí stránky, nebo vůbec. Nejsem v js vůbec dobrej, proto jsem psal sem o rady. viz: http://superpokec.cz/matrix/?rid=22348 |
||
Časová prodleva: 15 let
|
0