Autor Zpráva
Pinqui
Profil
Mám upravený kóz z:

<script language="javascript" type="text/javascript">
var vystup = null;
var room = '<?php print $_GET["rid"] ?>';
var id = '';
function repeat(akce,last) {
setTimeout("stahniData('"+akce+"','"+last+"')",10000);
id = last;
}
function stahniData(akce, id) {
	// odmazeme stary skript, pokud existoval
	vystup = window.read.document.getElementById('msgBox');
  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 = 'javascript-rpc.php?akce='+akce+'&room='+room+'&id='+id+'&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);
	
	return false;
}

function vypisText(txt) {
	// nejsnazsi cesta, vlozime novy kod ke staremu na konec
  vystup.innerHTML = txt+vystup.innerHTML;
  /*alert(vystup.childNodes[0]);*/
  while(vystup.childNodes[50]) vystup.removeChild(vystup.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(vystup.hasChildNodes()) vystup.removeChild(vystup.childNodes[0]);
	return false;
}
</script>



když vypisuji text typu:
vypisText('Ahoj toto je pokusný text, který se vypíše')


tak to funguje, ovšem problém nastává, když tam napíše někdo smajlíka typu :) jakoby uzavře závorku asi nebo něco takového
vypisText('Ahoj toto je pokusný text :) , který se nevypíše')


Nevím co s tím mám dělat, aby se ten znak zobrazil, ale neukončil js errorem :-( prosím o radu díky
Chamurappi
Profil
Reaguji na Pinquiho:
Prosím o odkaz na živou ukázku.
Pinqui
Profil
Chamurappi
http://superpokec.cz/try/?rid=55983
Chamurappi
Profil
Reaguji na Pinquiho:
Když dosazuješ do volání funkce vypisText řetězec, musíš escapovat (minimálně) uvozovky, kterými ho obaluješ (v tomto případě apostrofy). Jinak ti řetězec předčasně skončí, na odkázané stránce končí v textu „dadmtb: <a href='ww“.
Pinqui
Profil
Chamurappi
A jak dosáhnu toho že to projde přez ten dom, ale ukáže se to tak jak má..? Když dám řetězec escapovat a vypíši ho tak se vypíše i s escape ne??
Chamurappi
Profil
Reaguji na Pinquiho:
jak dosáhnu toho že to projde přez ten dom
Moc nechápu, proč pořád zmiňuješ DOM. Máš problém v syntaxi JS, vůbec nesouvisí s DOMem. Chceš-li napsat uvozovky do řetězce ohraničeného uvozovkami, musíš je escapovat zpětným lomítkem — jiná cesta není. V hodnotě toho řetězce pak jsou samozřejmě samotné uvozovky a ne escapované.
_es
Profil
Pinqui
Ten kód je dosť neprehľadný a miesto reťazca je do setTimeout lepšie dať priamo funkciu alebo literál funkcie.
Pinqui
Profil
_es
teď nechápu co jsi myslel s tím setTimeout... vždy na stránce kterou si to nahrává mám volání funkce repeat
aby se to obnovovalo pořád po daných intervalech i při přerušení vyvolání té funkce tlačítkem obnovit.
_es
Profil
Pinqui
Sú lepšie možnosti, než používaš:
setTimeout(názov_funkcie, 10000); // varianta 1
setTimeout(function(p1, p2 /*, ...*/){/* kód funkcie */}, 10000);  // varianta 2
, využívať výhody vnorených funkcií a pod.
Pinqui
Profil
_es
to jo, ale takto se mi ten setTimeout spustí jednou, a pak ho znovu spustit po 10 vteřinách mám jak ?
Proto to mám ve funkci repeat, protože když zavolám funkci ze setTimeout, tak proběhné php kód , který mi dá:

<?php repeat "repeat('akce','cislo');"; ?> 


čímž znovu nastavím, aby se setTimeout spustil po 10 vteřinách a když bych zavolal funkci stahniData(..) ručně přez tlačítko tak při běhu setTimeout mohu resetovat, aby se znovu odpočítávalo 10 vteřin
_es
Profil
Pinqui
Len som ti poradil, že do parametra setTimeout nie je dobré dávať reťazec, ale priamo funkciu s takým istým efektom. S inými záležitosťami sa mi zaoberať nechce.
Pinqui
Profil
_es
Mno však tu 1 variantu tam používám..
Chamurappi
Profil
Reaguji na Pinquiho:
Nepoužíváš. Dáváš do setTimeoutu řetězec, nikoliv název funkce.
Pinqui
Profil
Když tam dám ovšem jen název funkce bez těch proměnných, tak mi to píše jen chybu a ty proměnné nemohu měnit. takže tu první možnost asi mohu vynechat. zkusím to ještě nějak přepsat na tu druhou, snad se mi to podaří.
_es
Profil
Pinqui
prvá možnosť znamená napríklad toto:
function f(){/* nejaký kód*/}
setTimeout(f, 10000);

Ak má funkcia f používať nejaké parametre, tak je možné použiť buď globálne premenné, alebo ak je f vnorená, tak premenné a parametre funkcie, v ktorej je f vnorená.
Chamurappi
Profil
Reaguji na Pinquiho:
Tu druhou variantu napsal _es asi trochu jinak než chtěl, měla by být takto:
setTimeout(function()
{
  tvojeFunkce(p1, p2 /* ... */);
}, 10000);
_es
Profil
Chamurappi
Napísal som to tak, ako som chcel, toto je skôr tretia varianta.
Je v nej o jednu funkciu viac, no za to zase môže byť o niečo prehľadnejšia.
Chamurappi
Profil
Reaguji na _es:
Napísal som to tak, ako som chcel
Nerozumím, proč uvádíš v té vnořené funkci argumenty, když s nimi nikdy zavolaná nebude. Po deseti sekundách se načasovaná funkce zavolá a p1, p2 /*, ... */ budou vždy undefined, ne?
_es
Profil
Chamurappi
Vlastne máš pravdu, no je to použiteľné:
Namiesto:
function(){var x, y, z; /*ďalší kód*/}
sa dá použiť skrátené:
function(x, y, z){/*ďalší kód*/}
No pre zakladateľa vlákna to asi nebola bez bližšieho vysvetlenia vhodná rada.
Tá druhá varianta v použiteľnejšom tvare by mohla byť:
setTimeout(function(p1, p2 /*, ...*/){/* kód funkcie */}, 10000, hodnota_p1, hodnota_p2, /*, ...*/);

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0