JavaScript Wenn Variable leer dann dies sonst das!

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi Leute

Ich habe mir folgendes kleines Script gebastellt, funktioniert
soweit auch gut.
Jetzt möchte ich es aber noch so haben das, wenn
$js leer ist soll der Refresh nach 5 Sekunden erfolgen,
sonst wenn $js nicht leer ist, dann halt normal alle 50 Sekunden ein Refresh.

Doch irgendwie schaffe ich das nicht, habe diverses versucht doch
bekomme nonstop Syntax Fehler um die Ohren gehauen.

PHP:
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var tempjs = "<?php echo $js; ?>";
  $(document).ready(function() {
    $('#now').load('datei1.tmp.php');
       var refreshId = setInterval(function() {
          $('#now').load('datei1.ajax.php?' + 1*new Date());
       }, 50000);
    });
//]]>    
</script>

Die Datei *.temp.php wird beim ersten Start geladen und hat einen anderen Inhalt als *.ajax.php welche dann nach 50 Sekunden nonstop rotiert.

Ich möchte also, wenn $js leer ist, dass das ganze nach 5 Sekunden nochmal geladen wird, also solange bis halt $js Inhalt hat.
Dabei soll aber wenn $js leer ist nur die *.tmp.php geladen werden, die *.ajax.php nur wenn in $js Inhalt vorhanden.

Danke.
 
so?
Code:
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var tempjs = "<?php echo $js; ?>";
  $(document).ready(function() {
    $('#now').load('datei1.tmp.php');
       var refreshId = setInterval(function() {
          $('#now').load('datei1.ajax.php?' + 1*new Date());
       }, [COLOR="Red"]$js==null?5000:50000[/COLOR]);
    });
//]]>    
</script>
 
Syntaxfehler ? var tempjs muss da glaube ich hin!?
Ne auch nicht, man das gibt es nicht :D

Habs, da muss doch tempjs hin, nur ein Problem gibt es hier auch.
Ist tempjs nicht leer dann wird *.temp.php bis zum Refresh gehalten, das soll es aber nicht,
es soll die *.ajax.php geladen werden.

Nochmal, ist tempjs leer, neuladen bis Inhalt vorhanden, ist inhalt vorhanden, sofort *.ajax.php laden.

Jetzt ist es so das, wenn Inhalt vorhanden erst 50 Sekunden gewartet wird und dann erst wird
*.ajax.php geladen.
Ergänzung ()

Geht nicht, ich werd zum Elch. Das Problem ist, die *.ajax.php ändert eine Variable aber ich kann per JavaScript nicht deren Status herausbekommen um dann halt zu reagieren. Jetzt ist es so das das JS nur auf den Status der Variable reagiert in dem das JavaScript ausgeführt wird. Mist.
 
Zuletzt bearbeitet:
ups, ich mag die Object Notation nicht ^^

ich habe das jetzt so verstanden: wenn tempjs leer, dann soll tempjs alle 5s auf Änderung abgefragt werden, *.tmp.php wird alle 50s aktualisiert. Wenn diese Änderung eintritt, *.ajax.php nochmal laden und ab sofort nur noch zusammen mit *.tmp.php alle 50s laden.

Ich habe das in zwei Abschnitt eingeteilt der erste lädt immer datei1.tmp.php und datei1.ajax.php nur, wenn tempjs nicht leer ist. Der zweite abschnitt lädt alle 5s datei1*ajax.php, solange tempjs leer ist und schaltet sich danach ab, da der erste Abschnitt ja den 50s-Takt hat.

Code:
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var tempjs = "<?php echo $js; ?>";
  $(document).ready(function() {
	var refreshIdTmp,refreshIdAjax;
	
	refreshIdTmp = setInterval(
		function() 
		{
			//lade *.tmp.php immer
			$('#now').load('datei1.tmp.php'); 
			//lade *.ajax.php nur, wenn tempjs nicht leer
			if(tempjs!=null)$('#now').load('datei1.ajax.php?' + 1*new Date()); 
		}
		, 50000); //50s-Intervall
		
	refreshIdAjax = setInterval(
		function() 
		{
			//lade *.ajax.php immer
			$('#now').load('datei1.ajax.php?' + 1*new Date()); 
			//wenn tempjs nicht mehr leer, deaktiviere dich selbst
			if(tempjs!=null)window.clearInterval(refreshIdAjax); 
		}
		,5000);
    });
