[JS|PHP] Ist JS aktiv oder nicht - in Session speichern

justme69

Im RL-Dauerstress
ID: 99452
L
25 April 2006
676
13
Hallo zusammen,

ich verzweifle...

Ich habe ein JS-Script, das mir anhand der Client-Auflösung ein Stylesheet auswählt - funktioniert.

Gleichzeitig lassse ich mir von diesem Script über JS auch ein Cookie anlegen, damit ich in PHP dann anhand des Cookies prüfen kann ob JS aktiv ist oder nicht.

Das JS-Script läuft im SeitenHeader-Teil.

Das PHP-Skript das auf Existienz dieses Cookies prüft - läuft ebenfalls im Header.

Allerdings rafft PHP erst nach erneutem Aufrufen der Seite (Reload), das von JS das Cookie bereits gesetzt ist. Wenn ich mir nach dem ersten Aufrufen der Seite (Cookies vorher gelöscht) die Cookies anzeigen lasse - sehe ich dat Teil das von JS geschrieben wurde. Der PHP-Teil reagiert allerdings so, als sei das Cookie nicht gesetzt...
Ich möchte dann die Info ob JS aktiv ist in der Session mit abspeichern.

Wie bekomme ich es hin, das ich beim ersten Seitenaufruf kontrollieren kann ob JS aktiv ist oder nicht. Es in eine Session-Variable packe und damit weiterarbeiten kann.
Die JS-Konsole gibt keinerlei Warungen/Fehler aus. Der Seitencode ist W3C valide und das CSS auch.

Habe es mit IE6 und Opera 9.51 getestet - in beiden Browsern reagiert PHP erst nach wiederholtem Aufruf der Seite wie gewünscht.

Werde heut abend noch Stücke vom Code einfügen, habe diese hier gerade nicht parat.

Für Ideen/Anregungen bin ich dankbar ;-)
 
Zuletzt bearbeitet:
du musst erstmal verstehen wie das funktioniert:

  1. PHP-Aufruf: Die Seite wird ausgegeben und es existiert kein Cookie, weil der User das erste mal die Seite aufruft und somit JavaScript noch nie lief
  2. JavaScript: Die PHP-Anwendung hat also die HTML-Seite ausgegeben und auch das JavaScript. Jetzt kann das JavaScript ein Cookie setzen.
  3. PHP-Aufruf: Der User hat einen Link geklickt und ruft damit eine neue Seite auf, dementsprechend wird ein PHP-Script ausgeführt und PHP hat nun die Variable von JavaScript
 
Nun, bin ich zwar nicht ganz mit einverstanden, da die Seite nicht nur über php aufgebaut wird - aber lasse ich mal so stehen.

Dann allerdings die Frage - wie kann ichs sonst machen ?

Von der Frage ob JS aktiv ist oder nicht - sind einige andere Daten abhängig.
ZB ob Bilderlinks sich im Popup öffnen oder in einer neuen Seite. Diese Bilderlinks werden aus der DB per php ausgelesen und dort entschieden, wie der Link aufgebaut wird...

Andere gangbare Lösungen ? Her damit

Ich glaub's zwar nicht - aber kann ich von JS aus Session-Werte setzen/ändern ? Wenn ja - wie ?
 
Zuletzt bearbeitet:
Andere Lösung wäre einfach mittels Javascript eine PHP Datei nachladen, die speichert das JS aktiv ist.

Und zu deinem oben aufgeführten Beispiel mit den Bildern... dazu muss man nicht wissen ob JS aktiv ist. Das geht ganz simpel:

PHP:
<a href="deinbild.jpg" target="picturewindow" onclick="window.open('about:blank','picturewindow',..)">Bild</a>
 
ZeroCCC schrieb:
Andere Lösung wäre einfach mittels Javascript eine PHP Datei nachladen, die speichert das JS aktiv ist.
Ähm.. wie das ?

ZeroCCC schrieb:
Und zu deinem oben aufgeführten Beispiel mit den Bildern... dazu muss man nicht wissen ob JS aktiv ist. Das geht ganz simpel:
Werd ich mir anschauen - wie gesagt, die Bilder, Links werden erst aus der DB geladen.
 

Vielleicht damit:

ajax-for-developer.jpg



:roll:
 
Andere Lösung wäre einfach mittels Javascript eine PHP Datei nachladen, die speichert das JS aktiv ist.

Zwar kannst sowas mittels ajax lösen, aber das verhindert ja nciht das problem, das erst nach dem ersten aufruf bekannt ist, das JS aktiv ist.
Der request erfolg ja nachdem die webseite aufgebaut wurde.

Er will aber ja im grunde vor dem aufbau der Seite es wissen...
 
Er will aber ja im grunde vor dem aufbau der Seite es wissen...

:ugly: Alles klar... habs nicht ganz realisiert was er wollte. Von wegen Javascript vom Browser ausführen lasse obwohl der Browser die Seite noch gar nicht geladen hat ist ein bissel fremd für mich.

Man könnte es zwar mit einer Weiterleitung beim Einstieg machen... aber sauberer und eigentlich einfacher ist es die Seiten so zu gestallten dass sie mit JS und ohne JS funktionieren.
 
Seite aufrufen, wenn kein Cookie existiert Cookie auf "kein JS" setzen, per js den cookie auf "JS vorhanden" setzen.
 
Seite aufrufen, wenn kein Cookie existiert Cookie auf "kein JS" setzen, per js den cookie auf "JS vorhanden" setzen.
Genau das funktioniert nur, wenn die Seite erneut geladen wird. PHP erkennt beim ersten Aufruf nicht das Cookie von JS, welches aber gesetzt ist.
 
