Autor Zpráva
b022d
Profil *
Zdravím,
mám takový drobný problém. Kvůli dokonalému pohodlí uživatelů jsem se rozhodl používat javascript, ale vyvstal mi malý problém. Neměl bych zapomínat na uživatele, který jej zapnutý nemají a nabídnout jim stejně funkční ač obtížnější cestu. K tomu bych ale potřeboval v optimálním případě dostat informaci o zapnutém/vypnutém javascriptu jakkoliv do php proměnné nejlépe hned při prvním přístupu na stránku.

Napadlo mne několik složitých řešení, ale ani jedno mi nepřišlo dobré.

- dotázat se uživatele nenásilným zaškrtávacím políčkem na to, jestli chce, aby stránka používala javascript nebo né, uložit výsledek do cookies.
- na pozadí se pomocí javascriptu pokusit zapsat cookie, které přítomnost otestovat pomocí php.
- na pozadí se pomocí AJAXU pokusit skrz php skript zapsat cookie, následně otestovat v dokumentu, jestli se cookie podařilo zapsat.

bohužel toto stojí a padá na cookies a znovunačtení stránky. Neexistuje nějaké přímé, elegantní řešení, předdefinovaná proměnná?
Joker
Profil
A k čemu to?
Obvykle stačí prostě napsat HTML stránku pro uživatele, kteří JS nemají a k ní připojit JS, který si jí přeskládá k obrazu svému.
b022d
Profil *
jistě, obyčejnou html stránku ano. Ale v rozsáhlejším projektu by se to hodilo, zvlášť při nabízení zcela jiného řešení (vícestránkové přidání hlasu v anketě x jednostránkové např.)

Rozhodně se nechci pouštět do nějakého přeskládávání stránky, ještě pomocí JavaScriptu, který si taky každý prohlížeč interpretuje jak chce, i když by to bylo také jedno z řešení a asi se k němu uchýlím, nepůjde-li to jinak.

Každopádně ptal jsem se jestli existuje způsob, jak onu informaci narvat do proměnné, či neexistuje.
Mastodont
Profil
Předdefinovaná proměnná neexistuje. Ale při prvním přístupu na stránku můžeš do BODY vložit onload s přesměrováním na jinou adresu. Pokud je JS vypnut, přesměrování neproběhne.

session_start();
if (!isset($_GET['js']) && !isset($_SESSION['js']) ) {
  echo "<html><body onload=window.location.href='index.php?js=yes'></body></html>";
  exit;
} elseif (isset($_GET['js'])) {
  $_SESSION['js']= "ano";
  header('Location: index.php', TRUE, 303);
  exit;
}


Je to dvojí redirect, ale lepší než drátem do oka :)
Joker
Profil
b022d
vícestránkové přidání hlasu v anketě x jednostránkové např.
No zrovna tohle bych teda udělal "přepisováním".
Například:
<a class="hlasovani" href="hlasuj.php?volba=1">volba 1</a>

a JS by si potom vytáhl odkazy třídy "hlasovani" a změnil jim href například na "javascript:hlasuj("+volba+")";
b022d
Profil *
Mastodont
Díky. Každopádně je to škoda, že k tomu není přímý přístup v rámci PHP. Problém nastane u cookies/session, uživatel může rychle vypnout/zapnout než session/cookie expiruje. Ale tak pořád je to nějaké řešení.

Joker
Ano, jistě. Taky jsem hovořil o komplexnějším projektu, kde by se mi to hodilo u více věcí než u zmiňované ankety, mnohdy zároveň, a na to už mé javascriptové schopnosti nestačí, tak se snažím udělat v PHP co se dá. Mimoto rychlé zjištění zapnutého javascriptu má spousty dalších výhod.
Mastodont
Profil
b022d
Ale pořádně si to otestuj, psal jsem to z hlavy.
ronnie
Profil
"Každopádně je to škoda, že k tomu není přímý přístup v rámci PHP."

Ale je. V PHP existuje funkce get_browser(), která mimo jiné vrací i informaci o tom, jestli je zapnuty javascript. Zkuste na hostingu zavolat skript

<?php
print_r(get_browser());