//]]>    
</script>
 
Danke, doch genau so hatte ich das auch schon mal.

Funktioniert nicht, ich versuche dir jetzt mal das ganze richtig zu erklären..vergiss alles da oben, richte dich jetzt mal auf das folgende... eventuell siehst du dann wo das Problem liegt, ich vermute nämlich dass das was ich vorhabe garnicht machbar ist..


Ich habe zwei Dateien..

datei1.inc.php + date1.ajax.php

Beide habe den selben Inhalt "php-Code", mit der einzigen Ausnahme das datei1.inc.php noch den JS-Code beinhaltet.

datei1.inc.php wird gestartet, wenn der Klient JS kann wird sofort datei1.ajax.php durch den JS-Code geladen.
So, und ich muss jetzt quasi eine Variable aus der datei1.ajax.php mit dem JS-Code aus datei1.inc.php abfragen und dann den Interval so setzen das, wenn $var in *.ajax.php leer dann die *.ajax.php nach 5 Sekunden neu laden, wenn die $var aber Inhalt hat dann soll die *.ajax.php erst in 50 Sekunden neu geladen werden.

datei1.inc.php ist hier quasi Statisch wenn man im Browser nicht aus refresh klickt, die $var ändert sich hier ja nicht sondern in der *ajax.php die das Script ja im Interval immer neu lädt, also muss ich mit dem JS-Code aus date1.inc.php die $var in *ajax.php abfragen und den Interval dann setzen wie es passt.

Wenn $var leer ajax.php nach 5 Sekunden neu laden, ist $var nicht leer, *.ajax.php nach 50 Sekunden neu laden.
Die $var muss ich aus *.ajax.php rausziehen.

Habe etliches ohne Erfolg verusucht, vermute das es garnicht nicht geht?

Hier das nochmal als Dateien..

datei1.inc.php

PHP:
<?php
 
 echo '<div id="now">'."\n";
 echo '<p>Hier kommt der Inhalt aus *.datei1.ajax.php rein<p>'."\n";
 echo '</div>'."\n";
 
?>
 
<script type="text/javascript" charset="utf-8">
//<![CDATA[
 $(document).ready(function() {
    $('#now').load('datei1.ajax.php');
       var refreshId1 = setInterval(function() {
          $('#now').load('datei1.ajax.php?' + 1*new Date());
       }, 50000);
    });
//]]>    
</script>

datei1.ajax.php

PHP:
<?php
...
......
 
//hier dachte ich dann, das ich hier die Variable für den Js-Code in datei1.inc.php setze, also $js und diese muss abgefragt werden nur leider ..... geht nicht.
 
if(empty($mytext)) {
$js = "";
} else {
$js = "set";
}
 
 echo '<p>Ich habe nicht immer Inhalt und muss hin und wieder öfter geladen werden bis ich Inhalt habe!<p>'."\n";
 
?>
 
habe ich das richtig verstanden, dass du in der datei *.ajax.php ein Skript hast, was die Variable $var verändert und dies willst du in einem Skript in *.inc.php abfragen?

Ich glaube das ist wirklich nicht möglich. Nach meinem Verständnis sind die HTML-Seiten beides eigene Namensräume, und der Zugriff ist dort glaube ich nicht gestattet - ich weiß zumindest keinen Weg. Ich habe mir hier mal ein Testszenario aufgebaut und eine Datei mit Javascriptcode in eine andere Datei geladen - der Javascriptcode wird zwar ausgeführt aber die Kontexte sind zwei verschiedene (zwei variable mit derselben Bezeichnung müssen in beiden Kontexten deaklariert werden und sind dann auch zwei getrennte Variable)

