Autor Zpráva
fiona
Profil *
Ahoj , chtěla bych se zeptat:

2. Na stránce mám blok s textem a ten bych chtěla udělat tak aby se mi po 30s změnil na jiný. Textu budu mít asi pět, mám je uložené v databázy a tak bych potřebovala poradit tím náhodným zápisem a změnou.

Děkuji
TomasJ
Profil
no náhodný zápis umím pouze s Array (přes databázi ne)
takže:
<html>
<head>
<script type="text/javascript">
var vety = new Array("Prvni veta.","Druha veta.","Treti veta.","Ctvrta veta.","Pata veta.");
function NahodnaVeta(input)
{
var rand = Math.floor(Math.random()*input.length);
document.getElementById("Veta").innerHTML=input[rand];
setTimeout("NahodnaVeta("+input+")",10000);
}
</script>
</head>
<body onload="NahodnaVeta(vety);">
<span id="Veta"></span>
</body>
</html>


Tohle vypíše náhodnou větu do předem určeného ID. Testovací interval je 10 sekund
EDIT: Omlouvám se, bohužel script nemění věty. Někde je tam chyba, ale nevím kde.
Witiko
Profil
To teda sakra je.

setTimeout("NahodnaVeta("+input+")",10000);


Kromě toho, že jde o hrozivý zápis (proč jde o hrozivý zápis), tak pole jednoduše nelze napojit na textový řetězec. Jde o objekt, ne o jednoduchý datový typ, jakým je například textový řetězec. Tedy:

<html>
<head>
<script type="text/javascript">
var vety = [<? php kód, který vygeneruje pole ve formátu "Prvni veta.", "Druha veta." ... ?>],
    element;
    
function NahodnaVeta() {
  element.innerHTML=input[Math.floor(Math.random()*input.length)];
}

window.onload = function() {
  element = document.getElementById("veta");
  NahodnaVeta();
  setInterval(NahodnaVeta, 30000);
}
</script>
</head>
<body>
<span id="veta"></span>
</body>
</html>
TomasJ
Profil
Reaguji na Witiko:
No nebudu se hádat, nicméně funkce stylu
setTimeout("NahodnaVeta("+input+")",10000); 

používám běžně a vždy fungují, až na tento příklad.
Witiko
Profil
Ne pokud je input pole, jde o objekt, ne o řetězec. Vzhledem k tomu, že by měl být (ačkoliv bych neřekl, že dle dokumentace MUSÍ) převeditelný do určité míry na prostý text, tak by teoreticky fungovalo toto:

setTimeout("NahodnaVeta(["+input+"])",10000); 


Jelikož objekt pole po převodu na řetězec navrátí něco takovéhleho:

String([1,2,3]) == "1,2,3"


Nicméně jak už jsem říkal jde o velmi nehezký zápis, nemluvě o tom, že při každém vytvoření nového intervalu se musí vytvořit zcela zbytečně anonymní nová funkce (která se převede ze zadaného řetězce) a zcela nová instance objektu Array.
TomasJ
Profil
Reaguji na Witiko:

Aha děkuji za opravu. Nebo spíš za informaci.
Witiko
Profil
Jak jsem poupravil s malým přípisem to jde, nicméně stále je mnohem lepší použít takovýto typ zápisu:

setTimeout(function() {
  NahodnaVeta(input);
},10000); 


Prohlížeč si řetězec stejně musí přežvýkávat zadaný text na funkci, tak proč mu tím přidělávat práci, zvlášť když se dá s definicí funkce dělat mnohem víc.
fiona
Profil *
Tak jsem zkusila tento script[#3] Witiko al ehlasi mi to chybu v osmem radku :
element.innerHTML=input[Math.floor(Math.random()*input.length)];


Jinak do řadku: var vety jsem upravila takto:
var vety = <?php echo json_encode($vzkaz)?>;
je to tak spravne kdyz vypis z db mam takovy to:

$db=mysql_query("select vzkaz from vety, $link) or die('Error: '.mysql_error ());
while ($zaznam=MySQL_Fetch_Array($db)) 
$vzkaz[] = htmlspecialchars($zaznam["vety"], ENT_QUOTES);
Witiko
Profil
Ano, takhle je to správně, nehcal jsem tam omylem část kódu od TomasJ:

element.innerHTML=vety[Math.floor(Math.random()*vety.length)];
fiona
Profil *
Tak takto mam celý svůj kód a ted mi to hlasí chybu že element má hodnotu null nebo není objekt:

<?php include "config.php";?>
<?php
$db=mysql_query("select text from title", $link) or die('Error: '.mysql_error ());
while ($zaznam=MySQL_Fetch_Array($db)) 
$vzkaz[] = htmlspecialchars($zaznam["text"], ENT_QUOTES);
?>

<html>
<head>
<script type="text/javascript">
var vety =  [<?php echo json_encode($vzkaz)?>],
    element;
    
function NahodnaVeta() {
element.innerHTML=vety[Math.floor(Math.random()*vety.length)];
}

window.onload = function() {
  element = document.getElementById("veta");
  NahodnaVeta();
  setInterval(NahodnaVeta, 30000);
}
</script>
</head>
<body onload="NahodnaVeta(vety);">
<span id="veta"></span>
</body>
</html>
radvis
Profil
Sry, blbě přčtena věta
fiona
Profil *
To mi normálně vypíše ty data v poli, ale ta chyba v tom scriptu tam je pořád
Witiko
Profil
Překlad do toho jsonu tam už přidá i ty závorky, však?

Takže:
var vety =  <?php echo json_encode($vzkaz)?>,
fiona
Profil *
Ne ne pořád to samé
Uknown
Profil *
A proč máš "NahodneVety(vety) v onloadu když to stejně v té funkci tu "proměnnou" nemáš a jak je SetInterval, nemá tam být "setInterval("NahodnaVeta()", 30000);" ?
_es
Profil
fiona:
z <body> zmaž atribút onload. Ten sa "bije" s tým onloadom v skripte.
Witiko
Profil
Bzi, já ho zapomněl odmazat. -_-

fiona:
Pokud to stejně nepůjde, tak poprosím o živou ukázku. Nehodlám už si pronajímat kříšťálovou kouli.

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:

0