# Variabeln aktualisieren ohne 'location.reload()'



## Harryyy (21. April 2005)

Hallo zusammen, 

ich habe folgendes Problem:
auf der Wetter-Homepage www.wetter-wehr.de/harry.htm sollen die aktuellen Wetterdaten jede Minute neu geladen werden. Die aktuellen Daten werden permanent per FTP in eine 'Daten.js' Datei geschrieben, und momentan mit 'location.reload()' auch neu geladen. Das funktioniert problemlos, aber das Geflacker beim Screenaufbau geht mir auf die Nerven.

Ich hab nun eine Funktion geschrieben, die die Werte einzeln aktualisiert und hab nun logischerweise das Problem, dass dabei die neuen Daten aus 'Daten.js' ausgelesen werden.

Wie kann ich also die Daten aus 'Daten.js' lesen, ohne einen reload der ganzen Page durchzuführen?

Die Datei 'Daten.js' sieht wie folgt aus:

```
var sDatum = "21.12.2004"
  var sUhrzeit = "11:32"
  var sTemperatur = "1,0"
  var sLuftfeuchte = "64"
  var sLuftdruck = "1024,0"
  ...
```

Danke im Voraus,    Harry


----------



## con-f-use (21. April 2005)

Schlicht und einfnach: Gar nicht.

 Du müsstes dazu mit JavaScript lesezugriff auf Dateien auf einem anderen Sver haben und das ist schlicht nicht zu bewerkstelligen.

 Ich habe allerding mal eine Lösung über Cookies gesehen, weiß aber nicht mehr so ganz wie das ging. Die Lösung würde aber soweiso daran scheitern, dass du auf die js-Datei auf dem Wetter-Server keine Verfügung hast. Warum reicht dir nicht einfach ein statisches Wetter das nur bei Reload der Seite aktualisiert wird? So schnell ändert sich das Wetter ja nicht. Der User bleibt ja keine 2 Stunden auf deiner Seite ohne zu reloaden...


----------



## Sven Mintel (22. April 2005)

Nun ja.... es geht schon.

Die folgende Methode haut hin in IE,Geckos und Opera(in Konqueror nicht, andere hab ich nicht probiert)

Man erzeugt ein neues Skript-Element. Diesem weist man als src-Attribut die Adresse des besagten Skriptes zu. Damit dies auch wirklich neu geladen wird, hängt man nen Timestamp an die Adresse ran.
Dann hängt man diesen Knoten in das Dokument ein.... fertig.

Dass das Skript wirklich neu geladen wird, könnt ihr hier beobachten.

(Das Javascript, was da neu geladen wird, ist eigentlich ein PHP-Skript, welches den tutorials.de-RSS-Feed ausliest und den entsprechenden JS-Code ausgibt)

Wenns funktioniert, sollten da im Minutentakt die aktuellsten 20 Themen erscheinen...ohne die Seite selbst zu reloaden.

Der PHP-Code für das Skript, welches dieJS-Datei ausliefert:


```
<?php
header("content-type:text/javascript");

    function sc_ret($str)
    {
        $str=str_replace('&amp;amp;','&',$str);
        $tt = get_html_translation_table(HTML_ENTITIES);
        $tt = array_flip($tt);
        return strtr($str,$tt);
    }

$rss=file_get_contents('http://www.tutorials.de/external2.php?limit=20&orderby=lastpost');

preg_match_all('@<item>\s*<title>(.*)</title>\s*<link>(.*)</link>\s*<description><!\[CDATA\[(Forum:[^\r\n]+)[\r\n]+.*</item>@Us',$rss,$rss,PREG_SET_ORDER);


foreach($rss as $k => $v)
    {
        echo "\n".'if(document.getElementsByTagName("A").length<'.($k+1).')
                    {
                        div     = document.createElement("DIV");
                        space   = document.createTextNode("-");
                        space2   = document.createTextNode("-");
                        link    = document.createElement("A");
                        link.appendChild(space2);
                        link.setAttribute("target","popper");
                        div.appendChild(space);
                        div.appendChild(link);
                        document.getElementsByTagName("body")[0].appendChild(div);
                    }
                    
                    document.getElementsByTagName("DIV")['.$k.'].firstChild.data="'.addcslashes(sc_ret($v[3]),'"').': ";
                    document.getElementsByTagName("A")['.$k.'].firstChild.data="'.addcslashes(sc_ret($v[1]),'"').'";
                    document.getElementsByTagName("A")['.$k.'].setAttribute("href","'.$v[2].'");';
    }
?>
```


