Autor Zpráva
Joker
Profil
Trochu pokročilejší dotaz, nebo možná brainstorming k nalezení elegantnějšího řešení problému.

Mám „vnější“ stránku, na které je prvek <iframe> a v něm je „vnitřní“ stránka.
Vnější stránka je pořád stejná, vnitřní stránka se různě mění.

Načtení jiné stránky do iframe obstarává ta vnější stránka, která zároveň o načtené stránce vytvoří nějaká data (řekněme metadata).
Čili uživatel použije navigační prvek, vnější stránka vytvoří metadata a načte do iframe správnou vnitřní stránku.

A teď problém: Vnější stránka by potřebovala data udržovat podle aktuálně zobrazené stránky v iframe i při práci s historií (jako např. history.go() v JS).
Takže při navigaci na předchozí stránku se vrátit i k datům předchozí stránky.

Řešení musí fungovat v IE 11 a asi může vyžadovat „same origin“, i když univerzálnější řešení je lepší.

Poznámka pro zajímavost, pracuje se s historií vnější stránky, tj. i když se mění jen obsah iframe, např. history.back() na vnější stránce zobrazí předchozí stránku v iframe.

Dosavadní pokusy:
• Uložit si data přímo do stránky (např. jako nějaký atribut prvku <html>). Nefunguje, při navigaci jinam a pak zpět se data ztratí.
• Prostě si data držet např. v proměnné na hlavní stránce včetně celé historie. Tam asi hlavní problém je synchronizace s tou aktuální stránkou, muselo by se to odprogramovat a je tam velký potenciál pro chyby a rozsynchronizování dat a zobrazené stránky.
• Při načítání vnitřní stránky si data uložit do její adresy. To by asi fungovalo, ale vnitřní stránka může mít query-string i hash a není bez rizika si tam jen tak něco připojit.
• Uložení dat přímo do historie prohlížeče přes history.pushState nebo history.replaceState.
V tom vidím největší potenciál, ale nepodařilo se mi to zprovoznit.
Podle všeho je problém v tom, že se při navigaci nemění adresa hlavní stránky (ale jen stránka v iframe) a historie se nevrátí k tomu stavu, který bych chtěl.
RastyAmateur
Profil
Joker:
Podle všeho je problém v tom, že se při navigaci nemění adresa hlavní stránky
Nešlo by k té adrese tedy připojit nějaký nepodstatný náhodný atribut? Že by stránka byla třeba /website/example.php a do historie by se uložilo /website/example.php?random=65461? Ta proměnná $_GET["random"] by neměla žádný vliv na tu vnější stránku, takže obsah bude shodný, ovšem z hlediska adresy se jedná o jinou stránku

Nebo mě ještě napadlo do toho nějak zkusit zakomponovat session storage. Ale nevím jak přesně...
Joker
Profil
RastyAmateur:
S GET by to nefungovalo (protože změna toho GET parametru by způsobila nové načtení hlavní stránky), ale s hashem jsem to zkoušel a asi by to šlo dotáhnout do funkčního stavu.

Akorát ani řešení měnící URL hlavní stránky není úplně ideální, narazil jsem tam pak na nějaký starý kód, který podle té adresy dělá nějaký odkaz a s hashem nepočítá.
Takže je možné, že tohle řešení by něco rozbilo, ale asi to je možný „plán B“.
Kajman
Profil
Jak měníš iframe? window.open s targetem?
Joker
Profil
Kajman:
O navigaci se stará funkce v té vnější stránce a prostě jen nastavuje iframe.src = url.

Přičemž kód té vnější stránky si můžu upravovat.
V principu můžu měnit i kód vnitřních stránek, ale řešení, které by vyžadovalo nějak upravovat všechny ty vnitřní stránky, bych se rád vyhnul (kvůli náchylnosti na chyby a komplikacím s údržbou).

Jinak ještě jsem zkoušel místo historie hlavní stránky držet data na historii toho iframe (vypadá to, že stejná historie se drží jak v iframe.contentWindow.history, tak v top.history), kde není problém se stejnou URL.
Tam je zase problém, že pro hlavní stránku je historie okna v iframe jen pro čtení, a to i při splnění „same origin“. Čili pokus o iframe.contentWindow.history.pushState vyvolá chybu.
Kajman
Profil
A src iframu může být použito jako klíč pro metadata? Tedy když v historii bude ta samá stránka na 2. a 4. místě, sdílí stejná data?
Joker
Profil
Kajman:
Zajímavý nápad, díky. Nejdřív jsem to zavrhl s tím, že metadata a soubor (stránka) nejsou 1:1. Nicméně celá ta načítaná adresa (včetně query-stringu a hashe) nejspíš 1:1 bude.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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

0