Autor Zpráva
BedrichVeverka
Profil
Potřeboval bych vytvořit modální dialog podobný tomu, jako je v příkladech na tomto webu ( Modální dialog), ale který by obsahoval tlačítka, která po stisknutí nejen že zavřou dialog, ale která i stránku, ze které byl dialog zavolán, změní na nějakou jinou (chci v tom dialogu mít těch tlačítek víc a potřeboval bych, aby pokud uživatel stiskne první tlačítko, aby se htm stránka, ze které byl zavolán modální dialog, změnila např. na test1.htm, pokud uživatel stiskne druhé tlačítko, změnila se na test2.htm apod.)
Můžete mi prosím někdo poradit? Děkuji, Bedřich Veverka (bedrich.veverka@seznam.cz)
Keeehi
Profil
Objekt window » Objekt window.location
BedrichVeverka
Profil
Keeehi, diky moc za radu, už se mi to podařilo rozchodit.
Měl bych ještě jeden dotaz. Také se týká modálního dialogu, tak ho vznesu sem do vlákna:

Netušíte proč mi v modálním dialogu nezafunguje window.location.reload(true); ?
Když si html toho modálního dialogu otevřu jako normální html okno, zafunguje mi tam bez problémů.
Problém nastane, když to samé html zavolám jako modální dialog - tam mi to prostě nezafunguje, nevíte někdo proč?

Resp. možná že by můj problém šel vyrešit nějak jinak: potřebuji do modálního dialogu dát rádia tlačítka a vedle každého rádia obrázek a chtěl bych, aby když uživatel klikne na obrázek vedle rádia, aby se rádio přeplo stejně jako když na něj uživatel klikne přímo (tzn. aby vybrané rádio bylo to vedle toho obrázku, na který jsem klikl). Takže jsem ten obrázek udělal jako odkaz do kterého jsem vložil funkci javascriptu, která mi přenastaví proměnnou, kterou používám pro nastavení vybraného radia při startu dialogu. Takže poté, co tu proměnnou přenastavím, potřebuji ještě refreshovat celou stránku. Což mi krásně zafunguje je-li stránka zobrazena v prohlížeči normálně, ale když tu stránku zobrazím pomocí showModalDialog, nerefreshuje se mi. Možná to refreshuje tu mateřskou stránku toho dialogu? Čili nevíte prosím někdo jak refreshovat modální dialog? Resp. nenapadá vás nějaké jiné řešení toho mého problému?
Děkuji, Bedřich Veverka (bedrich.veverka@seznam.cz)
Keeehi
Profil
BedrichVeverka:
Použij label. Žádný javascript není potřeba.

Ještě bych chtěl upozornit na to, že modální dialog tak, jak ho provozuješ ty není správný přístup. blog.chromium.org/2014/07/disabling-showmodaldialog.html
BedrichVeverka
Profil
Keeehi, diky moc. Ja tusil, ze to pujde nejak jednodušeji... ; - )
A mas pravdu, používat modalni dialog není nejstastnejsi reseni, Chrome uz to nepodporuje dneska (prestoze z toho odkazu jsem pochopil, ze to vypnou cca az v kvetnu)... Kazdopadne mi ty rady pomohly, diky moc.
B.V.
BedrichVeverka
Profil
Měl bych ještě jeden drobný dotaz:
Šlo by nějak zařídit, aby modální dialog reagoval na stisknutí klávesy Esc stejně jako na stisknutí křížku myší, tzn. tím, že by se zavřel?
(ano, chápu, že modální dialogy jsou, soudě podle toho předešlého odkazu, mrtvé, nicméně i přes to bych rád věděl, jestli v prohlížečích, které je ještě podporují, se to dá nějak zařídit).
Díky, B.V.
Keeehi
Profil
Tohle by mělo být ono, ovšem nemám to na čem ověřit.
window.document.onkeydown = function (e) {
  if (!e) e = event;
  if (e.keyCode == 27)
    window.close();
}

Patří to dovnitř do toho okna.
BedrichVeverka
Profil
Keeehi, díky moc, funguje to přesně tak, jak jsem potřeboval.

Kromě escape (kod 27) odpovídající stisku tlačítka Cancel jsem si tam ještě vrazil enter (kod 13) odpovídající stisku tlačítka OK. A zdá se, že to jde používat nejen v modálním dialogu, ale jako klávesové zkratky i na všech ostatních stránkách k přejití na jinou stránku (např. pomocí if (e.keyCode == 69) window.location.href = "index_en.htm"; se mohu přepnout po stisku klávesy E do anglické verze).

