Autor Zpráva
Pinqui
Profil
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:&nbsp;</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
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
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
_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
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
Pinqui
nevím, ale jaké.
Napríklad radu ohľadne vhodného parametra pre setTimeout.
Pinqui
Profil
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
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
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
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
_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
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);
… a pak nemusíš řešit obalování řetězců, ani escapování atd. — k tomu jsme se tě snažili dokopat.


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
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
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
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
_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

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: