Autor Zpráva
lukas889
Profil
Řeším jeden zapeklitý problém.

Mám web, kde se mi vypisují zprávy. A rád bych měl v hlavičce počet nových zpráv - pravidelně aktualizovaných. V hlavičce - tj. v <title>0 nových zpráv</title>. Počet si zjistím přes skript z mysql, to není podstatné. Jde o to, aby se aktualizovala jen ta hlavička, nikoli celá stránka.

Jedná se mi o to, jak udělat stránku, aby se mi hlavička aktualizovala, cca. každých 30 vteřin. Aniž bych musel aktualizovat celou stránku - tj. kde budu mít třeba rozepsaný text nebo tam budu zrovna číst tu zprávu... Protože pak bych o to přišel a strana by se aktualizovala celá. ( přes <META http-equiv='refresh' content='300;url=index.php'> )

Myslel jsem, že bych to udělal přes rámy (frames), čímž docílím toho, že se aktualizuje jeden rám (zahlavi.php) a hlavný rám (vypis.php) zůstane beze změny. Jenže v hlavičce se mi vypíše title ze souboru index.php a ne z toho rámu, který se aktualizuje (zahlavi.php). Ani když do index.php nedám title, tak se pak nevypíše nic, žádný hlavička...

Má to tak třeba seznam.cz :-)
Arcturus
Profil
Pomocí Ajaxu získáš data a Javascriptem aktualizuješ obsah titulku.
lukas889
Profil
Díky za radu, taky jsem si myslel, že na to bude ajax a javascript, jenže v tom ještě tak trochu tápu, nejsem žádnej zkušenej programátor... Nešlo by poradit jakou funkcí se javascriptem aktualizuje obsah titulku a jakou funkcí z ajaxu získat data z dtb mysql ? si to pak nastuduju už na netu ty funkce a přizpůsobím si je :)
Arcturus
Profil
Na programujte.com je dobrý článek o Ajaxu:
http://programujte.com/index.php?akce=clanek&cl=2008071702-ajax-%96-4- lekce
(Je to odkaz na 4. lekci, pravděpodobně si budeš muset přečíst i předchozí lekce, aby jsi to dokázal sestrojit.)

a javascriptem změníš titulek:
document.title = titulek;  //do proměnné titulek vložíš hodnotu získanou ajaxem
lukas889
Profil
Tak tápeme dál :-)

Vytvořil jsem php soubor, který by měl zjišťovat údaje - phpscript.php

----------------- phpscipt.php ------------------------
<?php
$link=mysql_connect("server","jmeno","heslo")
or die("Could not connect\n"); mysql_select_db("moje_dtb") or die("Could not select database");

$vystup = @mysql_num_rows(mysql_query("SELECT DISTINCT * FROM zpravy "));
?>
----------------------------------------------------------

A pak mám hlavní dokument

---------------- index.php ----------------------------

<html><head>
<script language="JavaScript" type="text/javascript">

var xhr = vytvorXHR();

function vytvorXHR(){
var xhr;
try{
xhr = new XMLHttpRequest();
}catch(e){//pro případ starší verze prohlížeče
var MSXmlVerze = new Array('MSXML2.XML.Http.6.0','MSXML2.XML.Http.5.0','MSXML2.XML.Http.4.0 ','MSXML2.XML.Http.3.0','MSXML2.XML.Http.2.0','Microsoft.XML.Http');
for(var i = 0; i < MSXmlVerze.lenght; i ++){
try{
xhr = new ActiveXObject(MSXmlVerze[i]);
alert(MSXmlVerze[i]);
}catch(e){
//vzniklou chybu ignoruji a pokračuji nastavením další verze
}
}
}
if(!xhr)
alert("Došlo k chybě při vytváření objektu XMLHttpRequest!");
else
return xhr;
}

function prectiSoubor(){
if(xhr){
try{
xhr.open("POST","phpscript.php",true);
xhr.onreadystatechange = ctiOdpoved;
xhr.send(null);
}catch(e){
alert("Nelze se připojik k serveru:\n" + e.toString());
}
}else{
alert("Funkce \"precitSoubor()\": chybí objekt XMLHttpRequest");
}
}

