Autor Zpráva
David1256
Profil
Dobrý den,

řeším jeden problém. Mám na stránkách umístěn youtube přehrávač. Přehrávač funguje a vše se zdá být OK. Problém je však v tom, že když návštěvník webu překlikne na jiný odkaz, tak se změní adresa a tím pádem se přehrávač znovu načítá a přeruší se dosavadní přehrávání, což každého tak akorát naštve.

Přemýšlel jsem nad tím, jak tento problém vyřešit a napadl mě AjaxLoader, tedy změna obsahu jen určité části webu (určitého <div>u). Jenže tím zase vzniká problém, že se nemění url a když pak chce někdo poslat někomu odkaz na určitou část webu, třeba na konkrétní článek, tak mu odešle prostě adresu ve tvaru www.adresa.cz a ten se tak na tížený článek prostě nedostane. Neznáte někdo nějaké řešení, které by kombinovalo změnu adresy s nepřerušením přehrávání přehrávače nebo nějakou podobnou metodu jak tento problém vyřešit?

Děkuji.
DJ Miky
Profil
JavaScriptem můžeš měnit adresu za # (hledej location.hash např. tady na diskusi). Dá se to i navázat tak, aby fungovalo tlačítko zpět v prohlížeči, a mnohé stránky to tak používají (např. vyhledávání Google při změně klíčových slov, Gmail, Twitter).

Nebo je řešení otevřít vyskakovací okno s přehrávačem.
Str4wberry
Profil
Známe.