Ne vždy je však možné tuto funkci používat, je proto třeba zvláštní nastavení. Nicméně u všech hostingů, kde jsem měl nějaký web tohle fungovalo dobře.
ronnie
Profil
Uff, oprava, pro zjišťování prohlížeče, verze, platformy ap. to funguje podle předpokladů, u cookies, javascriptu to pouze vrací hodnotu, zda je prohlížeč schopen s cookies/javascriptem pracovat. Takže nic, omlouvám se.
Mastodont
Profil
Tak jsem si ten svůj výplod vyzkoušel a je tam problém, že bez JS to vždy skáče do toho prvního IF, čili tam by nemohlo být prázdné body, ale verze stránek pro vypnutý JS. Dalo by se to vylepšit:

session_start();
if (!isset($_GET['js']) && !isset($_SESSION['js']) && !isset($_SESSION['nojs']) ) {
  // první vstup na stránku
  echo "<html><body onload=window.location.href='index.php?js=yes'></body>Máte vypnutý Javascript, funkčnost stránek bude omezená. Pokračujte klepnutím na <a href=\"index.php\">tento odkaz</a>.</html>";
  $_SESSION['nojs'] ='ano';
  exit;
} elseif (isset($_GET['js']) && !isset($_SESSION['js'])) {
  $_SESSION['js']= "ano";
  unset ($_SESSION['nojs']);
  header('Location: index.php', TRUE, 303);
  exit;
} 
if ($_SESSION['js']) // a dál normálně rozlišovat verze
b022d
Profil *
Díky moc všem. Zkombinuji nově naučené a až si javascript pořádně osahám, pustím se do zpříjemňování, problém se zdá být vyřešen.
Marek Prokop
Profil
Dovolil bych si připomenout, že existuje značka <noscript>.
Mastodont
Profil
Marek Prokop
Samozřejmě, ale pokud tuto informaci mám už v kódu, mohu posílat jednu verzi stránky, ne dvě.
b022d
Profil *
Marek Prokop
Jak říká Mastodont, pomocí noscript se mi nepodaří dostat informaci do php proměné, takže se mi to při "podstrkávání" více verzí stránky vůbec nehodí.
suky
Profil
$browser = get_browser();
$array = ((array) $browser);

while (list ($key, $value) = each ($array))
	{
	if ($key == "javascript")
		{
		$zapnuty_js = $value;
		}
    }

echo $zapnuty_js;
Leo
Profil
Jak uz tady kdosi napsal, idealni stav je napsat html tak, ze js je jen nastavbou a nedelat specialni verzi stranek pro js. Pokud uz pouzivate neco jako onload v body, pak

1, onload je moc pozde (az po nacteni vsech obrazku apod.), uzivatel uz si stranku cte a pak mu zmizi...

2, misto window.location.href= pouzijte metodu replace, prosim, at neblokujete tlacitko Zpet...

Leo
littlemaple
Profil
get_browser() vrací schopnosti browseru. Pokud browser zvládá JavaScript nebo Cookies, neznamená to, že je uživatel nevypnul.
PetrPN
Profil *
Co takhle zapsat javascriptem cookie?
a pak to ověřit PHP?

To nikoho nenapadlo?

<script language="javascript" type="text/javascript">
    var js_cookie= "js_on";
   function uloz()
   {
     var datum= new Date();
     var datum_exp= new Date();
     datum_exp.setDate(datum_exp.getDate() + 1);
     document.cookie= js_cookie+ "=" +escape(datum.getTime()) + ";expires=" + datum_exp.toGMTString();
     //alert("cookie uloženo!");
   }

    uloz();
  </SCRIPT>


Moderátor Alphard: Obarven kód a smazáno pár nadbytečných otazníků.
Bubák
Profil
PetrPN
Kup si novou klávesnici, zasekávají se to některé klapky.

Nenapadlo tě, že se hledá způsob, který bude nezávislý na zapnutých obrázcích, cookies a dalších technologiích?