Což mě vede oklikou k mému dotazu z 26. 2. 2015, 20:08:49 - jasně tam jsem žádný javascript nepotřeboval, šlo to vyřešit elegantně pomocí labelu. Ale teď mě ještě napadlo, že by se mi líbilo, aby v tom modálním dialogu po stisku např klávesy E se mi nastavil fokus těch rádio tlačítek na tlačítko English. Čili potřeboval bych napsat nějakou funkci (zde se asi bez javascriptu neobejdu?), která by způsobila, že se vybere určité radio tlačítko aniž by na něj uživatel přímo myší klikl. Bohužel se mi zatím nedaří přijít na to jak.
Existuje nějaké řešení?

Díky, B.V.
Kubo2
Profil
accesskey='E'
Keeehi
Profil
Ano, odchytávání kláves funguje všude. On ten modální dialog je vlastně taky stránka, jen zobrazená v menším okně. Dají se samozřejmě odchytávat i kombinace kláves jako třeba ctrl + c a navazovat na to vlastní akce. Je to však třeba dělat s rozmyslem. Obzvlášť právě u odchytávání kláves společně s ctrl a/nebo alt. Může se totiž lehce stát, že tím přepíšete nějakou z klávesových zkratek prohlížeče. A že jich každý prohlížeč má. A navíc každý má určitou část trochu jinak. A hlavně klávesové zkratky je dobrý vytvýřet jen tehdy, když to má smysl. Pokud nějaký formulář člověk vyplní jen jednou za život, nemá to smysl. Uživatel neví, že taková funkcionalita existuje a než by to zjistil, nebo si o tom v nějaké nápovědě přečetl, stihl by te fromulář už desetkrát odeslat. Co se třeba dá třeba u blogu navázat klávesu J na zobrazení staršího článku a klávesu K na zobrazení článku novějšího. Proč zrovna J a K? Netuším kde to vzniklo, ale třeba Facebook, Google+, Twitter, 9gag to používají pro procházení příspěvků. Tím chci hlavně říct, že když už něco takového vytvářet. A vždy podle cílové skupiny uživatelů. Podle toho, na co jsou zvyklí oni. Pokud ji neznáte a neznáte zvyky svých uživatelů, pak je dobré kopírovat od velkých hráčů. Máte největší šanci, že se to bude prolínat. Ale vždy hlavně s rozumem.
BedrichVeverka
Profil
Keeehi, jasně, přepsáním ctrl+písmenko nebo alt+písmenko bych mohl přepsat něco, co někdo používá, ale přepsáním jen toho samotného písmenka (bez ctrl resp. alt) bych snad nic přepsat neměl, to snad žádný prohlížeč nepoužívá - nebo ano?
Každopádně jasně, používat s rozmyslem.

Čímž se dostávám k té radě, kterou mi dal Kubo2:

Díky Kubo2, ten accesskey jsem rozchodil, chvíli mi teda trvalo, než jsem přišel na to, že to funguje na alt+písmenko. A navíc jsem zjistil, že to nefunguje ve všech prohlížečích. Já bych ale chtěl, aby se to radio zaplo po stisku jen písmenka. Čili pomohlo by mi, kdybych byl schopný to radio zapnout přece jen nějak javascriptem - pak bych stisk samotné klávesy E odchytnul tím if (e.keyCode == 69) NastavRadio(2); a mělo by to fungovat. Ale neumím napsat tu funkci NastavRadio(kodJazyka). Nešlo by to radio tedy přece jen nějak zapnout javascriptem?

Díky, B.V.
juriad_
Profil *
Keeehi:
J a K pochazi z konzoloveho editoru vi z dob unixu. Tehdy jeste neexistovaly kurzorove sipky a pohyb byl realizovan klavesami hjkl a mnoha dalsimi.
Keeehi
Profil
Nějak takto by to mohlo fungovat.
<form>
    <label><input type="radio" name="jazyk" value="1">Čeština</label>
    <label><input type="radio" name="jazyk" value="2">English</label>
</form>

function NastavRadio(value) {
    var elements = document.getElementsByName('jazyk');

    for (var i=0, len=elements.length; i<len; ++i) {
        if (elements[i].value == value) {
            elements[i].checked = true;
            break;
        }
    }
}

Ale možná by bylo jednodušší než konstruovat tu funkci těm radio-inputům přiřadit idčka a pak prostě volat
document.getElementById('idecko-cestiny').chcecked = true;
Samozřejmě to není vhodné všude ale někde to stačí.