----------



## Harryyy (22. April 2005)

Hallo Sven,
interesante Sache, aber bei mir funktioniert das nicht (IE), Fehler bringt er aber auch keinen.   hier ist die Seite ... 
Alle 3 Minuten kommen neue Daten in die JS-Dateien, mit dem Button [><] kann man es von Hand auslösen (dann steht 'x' mit drin). Mit F5 macht er es natürlich.

Die Aufrufe habe ich wie folgt reingesetzt:

```
<SCRIPT LANGUAGE=JavaScript1.1 SRC="http://www.wetter-wehr.de/wetterdaten.js"></SCRIPT>
<SCRIPT LANGUAGE=JavaScript1.1 SRC="http://www.wetter-wehr.de/para/wetterdaten_para.js"></SCRIPT>
<SCRIPT LANGUAGE=JavaScript1.1 SRC="datenInTabelle_neu.js"></SCRIPT>

<script language="JavaScript">
<!--
function neueDaten()
{
	skript1 = document.createElement('SCRIPT');
	skript1.setAttribute('src', 'http://www.wetter-wehr.de/wetterdaten.js');
	document.getElementsByTagName('BODY')[0].appendChild(skript1);
	skript2 = document.createElement('SCRIPT');
	skript2.setAttribute('src', 'http://www.wetter-wehr.de/para/wetterdaten_para.js');
	document.getElementsByTagName('BODY')[0].appendChild(skript2);
	skript3 = document.createElement('SCRIPT');
	skript3.setAttribute('src', 'datenInTabelle_neu.js');
	document.getElementsByTagName('BODY')[0].appendChild(skript3);
	
//  ab hier werden die Textfelder neu ausgegeben
```


----------



## Sven Mintel (22. April 2005)

Bei mir funktioniert das auf deiner Seite....die Daten werden automatisch geändert(ich hab jetzt allerdings nicht geschaut, ob du irgendwo noch die ganze Seite reloadest).

Problem 1 





> Damit dies auch wirklich neu geladen wird, hängt man nen Timestamp an die Adresse ran.


...das fehlt bei dir. Je nach Caching-Einstellung des Browsers kann dies bedeuten, dass er nicht die aktuellen Skripte lädt, sondern sie aus dem Cache holt.

Problem 2: die Daten sind im Zweifelsfall 3 Minuten älter.
Der Browser brauch ein wenig Zeit, um die Skripte zu laden... du greifst aber sofort darauf zu.
Gebe dem Skript ein wenig Zeit, bis es die neuen Daten einträgt.
Der Browser braucht natürlich ein wenig Zeit, um


----------



## Harryyy (22. April 2005)

Ich hab jetzt folgendes gemacht:
- den Interval deaktiviert (war vorher drin)
- aktiviere es über den Button
- dann werden die 2 JS-Dateien neu geladen und per Timeout() die Ausgabe nach 5 Sekunden gestartet (eine Nr. wird in der Ausgabe hochgezählt)

Zum Testen ändere ich über FTP die Werte in der JS-Datei, Klick auf den Button [> <], dann sollte er nach 5 Sekunden den neuen Wert anzeigen - aber nix ändert sich außer der laufenden Nummer.

Vielleicht hab ich irgend 'ne Kleinigkeit übersehen, oder es geht so doch nicht


----------



## Sven Mintel (23. April 2005)

Harryyy hat gesagt.:
			
		

> Vielleicht hab ich irgend 'ne Kleinigkeit übersehen, oder es geht so doch nicht


Naja...meinen Hinweis auf den Timestamp versuchst du zumindest beharrlich zu ignorieren

Ich hab dein Skript mal adoptiert.... und die Daten werden aktualisiert--> http://doktormolle.de/temp/wetter.htm (immer wenn die Überschrift rot wird, wird das neue Skript geladen... wenn sie wieder weiss wird, werden die neuen Daten eingelesen).

Ich hab das  mit IE, Mozilla und Opera gleichzeitig probiert... alle übernehmen die neuen Daten.

Allerdings haut eines nicht hin... der FTP-Upload scheint (zumindest momentan) nicht alle 3 Minuten zu erfolgen, sondern eher alle 10 Minuten.


----------



## Harryyy (28. April 2005)