Ocituji hned z prvního příspěvku, který jsi zřejně nečetl pořádně, napadlo to rovnou tazatele a hned si uvědomil nevýhody:
- na pozadí se pomocí javascriptu pokusit zapsat cookie, které přítomnost otestovat pomocí php.
...
bohužel toto stojí a padá na cookies a znovunačtení stránky. Neexistuje nějaké přímé, elegantní řešení, předdefinovaná proměnná?
PetrPN
Profil
Nevím co mám s klávesnicí.. Kopíruju to rovnou z kodu,kde to dobře funguje..

Co použít frame..??

První hlavní soubor.. index.php
<?
session_start();
?>
<HTML>
 <HEAD>
  <TITLE>aaa</TITLE>
  <meta http-equiv="Content-language" content="cs">
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
  <script language="javascript" type="text/javascript">
     var js_cookie= "js_on";
     var datum= new Date();
     var datum_exp= new Date();
     datum_exp.setDate(datum_exp.getDate() + 1);
     document.cookie= js_cookie+ "=" +escape(datum.getTime()) + ";expires=" + datum_exp.toGMTString();
  </SCRIPT> 
 </HEAD>
  <FRAMESET FRAMEBORDER="no"
            BORDER="0"
            FRAMESPACING="0"
            ROWS="100%,*">
   <FRAME src="sindex.php" MARGINWIDTH="0" MARGINHEIGHT="0">
  </FRAMESET>
</HTML>


a ten odkazovat na řídící sindex.php kde php zohlední ihned přítomnost cookie..
PetrPN
Profil
Ten druhý sindex.php

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
session_start();
global $PHPSESSID, $akce, $js_on;

       If (!IsSet($js_on)):
         echo "Javascript není zapnutý.
                  Pro správný a komfortnější běh webových stránek je zapotřebí javasctript zapnout..
                 ";
       else:
         echo "Javascript je zapnutý";
       endif;
PetrPN
Profil
Myslím,že se tu jedná o zjištění zapnutého javascriptu,tak tu jsem snad správně a snad i ta moje připomínka bude k něčemu..
Jan Turoň
Profil *
potřeboval jsem znát JS už při generování v PHP
- má-li uživatel JS vypnut, zobrazím mu selectboxy se všemi options (vykreslení prohlížeči trvá dlouho)
- má-li uživatel JS zapnut, načítají se jen některé options přes AJAX (což je mnohem rychlejší a přehlednější)

úspěšně jsem otestoval tohle:
// body v přihlašovacím formuláři (v roce 2066 už snad bude problém s JS neaktuální)
<body onload="document.cookie='js=1; expires=Fri, 6 Nov 2066 20:01:20 UTC; path=/';">

// php potom kdekoliv v podstránkách zjistí JS
<?php if ($_COOKIE["js"]) ... ; ?>

Enjoy!
Joker
Profil
Jan Turoň:
úspěšně jsem otestoval tohle:
To bych se docela divil, protože tohle nezjistí nastavení JS už při zpracování stránky v PHP, ale až při načtení další stránky.
Navíc to počítá s tím, že si příštích skoro 60 let nezměním v prohlížeči nastavení JS.
Když vlezu na web, zjistím nějaký mimořádně otravný JS a přes Upravit místní nastavení (v Opeře) pro ten web JS zablokuju, najednou web přestane fungovat. Když tomu webu navíc zablokuju cookies (nebo je prostě vymažu), zase začne fungovat.
jklasdf
Profil *
Jan Turoň:
potřeboval jsem znát JS už při generování v PHP
- má-li uživatel JS vypnut, zobrazím mu selectboxy se všemi options (vykreslení prohlížeči trvá dlouho)
- má-li uživatel JS zapnut, načítají se jen některé options přes AJAX (což je mnohem rychlejší a přehlednější)

Prostě to, co se má zobrazit při vypnutém javascriptu dej do tagu <noscript></noscript> a při zapnutém se to vykreslovat nebude. Jenom se načte pár proměnných do php, jestli je tam budeš mít, ale to není zas tak velká časová ztráta.

E-mail na centrum.cz používá asi toto řešení:
Do tagu <noscript> napíší:
Nemáte zapnutý js, vstupte do <a href="bez_js.php">zjednodušené verze</a>.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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