juriad:
Že to tak bylo a je ve vi-mu vím. Měl jsem spíš na mysli, kdo s tím přišel jako první. Ale to je detail.
BedrichVeverka
Profil
Keeehi, díky, funguje to přesně tak jak jsem potřeboval.

A v tuhle chvíli snad už poslední problém:
Nedaří se mi v některých prohlížečích, konkrétně v Exploreru a Safari docílit toho, aby se obsah iframe zobrazoval v odstínech šedi.
Pokusil jsem se o to tím, že iframe jsem obalil tímto divem: <div style="filter: gray; filter: grayscale(1); webkit-filter: grayscale(100%); -webkit-filter: grayscale(1);"> ... </div> - narval jsem do těch jeho atributů všechno možný, co jsem na internetu našel a co by mohlo zajistit kýžený výsledek, ale Explorer (a i Safari) je ke všem těm takto použitým atributům vytrvale rezistentní... (Chrome, Opera a Mozilla reagují správně.)
Obsah iframe nemohu ovlivnit, přesto bych chtěl, aby se zobrazoval v odstínech šedi. Netušíte prosím někdo zda se dá i IE přinutit, aby zobrazoval obsah takovéhoto iframe v odstínech šedi?

Díky, B.V.
Keeehi
Profil
grayscale a explorer se řeší zrovna o pár témat vedle Zešednutí obrázku uvnitř odkazu
BedrichVeverka
Profil
Keeehi, díky moc za rady, moc mi to pomohlo.
B.V.
Keeehi
Profil
Ve vedlejším tématu jste zmínil odkaz na bratranciveverkove.cz tak se ještě vrátím a rád bych zopakoval, že pokud chcete odchytávat klávesy, tak to musíte dělat pořádně nebo vůbec! Rozhodl jste se odchytávat klávesu L a při jejím zmáčknutí přesměrovat na změnu jazyka. S problémem to nesouvisí ale musím to zmínit - je to zbytečnost, nejspíš to nikdo nikdy nepoužije a pokud ano tak jen jednou jelikož jazyk si lidé většinou zběsile nemění každých pět minut. To proč píšu je to, že jste to implementoval špatně. Vaše implementace sice správně odchytává L, ovšem odchytává i kombinaci ctrl + L které by si už všímat neměla. Samozřejmě se to může týkat i jiných zkratek, to jsem už nezkoumal.
BedrichVeverka
Profil
Keeehi, díky za upozornění - toho, že to odchytává i kombinaci ctrl+L jsem si nevšiml a nezamýšlel jsem, aby se to takto chovalo. Dá se to nějak ošetřit, aby to ten ctrl+L neodchytávalo? (pomiňme teď to, že dialog změny jazyka by stačilo umožnit zavolat jen myší).
Mám tam tento kód:
<script>
  window.document.onkeydown = function (e)
    { if (!e) e = event;
      if (e.keyCode == 76) DlgJazyk();
    }
</script>
- předpokládal jsem, že to odchytne jen stisk klávesy L (a teď jsem ještě zjistil, že to odchytává i alt+L a to taky nechci). Dá se nějak zařídit, aby to odchytávalo čistě jen to L?
Díky moc, B.V.
Chamurappi
Profil
Reaguji na BedrichaVeverku:
Stavové klávesy jsou jako boolean uložené uvnitř e.ctrlKey, e.altKey, e.shiftKey, e.metaKey (tuhle poslední má jen Mac). Samotné písmeno je stisknuté, pokud jsou všechny false.
BedrichVeverka
Profil
Chamurappi, díky, ale nějak se mi to nedaří rozchodit. Zkusil jsem např. toto:
<script>
  window.document.onkeydown = function (e)
    { if (!e) e = event;
      e.ctrlKey = false;  // e.ctrlKey=e.altKey=e.shiftKey=e.metaKey=false;
      if (e.keyCode == 76) DlgJazyk();
    }
</script>
a to v IE způsobí, že se sice neodchytne ctrl+L, ale neodchytne se ani to samotné L.
Použil jsem to nějak špatně?
Chamurappi
Profil
Reaguji na BedrichaVeverku:
Co si myslíš, že by nastavení do těch vlastností mělo dělat? Praštit uživatele přes prsty, aby Ctrl pustil? Když chceš vědět, jestli stisknutá klávesa má číslo 76, tak přeci také nespouštíš e.keyCode = 76
BedrichVeverka
Profil
Chamurappi: Jo, přesně to jsem myslel, že prohlížeč udělá ; - ) OK, tvá ironie je namístě, myslel jsem si blbost - a sice to, že to např. ctrlKey je nějaký atribut, který se dá nastavit na true / false a podle toho pak prohlížeč vyhodnocuje zda se za stisk klávesy L považuje i ctrl+L. Ale už mi to došlo a po implementaci správného kódu: if ((e.keyCode == 76) && (e.ctrlKey == false)) DlgJazyk(); mi to už tam funguje tak jak jsem chtěl.