// PŘEDPOKLÁDÁM ŽE PROBLÉM BUDE NÍŽE :-)

function ctiOdpoved(){
if(xhr.readyState == 4){
if(xhr.status == 200){
try{
var XMLRes = xhr.responseXML;
//zachycení chyb IE a Opery
if(!XMLRes || !XMLRes.documentElement){
throw("Chybná struktura XML:\n"+xhr.responseText);
}
//zachycení chyb ohnivé lišky :-)
var rootNodeName = XMLRes.documentElement.nodeName;
if(rootNodeName == "parsereerror"){
throw("Chybná struktura XML:\n"+xhr.responseText);
}
//čtu dokument, jelikož je vše ok :-)

var vystup ="";

}catch(e){
alert("Chyba při čtení odpovědi:"+e.toString());
}
}else{
alert("Požadavek HTTP není v pořádku.")
}
}
}

</script>

<script language="JavaScript" type="text/javascript">

document.title=vystup;

</script>

</head></html>
----------------------------------------------------------

Nebo jsem vedle a dělá se to úplně jinak ? :-)
Arcturus
Profil
Nejsem si jistý jestli to vůbec funguje (mělo by), ale je to zjednodušená úplněně neošetřená verze.
zkus to takto:

zpravy.php
<?php
  mysql_connect("server", "uzivatel", "heslo");
  mysql_select_db("databaze");

  $pocet = mysql_num_rows(mysql_query("SELECT novezpravy FROM zpravy"));
  echo "<pocet>". $pocet ."</pocet>;

  header("Content-type: text/xml");
?>


index.html
<html>
<head>
  <title>Vítejte</title>
</head>

<body>
<script>
dotaz = new XMLHttpRequest();

function pozadavek()
{
  dotaz.open("POST","zpravy.php");  
  dotaz.onreadystatechange = cteni;
  dotaz.send(null);
}

function cteni()
{
  if(dotaz.status == 200)
  {
    vysledek = dotaz.responseXML;
    xmlRoot = XMLRes.documentElement;
    pocet = xmlRoot.getElementsByTagName("pocet");

    document.title = "Máme "+ pocet +" nových zpráv";
  }
}
</script>
</body>

</head></html> 


Snad to rozchodíš.
lukas889
Profil
Dík za snahu, ale bohužel to nechodí... Píše to pořád jen Vítejte, i když přidávám do dtb zprávy... No nic, podívám se na to zas ráno a uvidím :-) zkusím to tvým způsobem, prohledat přes net a třeba na to přijdu :) až na to přijdu, napíšu sem konečnou verzi, kdyby vás někoho něco napadlo, tak šup sem s tím :-) díky...
Jack Finger
Profil
lukas889
Nevím, jestli Ti to pomůže, ale šel by použít nějaký JS framework, např. jQuery nebo script.aculo.us. Já používám jQuery, jsem spokojen, Tvůj JS kód by vypadal takto:
...
<script type="text/javascript">
  function CheckMessages(){
    $.ajax({
      type: "POST",
      url: "zpravy.php",
      success: function(html){
        document.title = "Máme "+ html +" nových zpráv";
      }
    });
    setTimetout("CheckMessages()", 30000);
  }
</script>
...
<body onload="CheckMessages()">
...
lukas889
Profil
JackFinger, dík za radu, ale tvůj script mi v IE háže výstražný trojúhelník, ve Firefox sice ne, ale stejně to nejde :(
Jack Finger
Profil
lukas889
No, a co to hlási?
lukas889
Profil
Na zobrazované stránce nastaly potíže, a je proto možné, že nebude zobrazena správně nebo nebude fungovat. Tuto zprávu můžete v budoucnu zobrazit poklepáním na ikonu upozornění ve stavovém řádku.

V podrobnostech je:

Chyba 0: $ není definováno
Jack Finger
Profil
lukas889
No jo, jenže ty tam musíš taky nějak vložit ten framework, více na jquery.com.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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