Buď načítat všechno AJAXem (pomocí history.pushState a location.hashem pomocí #! v prohlížečích, co pushState neznají, měnit URL, aby šlo odkazovat), nebo otevřít další okno, kde je jen přehrávač, případně použít rámy.
David1256
Profil
Tak jsem se to rozhodl udělat přes AjaxLoader v kombinaci s tím location.hash. Ovšem narazil jsem na jeden problém. Hash přidává další znaky za znak #. Ovšem proměnné se získávají ze znaků za znakem ?. Na googlu mají proměnné i za znakem # ale nějak nevím, jak toho docílili. Napadlo mě to obejít přes location.search, který přidává znaky za znak ?, ale přitom se reloaduje stránka, takže to je nepoužitelné a musím to nějak vyřešit přes ten hash. Otázka tedy zní: Jak zjistit proměnou stránka z index.php#stranka=nejakastranka. Z index.php?stranka=nejakastranka je to normálně přes GET, ale tady nějak nevím.
Str4wberry
Profil
Funguje to jinak.

Kliknutí na odkaz – buď se nastaví všem odkazům, že mají při prokliknutí načíst danou stránku z hrefu a změnit location.hash, nebo se jen změní ten hash a načítání je navázané právě na tu jeho změnu (pomocí onhashchange nebo časovače).

Načtení stránky – po načtení stránky se podíváš do hashe, odstraníš z něj # a jeho obsah předáš té samé funkci, co načítá stránky. Ta funkce bude načítat běžná URL ve tvaru index.php?stranka=nejakastranka. Ještě je potřeba vyřešit, aby se načítal jen obsah, který je potřeba (mění se) – to lze zařídit zavedením parametru, který se bude používat u AJAXových volání a daná stránka potom vrátí jen svůj vnitřek; nebo si z celé stránky vyzobávat potřebný obsah.
David1256
Profil
Str4wberry:
Onhashchange je, jak tak koukám na kompatabilitu s prohlížeči, nepoužitelné. To co mi radíš s načítáním stránky nějak nechápu. Jaké funkci mám předávat obsah hashe? Stránky načítám přes includy s tím, že podle proměnné z GET v url se načítá požadovaný obsah. Jenže to teď vlastně nefunguje, protože si to z této adresy #stranka=stranka logicky nic nebere a já se možná hloupě ale ještě jednou ptám jak z toho tu hodnotu vydolovat...
Zkrátka se tu pokusím ten problém rozebrat trochu detailně, aby tomu bylo více rozumět.
Mám tento php kód přes, který se načítá obsah stránek.
<?php
$stranka = $_GET['stranka'];
 $soubor = "includy/".$stranka.".php"; 
 if (!file_exists($soubor)) { 
 $soubor = "includy/prostredek.php";
 }
 ?>

  <?php include ($soubor); ?>  a další includy....
Poté mám nějaký odkaz skrz něj chci, aby se do určitého divu načetla jen ta část stránky, kterou potřebuji, což zajišťuje AjaxLoader. V tomto případě chci, aby se do divu "prostredek" načetl obsah includy/kontakty.php po kliknutí, což se daří. Jelikož o této změně ale potřebuji dát vědět i do url používám zároveň hashe.
 <a onclick="ajaxLoader('includy/kontakty.php','prostredek'); window.location.hash='stranka=kontakty'";>KONTAKTY</a>
Jenže to nefunguje opačně tzn. že se po potvrzení adresy v url (#stranka=kontakty) nenačte to co, tam má být. Příčinou toho je, že to prostě nemá tu proměnnou $stranka z čeho získat, protože v url není za ? ale za # a to je celý můj problém. Kdyby jste mi to kdyžtak ještě mohli nějak pomoci pořešit, byl bych moc rád. Možná že mi uniká jen nějaká banalita, ale prostě nevím, co s tím. Díky.
weroro
Profil
Ešte je jedno riešenie. Youtube ponúka tvz. FlashAPI riešenie pomocou ktorého si vieme implementovať jadro YT playera do svojho vlastného flash video playera. A ak mám svoj video player, tak už nie je problém ukladať aktuálnu pozíciu videa do SharedObject a pri refreshe stránky sa video spustí od poslednej pozície.
David1256
Profil
weroro:
Díky za inspiraci. Ale má to zase "mouchu". Při každém reloadu se video ač na malou chvíli tak zastaví a ucho i oko návštěvníkovo to prostě spozoruje a i když to nebude tak hrozné jako přerušení videa a hození na začátek, tak to stále neřeší problém s plynulým přehráváním.
David1256
Profil
Bingo! Tak už jsem pokročil o další kus. Z hashe jsem si vytáhl hodnotu proměnné, kterou potřebuji a to pomocí JS scriptu. Hodnotu jsem pak předal php, které s ní dál pracuje. Ovšem narazil jsem na jeden úplně nečekaný problém, který nějak nedokážu pochopit. Není to už nic ve stylu jak by mělo fungovat nepřetržité přehrávání přehrávače, ale php mi vypíše správnou proměnnou, ale nechce mi ji includovat. Popíšu přesněji níže.
<?php
$stranka = '<script>window.document.write(stranka);</script>'; //do stranky mi to uloží hodnotu JS proměnné stranka, která je braná z hashe a její hodnota je 'kontakty'
 $soubor = "includy/".$stranka.".php"; //do proměnné soubor mi to zapíše správně hodnotu 'includy/kontakty.php' 
 echo $soubor; // vypisuji a vypisuje se správná hodnota 'includy/kontakty.php' 
 include ($soubor); //chci includovat ale neudělá to nic..přitom když udělám zápis normálně include('includy/kontakty.php'), tak to fachcčí  
?>
Příjde mi jak kdyby se najednou ta hodnota té proměnné ztratila, ale proč? O řádek víš mi ji to dokáže vypsat a o řádek níž ji ignoruje?

EDIT: Když jsem přidal do kódu toto
 $zkusebni = "includy/kontakty.php";
 include ($zkusebni);
Tak to taky normálně funguje ale přes $soubor ne. Nemáte nějaký nápad?
Alphard
Profil
Jste další, kdo patlá js a php dohromady :-) To nejde, každou část vyhodnocuje jiný stroj, prvně PHP server, pak JS klient.
David1256
Profil
Ale když už mám v PHP nějakou JS hodnotu a normálně jí to vypisuje a pracuje s ní, tak jaktože to ten include "neskousne"?
Alphard
Profil
Ale vy nemůžete mít v php žádnou hodnotu pocházející z js.
$soubor může obsahovat asi tak "includy/<script>window.document.write(stranka);</script>.php". Nevěřím, že je tam něco jiného, podívejte se do html zdrojáku..
David1256
Profil
No jo. Teď mi to docvaklo. Hm tak moje teorie pohořela. Stále tedy nevím, jak to udělat, aby ten se ten přehrávač nezastavoval při klikání na různé odkazy a zároveň, aby se měnilo url.... :-(


A co říkáte na Sajax http://www.modernmethod.com/sajax/. To by mohlo pomoci vyřešit můj problém ne?


Jo i když teď přemejšlim, kdybych použil Sajax, tak bych stejně musel měnit url přes odkaz a přitom by se stránka refreshla. Pff fakt už nevim tyjo. Možná přes cookies? :-D Už asi končim, alespoň pro dnešek...
Medvídek
Profil
David1256:
Mužeš zkusit mrknout sem, kde se stránky mění location.hashem a stránky se načítají, aniž by přerušily přehrávač. Pro inspiraci snad poslouží.
Chamurappi
Profil
Reaguji na Davida1256:
Já mám jako uživatel nejraději, když je přehrávač v samostatném okně. I kdyby to měl web kdovíjak chytře vyřešené, budu na něm brouzdat s nejistotou — to se týká i třeba toho YouTubu, kde se musím postupnými pokusy a omyly učit, co mi způsobí odchod z právě prohlíženého videa a co ne. Řekl bych, že tu chybí nějaká konvence říkající, jak označovat/rozpoznávat odkazy, které ve skutečnosti neodkazují… nebo aspoň o žádné nevím.

Bingo! Tak už jsem pokročil o další kus.
Pokud plaveš v otázce, kde se zpracovává JavaScript a kde PHP, musel bys pokročit o hodně velký kus, abys dokázal rozběhat AJAX i s funkční historií.
David1256
Profil
Už se nám to tu zvrtlo v jiné téma, takže založím nové, ať tu není zbytečný flame. V novém tématu se budu ptát na to "Jak dostat JS proměnnou do PHP pomocí Ajaxu nebo cookies".
Lukáš R.
Profil
Chápu, že jste už pokročili jiným směrem, ale nešly by použít rámy?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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