Diskuze: fullscreen pomocí tlačítka
V předchozím kvízu, Online test znalostí HTML a CSS, jsme si ověřili nabyté zkušenosti z kurzu.


Asi by to slo ulozit do cookies a vyvolat automaticky na kazde dalsi
strance.
Hadam, ze problem je v tom, ze ten stav je vyvolan pres js, nikoliv uzivatelem a
browser to chape jako moznou podvrzenou akci od reklamniho robota. treba, jak je
stranka s videem a misto play se ti zobrazi reklama a jeste full screen.
F11 je tlacitko pro full screen.
Díky moc za odpověď
A jak bych to mohl uložit do cookies? Nic podobného jsem ještě nedělal..
Taky si myslím, že by to mohl být jeden z důvodů.. Na druhou stranu jsem
nikde nenašel, že by někdo řešil podobný problém. Potom by mohla být
chyba v tom jak se stránky shoptetu načítají. A nějakým způsobem
resetují všechny vyvolané akce. Ale netuším jak to obejít. Jedině
vytvořit globální proměnnou, která bude buď true nebo false na základě
stisknutí tlačítka fullscreen a pak script, který poběží neustále na
pozadí a bude kontrolovat podmínku, zda je daná proměnná true.. takže
vlastně obdoba cookies. Jsem ale v JS úplný začátečník a nevím jak
podobné podmínky sepsat. Zkoušel jsem hledat nějaké návody, ale už mi to
zabírá spoust času.. dělám to jen ve volnu jako koníček. Tak pokud někdo
ví jak to vyřešit, určitě by mi to moc pomohlo
Zeptal ses googlu?
google = javascript cookies example
google = javascript localStorage example - to je modernejsi zpusob
Presne, jak rikas, vytvoris si tam promenou, nastavis true a pri zobrazeni
stranky si zkotrolujes, zda je ci neni fullscreen uz fullscreen a zda to
odpovida te promene.
Ale, je mozne, ze to jde jinak, ze je treba nejak prohlizeci rict, aby ten rezim
nevypinal. Ja jsem spis programator amater, pokud se jedna o neco, co pred 20
lety neexistovalo a to je presne pripad toho fullscreenu.
https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
localStorage.setItem('myCat', 'Tom');
const cat = localStorage.getItem('myCat');
localStorage.removeItem('myCat');
localStorage.clear();
Tak jsem to dnes zkoušel řešit a zatím bez úspěchu
Nejspíš špatně rozumím sepisování JS..
Zkouším následující kód, ale zdá se, že kontrolní podmínka co by měla
běžet neustále a zkoumat, jestli je proměnná true nebo ne.. tak
neběží..
<!DOCTYPE html>
<html>
<body>
<p><button onclick="klik()" type="button">Klikni!</button></p>
<p><button onclick="storno()" type="button">Stornuj me!</button></p>
<p>Hodnota promenne:</p>
<p id="demo"></p>
<script>
klik();
function klik() {
if (sessionStorage.klik) {
sessionStorage.klik = true;
} else {
sessionStorage.klik = false;
}
document.getElementById("demo").innerHTML = sessionStorage.klik;
}
function storno() {
if (sessionStorage.klik) {
sessionStorage.klik = false;
}
document.getElementById("demo").innerHTML = sessionStorage.klik;
}
if (sessionStorage.klik = true) {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
}
if (sessionStorage.klik = false) {
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
}
</script>
</body>
</html>
Nevíte někdo, kde dělám chybu?
Na konci jsem špatně uzávorkoval podmínku, ale stejně to nefunguje
...
if (sessionStorage.klik = true) {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
}
}
if (sessionStorage.klik = false) {
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
...
1)
https://developer.mozilla.org/…llscreen_API
https://developer.mozilla.org/…itFullscreen
https://developer.mozilla.org/…stFullscreen
Jestli spravne rozumim dokumentaci, tak...
document.fullscreenElement -- boolean promena, ktera rika, zda je fullscreen aktivni nebo ne (je pod nadpisem Properties)
elem.requestFullscreen() -- aktivuj FS (Methods on the Element interface)
document.exitFullscreen() -- zrus FS (Methods on the Document interface)
S tim, ze aktivace se musi volat na elementu, takze treba
let elem = document.documentElement;
let elem = document.querySelector("video");
A exit se vola z document.
if (document.exitFullscreen) -- to je dotaz, zda existuje funkce document.exitFullscreen, to je mozna zbytecne ve tvem kodu
Je tam krasny priklad, pod nadpisem "Toggling fullscreen mode" https://developer.mozilla.org/…llscreen_API
- A druhy problem, ktery tam mas, ze funkce klik a storno sice prepinaji hodnotu v session, ale nevolaji funkci pro prepnuti modu fullscreen a zpet.
function klik() {...; fullScreen();}
function storno() {...; fullScreen();}
function fullScreen() {...}
fullScreen(); // a soucasne je treba zavolat full screen po nacteni stranky, to tam jakoze mas
Ale, po kliknuti na button se stranka nenacita, jen pri kliknuti na odkaz,
takze muzes klikat na butony, jak chces, kdyz delaji jen kliknuto = true /
kliknuto = false; vypisKliknutoNaObrazovku()
Tohle jsem tak nějak pochopil, doufám
Problém je, že asi nerozumím krokům, jak se kód na stránkách čte..
Funguje to tak, že se načte stránka, přečte celý kód a vykoná se
jednorázově? A jediné co běží na "pozadí" je kontrola stisku buttonu,
který vyvolá další případné funkce?
Takže následující část kódu se přečte a vykoná pouze jednou při načtení stránky? Protože můj záměr byl, že se čte neustále a podle toho jak se mění proměnná sessionStorage.klik se vykoná ten či onen kód..
...
if (sessionStorage.klik = true) {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
}
}
if (sessionStorage.klik = false) {
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
...
Pokud se to tedy přečte pouze jednou, pak chápu, že to nefunguje..
Proto jsem zkoušel najít funkci, která bude čtení kódu opakovat a zkusil
jsem něco takového:
<!DOCTYPE html>
<html>
<body>
<p><button onclick="klik()" type="button">Klikni!</button></p>
<p><button onclick="storno()" type="button">Stornuj me!</button></p>
<p>Hodnota promenne:</p>
<p id="demo"></p>
<script>
sessionStorage.klik = false;
document.getElementById("demo").innerHTML = sessionStorage.klik;
setInterval(fullScreen, 5000);
function klik() {
if (sessionStorage.klik) {
sessionStorage.klik = true;
}
document.getElementById("demo").innerHTML = sessionStorage.klik;
}
function storno() {
sessionStorage.klik = false;
document.getElementById("demo").innerHTML = sessionStorage.klik;
}
function fullScreen() {
if (sessionStorage.klik = true) {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
}
}
if (sessionStorage.klik = false) {
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
}
</script>
</body>
</html>
Pseudokódem jsem chtěl docílit následujícího postupu..
Při načtení stránky:
- definuj proměnnou sessionStorage.klik = false
- zobraz hodnotu této proměnné
- spusť opakující se interval každých 5 vteřin a spusť funkci fullScreen()
- tato funkce kontroluje jestli je proměnná sessionStorage.klik true nebo false a podle toho zapne nebo vypne fullscreen..
- jsou přítomné další dvě funkce, které spouští buttony a to funkce klik() a storno()
- při kliknutí na kterýkoliv button se změní hodnota proměnné sessionStorage.klik a vzhledem k tomu, že mám stále spuštěný interval každých 5 vteřin zapnout funkci fullScreen(), tak by měl podle toho zapnout nebo vypnout fullscreen..
Bohužel to nefunguje.. při různých experimentech jsem dospěl k názoru, že i přesto, že při kliknutí na tlačítko storno se funkce sessionStorage.klik nastaví na false, tak funkce pro zrušení fullscreenu se spustí jen když je true.. i když v podmínce je :
...
if (sessionStorage.klik = false) {
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
...
Proto mi přišlo, že stisknutím buttonu storno sice nastaví proměnnou
sessionStorage.klik = false, ale až na konci celého kódu/relace.. tudíž
kontrola jestli je již proměnná sessionStorage.klik = false je v daný moment
ještě true.. Proto si nejsem jistý časováním částí kódu a tak nejsem
schopný ani přijít na to, proč to nefunguje i přesto že pseudokódem to
dává smysl
Zaklady programovani?
Kod se cte radek po radku.
a, b, c, ...
Kod, ktery obalis funkci se jen uklada do pameti
function aaa(xxx) {neco delej}
Aby se kod vykonal, musis funkci zavolat.
aaa(123)
Kod, ktery napises do tagu script bez obaleni do funkce se obvykle ihned
vykonava v miste, kde je napsany.
`<div id=xxx></div> <script>neco proved z divem
xxx</script>
<script>neco proved z divem xxx - ale, div neexistuje</script>
<div id=xxx></div>`
Druhy priklad tedy skonci errorem v konzoli.
Takze, idealni je, vsechny scripty umistit pred uzaviraci tag /body. Nebo do
oteviraci do parametru onload="...". Nebo do scriptu window.onload="..."
Na pozadi bezi casovace (setTimout, interval), sledovace udalosti (onload
body onload, img onload, iframe onload, request onload, file onload),
eventy.
kdyz nastane udalost mysi, se zjisti, co vse v okoli muze byt aktivovano a to
vse zpusobi event onclick, treba. Je to serie funkci, ktere jdou v poradi a je
mozne tu serii prerusit (event prevent, stop propagation).
Nebo, kdyz das do stranky iframe nebo obrazek, tak se spusti event pro stahovani
souboru. To muze nejaky casek zabrat. Bezi to na pozadi a dal se vykonava html,
js kod mezitim. Pokud chces vedet, ze to skoncilo, musis na to navazat call
back, funkci, ktera se zavola po skonceni.
<img src=... onload="skonciloStahovani(this)">
<script>
function skonciloStahovani(obrazekElement) {alert('skoncilo stahovani souboru z url'+obrazekElement.src)}
function stahovaniSouboruKonec() {...}
function stahovaniSouboruError() {...}
request.post(url, asyn=true, stahovaniSouboruKonec, stahovaniSouboruError)
//nejaky dalsi kod, ktery se vykona driv nez bude dokonceno stahovani
Cili, pri nacteni stranky se vykona kod, ktery je v tagu script a neni ve funkci. Pokud chces pouzit i funkci, musis ji extra zavolat
function klik() {...; fullScreen();} // tohle se pri nacteni stranky nevykona
function storno() {...; fullScreen();} // nevykona
function fullScreen() {...} // nevykona
alert(123) // vykona
fullScreen(); // vykona, spusti obsah funkce
---
function klik() {...;}
fullScreen();
// <tag onclick=klik()>
// klik provede jen to, co je v kliku napsane. Nic vic.
// full screen bylo pouzito jen pri nacteni stranky, spustilo se 1x, neni provazane na nic dalsiho
// je tedy blahove ocekavat, ze se vykona jako samo bez dovoleni
A pak mas funkce jako setInterval, setTimeout. Intervalem je mozne spustit
funkci podle uplynuteho casu, treba jednou za sekundu. Pouziva se to k
odpocitavani casu, treba. Nebo zobrazovani hodin. Nebo pohybu pismenek po
obrazovce, strely a tak.
V jinych jazycich existuje neco jako funkce pause. ta zastavi vykonavani kodu na
nejaky cas. Je to neco jako settimetout. Ten spusti funkci po uplynuti casu.
Rozdil mezi tim je:
timer = setInterval(zobrazCas, 1000) // +1s, +1s, ... do zastaveni casovani js prikazem
timer = setTimeout(zobrazCas, 1000); setTimeout(zobrazCas, 2000); setTimeout(zobrazCas, 3000)
// okamzite se spusti 3 casovace, jeden aktivuje funkci v case 1s, druhy 2s, treti 3s a pak uz nic
// (treba posunes rucicku hodin o +1, +1, +1, ale, pak se to zastavi)
// takto treba funguje stahovani souboru, otevre se treba 10 najednou a postupne se stahuji
zobrazCas(); pause(1000); zobrazCas(); pause(1000); zobrazCas(); pause(1000);
// rozdil je v tom, ze pri pause obvykle v tech druhych jazycich je program trvale zastaveny. Neni mozne na nic klikat a tak.
Děkuji ještě jednou za vyčerpávající odpověď
Myslím, že většinu těchto poznatků znám a tak nějak chápu.. ale i
přesto netuším co dělám špatně že to nepracuje tak jak bych chtěl.
Sepsal jsem po lopatě následující kód s poznámkami jak si myslím, že by
to mělo fungovat, je to tak správně?
<!DOCTYPE html>
<html>
<body>
<p><button onclick="klikk()" type="button">Klikni!</button></p>
<p><button onclick="storno()" type="button">Stornuj me!</button></p>
<p>Hodnota promenne:</p>
<p id="demo"></p>
<script>
// nastavi pri nacteni stranky jednorazove promennou klik na false
sessionStorage.klik = false;
// zobrazi nastavenou hodnotu false, abych videl ze vse funguje
document.getElementById("demo").innerHTML = sessionStorage.klik;
// nastavi spousteni funkce fullScreen kazdych 5 vterin
setInterval(fullScreen, 5000);
// nadefinuje funkce klik() a storno() pro jejich pozdejsi spusteni pri stisknuti prislusneho buttonu
function klikk() {
if (sessionStorage.klik) {
// nastavi promennou klik na true
sessionStorage.klik = true;
}
// nasledne zobrazi nastavenou promennou abych videl, ze se zmenila
document.getElementById("demo").innerHTML = sessionStorage.klik;
}
function storno() {
sessionStorage.klik = false;
document.getElementById("demo").innerHTML = sessionStorage.klik;
}
// tuto funkci fullScreen vyvolávám každých 5 vteřin viz na začátku funkce setInterval()
function fullScreen() {
// pokud je promenna klik true, tak nastavi webovou stranku na celou obrazovku pokud tak jiz neni nastaveno
if (sessionStorage.klik = true) {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
}
} else {
// pokud je promenna klik false, tak spusti vypnuti cele obrazovky.. predpokladam ze je jedno, jestli je cela obrazovka aktivni nebo ne
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
}
</script>
</body>
</html>
Jednoduše chci, aby se nadefinovali funkce klik() a storno() a pak funkce fullScreen().. Při stisku příslušného buttonu se proměnná sessionStorage.klik nastavi na true nebo false.. a jelikož každých 5 vteřin spouštím funkci fullScreen(), tak by se měla spustit celá obrazovka pokud je promenna sessionStorage.klik true a nebo vypnout pokud je false..
Pokud mám zápis správně, tak by to mělo fungovat ne?
Když to však zkusím spustit.. tak se mi samozřejmě na začátku nadefinuje
proměnná sessionStorage.klik na false.. a jak uběhne 5 sekundový interval,
tak i přesto, že je false tak se zapne celá obrazovka.. a neustále se
zapíná vždy po uplynutí intervalu.. pokud kliknu na button storno, který
má spustit funkci storno() a nastavit sessionStorage.klik na false, i když
jsem jí třeba předtím nastavil na true, tak se celá obrazovka samovolně po
uplynutí intervalu nevypne..
Rozumím, že když stisknu button, tak bych měl rovnou volat funkci
fullScreen, ale takle to nechci.. protože právě už v prvním příspěvku
jsem psal, že na stránkách se sice celá obrazovka zapne, ale jakmile
překliknu na nějaký odkaz, tak se sama vypne.. Proto se to snažím obejít
tím, že budu v nějakém intervalu kontrolovat funkci sessionStorage.klik
jestli je true nebo false a podle toho se ta obrazovka zapne nebo vypne... z
toho důvodu tuto proměnnou chci uložit jako globální a na Tvou radu jí
ukládat do cookies
Ale nejspíš pořád někde dělám chybu a nemůžu na to přijít Ale moc si vážím toho, že mi
věnuješ tolik času
Dobra, takze nazornou ukazku s tvym kodem a uvidime, co najdu.
Validator html kodu https://validator.w3.org/#…
Button tag je odesilaci tlacitko. Kdyz ho kliknes, ihned nacita novou
stranku.
ctrl+shift+j (webdeveloper - chybova konzola)
JS konzola mi vypisuje, ze odmita sputit full screen, pokud neni vyvolan
uzivatelem.
<!DOCTYPE html>
<html>
<body>
<!--p><button onclick="klikk()" type="button">Klikni!</button></p>
<p><button onclick="storno()" type="button">Stornuj me!</button></p>
<p>Hodnota promenne:</p>
<p id="demo"></p-->
<p><input type="button" onclick="klikk()" value="Klikni!"></p>
<p><input type="button" onclick="storno()" value="Stornuj me!"></p>
<pre id="log"></pre>
<script>
function vypis(str) {var el = document.getElementById("log"); el.innerHTML += str+"\n";}// + el.innerHTML;}
// nastavi pri nacteni stranky jednorazove promennou klik na false
// nadefinuje funkce klik() a storno() pro jejich pozdejsi spusteni pri stisknuti prislusneho buttonu
function klikk() {
// if (sessionStorage.klik) { // neodpovida dokumentaci pro sessionStorage! https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage
// a proc to chces nastavovat true, kdyz uz to true je?
// nastavi promennou klik na true
// sessionStorage.klik = true; //neodpovida dokumentaci pro sessionStorage!
sessionStorage.setItem("klik", true);
// }
// nasledne zobrazi nastavenou promennou abych videl, ze se zmenila
// document.getElementById("demo").innerHTML = sessionStorage.klik;
vypis('klikk, session = ' + sessionStorage.getItem("klik"));
}
function storno() {
// sessionStorage.klik = false;
sessionStorage.setItem("klik", false);
// document.getElementById("demo").innerHTML = sessionStorage.klik;
vypis('storno, session = ' + sessionStorage.getItem("klik"));
}
// tuto funkci fullScreen vyvolávám každých 5 vteřin viz na začátku funkce setInterval()
function fullScreen() {
vypis('FS, function run');
// pokud je promenna klik true, tak nastavi webovou stranku na celou obrazovku pokud tak jiz neni nastaveno
// if (sessionStorage.klik == true) { // ??? dve rovnitka!, a neodpovida dokumentaci pro sessionStorage!
vypis('FS, session is ' + sessionStorage.getItem("klik"));
//console.log(JSON.stringify( sessionStorage.getItem("klik") ))
if (sessionStorage.getItem("klik")=='true')
{
vypis('FS, session is true');
console.log(document.fullscreenElement)
// if (!document.fullscreenElement) {
// document.documentElement.requestFullscreen();
if (document.fullscreenElement!=true) { // je to null
document.documentElement.requestFullscreen();
vypis('FS, fullscreen go ON');
}
} else {
vypis('FS, session is false');
// pokud je promenna klik false, tak spusti vypnuti cele obrazovky.. predpokladam ze je jedno, jestli je cela obrazovka aktivni nebo ne
// if (document.exitFullscreen) {
// vypis('FS, function exist(document.exitFullscreen)==true');
// document.exitFullscreen(); // tady to pise error, ze chces ukoncit FS, kdyz nejsi ve FS
if (document.fullscreenElement==true) {
if (document.exitFullscreen) {
vypis('FS, fullscreen go OFF');
document.exitFullscreen();
}}
}
}
sessionStorage.klik = false;
vypis('start, session = ' + sessionStorage.getItem("klik"));
// zobrazi nastavenou hodnotu false, abych videl ze vse funguje
//document.getElementById("demo").innerHTML = sessionStorage.klik;
// nastavi spousteni funkce fullScreen kazdych 5 vterin
setInterval(fullScreen, 5000);
fullScreen()
</script>
</body>
</html>
Nejvetsi zaludnost byla v tom radku porovnani a s tim error radkem to take
nemuselo jet.
if (sessionStorage.getItem("klik")=='true')
Ale, nejsem si uplne jisty, proc? Proc se neulozil boolean true? Proc se to
ulozilo jako string 'true'? A mozna by stalo za to zjistit, zda se ulozil false
jako 'false' nebo prazdny string '' ?
Zatím jsem si jen letmo projel, co jsi mi psal.. až budu mít víc času,
tak to projedu podrobně a dám vědět
Každopádně ten zápis do session jsem čerpal odsud, kde je úplně dole
příklad.. Používají to úplně stejně na počet kliků..
Přišlo mi to jako jednodušší zápis než to co popisují nahoře stejně
jako ty..
https://www.w3schools.com/…lstorage.asp
Pozor, w3school jsou soukrome stranky, ktere napatri zadnemu vyrobci browseru, ani nespadaji pod organizaci w3c. Me zkusenosti jsou spis negativni. 90% veci treba bude fungovat, ale ten zbytek maji spatne.
if (localStorage.clickcount) {
localStorage.clickcount = Number(localStorage.clickcount) + 1;
} else {
localStorage.clickcount = 1;
}
Jestli myslis tento priklad, tak ten dela uplne neco jineho. Aspon si mysli, ze to dela neco jineho.
// tohle je obdobny kod
x = {}; // nebo localStorage = {};
x.setItem = function (name, value) {...}
x.getItem = function (name) {...}
x.cokoliv = neco // cokoliv je cokoliv jineho nez setItem getItem
Timto zpusobem si muzes ukladat do kazdeho existujiciho objektu. Ale, po opusteni stranky se to ztrati, protoze to neni v definici te funkce.
Nahore mas priklad pouziti storage, ktere by melo fungovat vzdy. Protoze to
odpovida zapisum z dokumentace k prohlizeci Firefox. Pro IE by ses musel podivat
na ms stranky. Pro chrome na chrome stranky... Teoreticky to maji vsichni
stejne. Tak ze 70% nee
https://developer.mozilla.org/…localStorage
localStorage.setItem("lastname", "Smith");
localStorage.getItem("lastname");
Problém je, že některé prohlížeče ti neumožní jednoduše přepnout do fullscreenu. Můžeš přepnout do fullscreenu jen tehdy, pokud uživatel provedl nějakou akci na stránce (kliknul myší nebo stisknul nějakou klávesu). Není to jen u fullscreenu, ale například i u audia. Takže pokud chceš dát stránku do fullscreenu, tak ti interval nepomůže, ale musíš to udělat nějak takto:
<script>
function click(){ // Metoda vyvolaná tlačítkem/kliknutím myši/stisknutím klávesy
fullscreen(); // Metoda, která ti dá dokument/element do fullscreenu
}
</script>
Odkaz tě redirectne na novou stránku, kde musíš fullscreen znovu vyvolat (kliknutí,...).
Já jsem s tím měl občas také problém, tak můžeš vyzkoušet ještě jedno řešení: Můžeš si vytvořit novou stránku (např. fullscreen.html). Do této stránky dáš <iframe src="https://example.com/stranka"></iframe> a <button onclick="fullscreen()">Fullscreen</button>. Iframe nastyluješ, aby byl přes celou stránku, popřípadě skryješ scrollbary, atd. Po kliknutí na tlačítko se dá do fullscreenu fullscreen.html. Pokud uživatel klikne na odkaz v https://example.com/stranka, tak ho to redirectne uvnitř iframu, ale fullscreen.html by měl stále zůstat ve fullscreenu.
Pokud budeš chtít, tak můžeš udělat něco jako "povolte cookies" a po kliknutí na tlačítko "povolit" nebo "zrušit" se dá stránka do fullscreenu.
Zobrazeno 15 zpráv z 15.