Hallo Sven,
muss doch grade mal ein Dankschreiben aufsetzen, denn das updaten funktuiniert nun prima.
Wo wären wir blos ohne solch klugen Köpfe die sich auch nicht scheuen, sich in den Dienst anderer zu stellen. Danke für deinen Einsatz an Zeit und Gehirnschmalz, meiner hat dazu ja nicht ausgereicht.


----------



## fanste (10. Mai 2005)

sally,

Hab zu diesem skript noch eine Frage. Kann man auch nur Beiträge von bestimmten Foren anzeigen lassen?
Gewünscht wären da die Beiträge aus den Forn PHP,HTML und Javascript.
geht das?

mb fanste


----------



## Sven Mintel (11. Mai 2005)

Wer ist sally?
Falls du mich und den tutorials.de-RSS-Feed meinst, die entsprechende Adresse lautet:
http://www.tutorials.de/external2.php?forumids=43,22,8&=limit=20&orderby=lastpost

Übrigens: in Kürze gibts nen kleines Tutorial zu einem RSS-Newsreader mit Javascript.
Das  funktioniert richtig gut zwar nur mit dem IE, kann man aber bspw. prima auf dem Win-Active-Desktop einsetzen.

Bei mir läufts schon.....


----------



## fanste (11. Mai 2005)

1. Sally sagt man bei uns zu Hallo. Baer nur wenn man grad lust hat.
2. Danke für die schnelle antwort. Die Forum IDs bekomm ich doch oben aus der Adresszeile heraus, oder? Da steht dann immer drin http://www.tutorial.de/forum8 oder so.
mb fanste


----------



## Sven Mintel (12. Mai 2005)

Genau...einfach mit Komma getrennt in die Adresse einfügen...fertsch.


----------



## sven81 (4. Mai 2006)

Hallo zusammen,
ich habe mir das Beispiel angesehen. So etwas habe ich schon lange gesucht, kann mir denn jemand sagen, ob es möglich ist dies auch so zu ändern, dass es mit unterschiedlich viele Daten zurecht kommt und eine Tabelle baut?
z.b:
<table><tr>
      <td>Liga</td>
      <td>Spiel</td>
      <td>Ergebnis</td>
</tr>

<tr>
      <td>Bundesliga</td>
      <td>Schalke gegen München</td>
      <td>1:0</td>
</tr>
usw.usw......
</table>

Ich habe schon probiert den gesamten Tabellen-String einfach zu übergeben, nur leider werden die HTML Tags angezeigt und nicht ausgewertet, wenn in der js Datei z.b. var sSpiel="<tr><td>......" steht.

Weiss jemand Rat?
Danke


----------



## Sven Mintel (4. Mai 2006)

woher kommen denn die Daten?


----------



## sven81 (4. Mai 2006)

Aus einem Java-Programm, ich dachte es ähnlich wie die Lösung oben zu gestalten, indem ich die Daten in eine Datei schreibe und durch das Javascript auswerten lasse. Wenn's natürlich eine einfachere Methode gibt, wäre es auch kein Problem die Daten anders zur Verfügung zu stellen. Kann's ja leicht anpassen.


----------



## Sven Mintel (5. Mai 2006)

die einfachste Variante wäre, wenn du da mit XMLHttpRequest arbeitest.
Dein JAVA-Programm erstellt auf dem Server die Datei, in der der komplette HTML-Code für die Tabelle steht, und ein Javascript fragt dann in Intervallen diese Datei ab und gibt ihren Inhalt in der Seite aus...das wäre schon alles


----------



## sven81 (5. Mai 2006)

Danke für die Antwort, aber wie mache ich ein XMLHttpRequest über Javascript? Wenn Du mir nur ein abstraktes Beispiel geben könntest wäre ich Dir sehr dankbar, bin in Javascript nicht so eingeartbeitet.


----------



## Sven Mintel (5. Mai 2006)

http://www.tutorials.de/forum/javascript/212746-nach-confirm-eine-php-funktion-aufrufen.html

Da wird eine Anfrage an ein PHP-Skript gesendet, und die Antwort per JS-alert() ausgegeben.
Der PHP-Teil der Sache ist dabei für deine Zwecke unwichtig, der Server antwortet bei dir dann halt mit dem, was du per JAVA in die Datei geschrieben hast, du musst es dann nur noch im Dokument ausgeben


----------



## sven81 (5. Mai 2006)

Danke für den Link, es funktioniert jetzt wie ich es mir gedacht habe. Lasse jetzt den kompletten Code und die Daten in eine Datei schreiben, die sich dadurch wieder aufruft. Danke nochmal.


----------

