Portál AbcLinuxu, 30. dubna 2025 15:18
Dneska jsem se z blogy rozjel . Ale tohle si prostě zapsat musím, protože mi řešení zabralo poměrně dlouho a navíc nejsem kovaný v Javascriptu (respektive v rozdílech mezi jednotlivými prohlížeči).
O co jde. Máme okno A, ze kterého otevřeme (pomocí JS) okno B. V okně B je jistý dlouhý seznam a okno B poskytuje funkce jako filtrování, hledání, řazení a podobné. Když je uživatel spokojen a vybere nějaký prvek, je třeba nějakým způsobem vrátit jeho identifikaci zpět do okna A. Celá webová aplikace bude nejčastěji používána v MSIE, ale vývoj probíhá na Firefoxu (WebDeveloper, HTML Validator, Tamper Data a spol jen tak nenahradíš), proto je nezbytné, aby uvedená věc fungovala i v něm (jinak se odřízneme ).
Máme soubor caller.html
, který poskutuje funkci update
, kterou volá funkce z druhého souboru dialog.html
. Hned prvním problémem je otevření modálního dialogu, kterouž funkci poskytuje jen IE. Mozilla based prohlížeče používají parametr modal=yes
funce window.open()
. Takže se nám kód hezky rozdvojí (a čert ví, jak tohle zvládnou ostatní prohlížeče).
function modalWin(url) { if (window.showModalDialog) { // IE window.showModalDialog(url,window, "dialogWidth:255px;dialogHeight:250px"); } else { // non IE ... zalomeno window.open(url,window, 'height=255,width=250,toolbar=no,directories=no, status=no,menubar=no,scrollbars=no, resizable=no,modal=yes'); } } function update(text) { document.getElementById("spam").innerHTML = text; }
Zpětná cesta byla horší, protože většina návodů řešila situaci pouze v jediném správném prohlížeči, který neumí korektně pracovat s png obrázky. Nakonec jsem našel nápovědu na w3schools.com a po pár pokusech ze mě vypadlo tohle
function getInfo() { var win; if (window.dialogArguments) { win = window.dialogArguments; } else { win = window.opener; } win.update('Zmeneny text!'); }
Laskavý čtenář si potřebný HTML kód jistě doplní sám .
Tiskni
Sdílej:
widthVal = 350;
heightVal = 280;
leftVal = (screen.width / 2) - (widthVal/2);
topVal = (screen.height / 2) - (heightVal/2);
date = document.getElementsByName(input2Fill)[0].value;
window.open(url, title, "width="+widthVal+", height="+heightVal+", left="+leftVal+", top="+topVal);
Pokud vím, abyste mohl v Mozille&spol. použít volbu modal=yes, musí mít skript privilegium UniversalBrowserWrite, jinak to nefunguje, a toto privilegium si může vyžádat pouze podepsaný skript.
Jak jste se s tím popral? Jde to nějakým lokálním nastavením prohlížeče obejít, nebo je nutno absolvovat kalvárii s podpisem skriptu? Mi by se to pro nějaké interní firemní aplikace občas taky hodilo, ale námaha na vytváření podepsaných skriptů mi přijde pořád ještě větší, než potencionální efekt...
Aha.
No tak se hlavně ve FF nedivte, že i přes nastavení modal=yes se to okno nechová modálně, chyba není ve vašem skriptu . Pro účely ladění můžete "skoromodální" chování nasimulovat volbou dialog=yes.
Nasimulovat modální dialog DIVem asi není zas až takový problém, víceméně to celé obsloužíte CSSkem.
Nicméně by mě zajímalo, pokud to někdo tuší, jak přes JS přinutit stránku, aby si něco stáhla ze serveru.
Napadá mě například takováto situace: Mám selectbox se seznamem čehosi (kategorie výrobku), vyberu kategorii a chci, aby se onchange naplnil jiný selectbox, řekněme s typem výrobku. To samozřejmě lze ošetřit, ale já bych navíc chtěl, aby si ten handler události onchange teprve sám ze serveru přečetl, co má vlastně zobrazit podle předchozího výběru, nechcu mít "předčtené" všechny varianty.
V zásadě bych chtěl udělat něco jakoby prvek.innerHTML="http://...". Samozřejmě je možná jakákoliv jiná varianta řešení, ten JS si může požádat o cokoliv jakkoliv a server mu taky může doručit cokoliv jakkoliv, takže je mi celkem jedno, jak přesně se to udělá, jde mi jenom o to, jestli to vůbec jde udělat.
Cíleně jsem sice nepátral, ale na první ani druhý pohled jsem nic podobného nenašel.
Jo, to je přesně ono
window.XMLHttpRequest je to, co jsem potřeboval slyšet, že tomu říkají AJAX a vedou kolem toho hafo řečí, to je mi šumafuck. Díky.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.