Ist der Zweck dieser Variablen eigentlich zu prüfen ob Javascript ausgeführt wird oder etwas anderes?
 
In der *.ajax.php existiert eine $mytext Variable, diese wird durch den PHP Code mit Text gefüllt, ist aber hin und wieder leer.
Ich prüfe dann mit php ob diese $mytext Inhalt hat, wenn nicht setze ich $js = ""; was dem JavaScript aus datei1.inc.php sagen soll das $mytext leer ist.

Der JS-Code in datei1.inc.php soll also auf die $js reagieren und dementsprechend den refresh Interval setzen, wenn $js = leer dann die *.ajax.php nach 5 Sekunden neuladen, denn meistens ist dann $mytext mit Inhalt gefüllt weil dieser von extern geholt wird und es beim 2-3 Versuch dann klappt.

Wenn aber Inhalt von vornerein existiert dann soll der JS-Code die ajax.php erst nach 50 Sekunden neuladen.

Kann man denn nicht in *.ajax.php auch noch einen kleinen JS-Code reinschreiben der z.B. den Status der $js dann an das JavaScript in datei1.inc.php sendet?

Anders ist die Sache nicht zu lösen. So wie es jetzt funktioniert, funktioniert es zwar nur habe ich den Nachteil das wenn $mytext leer ist, es 50 Sekunden dauert bis die *.ajax.php neu geladen wird und dann Inhalt exisitert oder wenn man Pech hat ist die $mytext dann auch wieder leer. Es dauert also immer 50 Sekunden, soll es aber nicht wenn $mytext leer ist.
 
Belee schrieb:
Kann man denn nicht in *.ajax.php auch noch einen kleinen JS-Code reinschreiben der z.B. den Status der $js dann an das JavaScript in datei1.inc.php sendet?

genau dieser Teil funktioniert nicht. in den Javascript-Bereichen der *.ajax.php kannst du deklarieren was du willst, in der *.inc.php sind diese Deklarationen unbekannt und somit nicht gültig.

Der einzige Weg ist - denke ich - dies über das PHP-Sript zu machen. anhand von Session-IDs kannst du ja die Zusammenhänge der beiden Datei herstellen und die Daten der Skripte sinchronisieren (über glbale Variable oder so). Auf der HTML/JS-Ebene sind die Dokumente, die aus der *.ajax.php und der *.inc.php produziert werden vollständig unabhängig. Du lädst zwar ein (Teil-)Dokument in ein anderes herein, aber offentsichtlich trennen der Browser die beiden Dokumentenumgebungen. Ich denke das ist ein Sicherheitsproblem, wenn man den Zugriff zulassen würde. Einzig der Zugriff auf die Javascript-Engine würde eine solche Kommunikation ermöglichen - welcher verständlicherweise aus Sicherheitsgründen auch verboten ist. Diesen Zugriff hat man aber nur, wenn man den Browser programmiert und nicht die Inhalte.

Vielleicht irre ich mich ja auch und es gibt einen verqueren Weg für diese Cross-Document-Kommunikation. Leider kenne ich diesen Weg dann aber auch nicht, sorry :(


edit:
was mir gerade noch einfällt: du könntest in der *.ajax.php eine HTTP-GET-Anforderung an den Server stellen, die ein spezielles PHP-Skript startet, was genau diesen Transfer der Daten bewerkstelligt (per URL-Parameter) - auch hier dann per global ins Script *.inc.php importiert. Wie gesagt, ich glaube es geht nur auf PHP-Ebene
 
Zuletzt bearbeitet:
Hmm..
Könnte man denn nicht in der *.ajax.php ebenfalls ein JS-Code setzen welcher dann den Status von
$js prüft und wenn die Variable leer ist, die Seite neulädt?
 
Benutz doch statt $.load() $.ajax() und verarbeite die Ausgabe des Ajax-Skripts dann mit einer eigenen Funktion.
 
Zurück
Oben