Keeehi: Už by to tam mělo odchytávat jen to samotné L. Je pravda, že to tam je zbytečné a asi to nikdo nepoužije, ale když už to odchytává jen to samotné písmenko, nemělo by to snad už ničemu vadit, není-liž pravda?

Ještě jednou díky všem za pomoc.
Chamurappi
Profil
Reaguji na BedrichaVeverku:
Už by to tam mělo odchytávat jen to samotné L.
A také Shift+L a Alt+L… na Macu se místo Ctrl běžně používá ta klávesa, která je v metaKey, takže tam to bude stejně otravné, jako kdybys na zbytku platforem chytal Ctrl+L.

myslel jsem si blbost - a sice to, že to např. ctrlKey je nějaký atribut, který se dá nastavit na true / false a podle toho pak prohlížeč vyhodnocuje zda se za stisk klávesy L považuje i ctrl+L
Aha, chápu. Ale to by se pak špatně určovalo, když bys chtěl zachytávat naopak jen samotné Ctrl+L.
Obecně platí, že se vlastnosti na objektu s popisem události navzájem neovlivňují. Chytáš všechny stisky všech kláves a v e je prostě jen kompletní popis stavu…

Mimochodem, pozor na to, kdybys někdy přidal do stránky nějaký formulář (třeba hledání), tak L budeš chytat i při psaní do něj.
BedrichVeverka
Profil
Chamurappi:
" 'Už by to tam mělo odchytávat jen to samotné L.'
A také Shift+L a Alt+L… na Macu se místo Ctrl běžně používá ta klávesa, která je v metaKey, takže tam to bude stejně otravné, jako kdybys na zbytku platforem chytal Ctrl+L."

Teď by to na těch stránkách mělo odchytávat již skutečně jen samotná písmenka, snad i na Macu (pokud by to někomu odchytávalo i jakékoli jiné kombinace kláves, tzn. mnou nezamýšlené, dejte prosím vědět). Asi jsem to v tom minulém příspěvku popsal trochu zavádějícím způsobem, resp. příliš jsem tam zjednodušil ten kód. Ve skutečnosti jsem to použil takto:

function JeSamotnePismenko(e)
{
  if ( ((e.ctrlKey  == false) || (e.ctrlKey  == undefined)) && 
       ((e.altKey   == false) || (e.altKey   == undefined)) && 
       ((e.shiftKey == false) || (e.shiftKey == undefined)) &&
       ((e.metaKey  == false) || (e.metaKey  == undefined))
     ) return true;
  return false;
}

function PriradHorkeKlavesy()
{
  window.document.onkeydown = function (e)
    { if (!e) e = event;
      if ((e.keyCode == 76) && JeSamotnePismenko(e)) DlgJazyk(); // 76 ... L (Language)
      // ... dalsi horke klavesy
    }
}

"Mimochodem, pozor na to, kdybys někdy přidal do stránky nějaký formulář (třeba hledání), tak L budeš chytat i při psaní do něj."

Díky, to mě nenapadlo. V guestbooku http://bratranciveverkove.cz/guestbook_cz.htm jsem to tak použil, ale zdá se, že pokud se uživatel přepne do políčka, do kterého může psát, to L se neodchytne. Možná je to tím, že ten guestbook je vložen přes iframe a v něm ten problém proto nevznikne? A kdybych vložil do stránky nějaký formulář napřímo, ten problém by vzniknul?
(Resp. testoval jsem to teď v IE, Chrome, Opeře, Mozille a Safari a ve všech se to L neodchytne, tzn. chová se to tak jak chci - kdybyste prosím někdo narazil na prohlížeč, který by L odchytnul i když je focus v políčku formuláře guestbooku, dejte mi prosím vědět. Díky.)
Keeehi
Profil
BedrichVeverka:
Možná je to tím, že ten guestbook je vložen přes iframe a v něm ten problém proto nevznikne?
Ano, tím to je.

A kdybych vložil do stránky nějaký formulář napřímo, ten problém by vzniknul?
Ano.
juriad
Profil
BedrichVeverka:
Tu funkce JeSamotnePismenko lze výrazně zjednodušit:
function JeSamotnePismenko(e) {
  return !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey;
}
Je také zvykem začínat názvy funkcí malým písmenem, aby se nepletly s konstruktory.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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