Man könnte es zwar mit einer Weiterleitung beim Einstieg machen... aber sauberer und eigentlich einfacher ist es die Seiten so zu gestallten dass sie mit JS und ohne JS funktionieren.
Genau das ist mein Ziel - die Seite mit und ohne JS sauber haben. PHP erkennt leider beim Erstaufruf nicht das von JS gesetzte Cookie. Das ist das Problem.
 
...PHP erkennt leider beim Erstaufruf nicht das von JS gesetzte Cookie. Das ist das Problem.
Ja und das wird sich auch nie ändern. Denn Zuerst wird das PHP-Script auf dem Server ausgeführt mit allem drum und dran wird die Seite zum Client geschickt und dort eventuell vorhandenes JavaScript ausgeführt.

Als Alternativlösung könnte man eine Zwischenseite vor der Startseite einbauen, die das testet. Allerdings würde ich da dank NoScript nie irgendwas javascript-technisches sehen, denn der Standard ist nun mal aus.
 
Du kannst doch mit AJAX was zusammenbauen:
Sende immer die Nicht-JS-Seite. So sind alle ohne JS zufrieden.
Zugleich sendest du einen JavaScript-Code, der mittels AJAX die JS-Seite holt und die Seite komplett "umbaut".
 
Sooo kompliziert ist der Seitenaufbau auch nicht gedacht/gemacht.

Per JS wird das Stylesheet ausgewählt - ansonsten eines per Default zugewiesen. Das funktioniert auch.
Ich möchte mir allerdings von Anfang an das gewählte Stylesheet in der Session speichern, damit ich auch in php weiss, welche Auflösung verwendet wird. Ich kann das auch in JS als Cookie speichern - nützt mir nur nix, wenn beim Erstaufruf (der ja nicht immer nur auf der index-Seite sein muss) das von php nicht gemerkt wird... und php dann mit falschen styles-Klassen hantiert. Das sieht einfach sch... aus.

Gibts evtl ne Möglichkeit mir dieselbe Seite einmalig nochmal zu laden, so daß die Cookies richtig erkannnt werden ? Also keine Weiterleitung sondern ein einmaliger Reload - mit php ?

EDIT:
Seitenaufbau-Auszug:
PHP:
<head>
...
<title><?php get_Seitentitel($seitenNr, $sprache); ?></title>
<link href="devi_lib/styles004.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" language="javascript" >var jsLevel=0;</script>
<script src="include/jscript2.js" type="text/javascript" language="javascript" ></script>
<?php SetSessionVars(); ?>
</head>
Da laut W3C im head-tag kein noscript erlaubt ist... ist dort auch keiner gesetzt.

Inhalt jscript2.js:
PHP:
var i=0;
var strDirPrefix="";
var nStyle=3;

var sh = screen.height;
var sw = screen.width;
if (sw >=  630) nStyle=3;
if (sw >=  790) nStyle=3;
if (sw >= 1000) nStyle=3;
if (sw >= 1200) nStyle=4;
if (sw >= 1550) nStyle=5;
if (sh >= 700  &&  sw >= 1100 && sh < 890 )   nStyle=3;
if (sh >= 900  &&  sw >= 1550 && sh < 1200 )  nStyle=4;
if (sh >= 1180 && sw >= 1600 && sh < 1280 ) nStyle=5;

for (i=0; i<jsLevel; i++) strDirPrefix = strDirPrefix + "../";

var strFileName = strDirPrefix + "devi_lib/styles00" + nStyle + ".css";
var shm = "<link href='" + strFileName + "' rel='stylesheet' type='text/css'/>";

// Gewaehlte Aufloesung als cookie speichern
CookieSetz("style", escape(nStyle), 3000);
// Als Cookie speichern das JS aktiv ist
CookieSetz("js", 'J',  3000);

document.write(shm);

//-----------------------------------------------------------------------------
function CookieSetz(Bezeichner, Wert, Dauer)
{
  jetzt   = new Date();
  Auszeit = new Date(jetzt.getTime() + Dauer);
  document.cookie = Bezeichner + "=" + Wert + ";expires=" + Auszeit.toGMTString() + ";path=/;" ;
}

Funktion SetSessionVars():
PHP:
  function SetSessionVars()
  {
    global $DefCss;
    $IsCookies = FALSE;

    /* Javascript An oder aus. Existiert ein Cookie mit js=J
     * dann js in die Session uebernnehmen. Ansonsten in die Seession aufnehmen */
    if ( isset($_COOKIE['js']) )
    {
      $_SESSION['js'] = 'J' ;
    }
    else
    {
      // Pruefen ob generell Cookkies akzeptiert werden - wenn ja dann ist JS deaktiviert
      if (!isset($_COOKIE['testcookie']))
      {
        setcookie("testcookie", "testwert", time()+(30000), "/" );
        if( isset($_COOKIE['testcookie']) )
        {
          //echo "User hat den Cookie akzeptiert\n";
          $IsCookies           = TRUE;
          $_SESSION['Cookies'] = 'J';
        }
        else
        {
          $IsCookies           = FALSE;
          $_SESSION['Cookies'] = 'N';
        }
      }
      else
      {
        $IsCookies             = TRUE;
        $_SESSION['Cookies']   = 'J';
      }
    }

    /* Per JS gewaehltes Stylesheet in Session uebernehmen
     * ansonsten mit Standard = $DefCss Setzen               */
    if (isset($_COOKIE['style']))
    { $_SESSION['style'] = $_COOKIE['style']; }
    else
    { $_SESSION['style'] = $DefCss;  }
    // Testzwecke
  }
 
Zuletzt bearbeitet:
Vielleicht gestalltest du deine Seite lieber so dass du mit einem Stylesheet für alle gängigen Auflösungen hinkommst. Unterschiedliche Stylesheets für verschiedene Auflösung sind eher unüblich.