Autor Zpráva
Chamurappi
Profil
Čtu si o Otevírání nového okna JavaScriptem a co nevidím:

Jestliže se jako hodnota tohoto druhého parametru použije prázdný řetězec, prohlížeč to pochopí jako nové nepojmenované okno. Je to tedy to, co je v html target="_blank". Uvedení hodnoty "_blank" jako jméno rámu v metodě window.open je chybné, protože hodnota nesmí začínat podtržítkem. Paradoxně to sice v mnoha prohlížečích funguje správně, protože prohlížeč chybnou hodnotu považuje za prázdnou a otevře nové nepojmenované okno.

Toto je tedy chybný zápis:
window.open("url", "_blank", "volby")

Omlouvám se čtenářům, neboť právě tuto chybu jsem tu měl po šest let uvedenou jako správnou pro otevírání nového nepojmenovaného okna (aktualizace 2008).

V patičce je psáno „poslední aktualizace 23. srpna 2008“, z čehož usuzuji, že se Yuhů nechal přesvědčit petem, který své bludy zarputile šíří jako komár malárii. To zírám…

Potěšilo by mne, kdyby zde Yuhů uvedl zdroje, ze kterých vycházel, a postupy, kterými si prověřil výše uvedenou „opravu“.
Bubák
Profil
Pro informaci, na stránce s rámy fungují další hodnoty začínající podtržítkem, jako _self, _top, _parent podle očekávání, tedy úplně stejně, jako obyčejný odkaz s targetem.
Také hodnota _blank funguje podle očekávání. Jediná pravdivá informace, která byla k bludu přibalena, čímž vznikla nebezpečná polopravda je, že je možné použít prázdný řetězec.

Dodatek
Spesl info pro peta, ani JS konzola nic nehlasi
Bubák
Profil
Na MSDN, narazil jsem na tohle:
http://msdn.microsoft.com/en-us/library/ms536651(VS.85).aspx

Na MDC a našel jsem:
http://developer.mozilla.org/en/DOM/window.open
Je to dlouhé počteníčko, pro urychlení doporučuji v textu hledat řetězec "_blank".

Chamurappi
Předpokládám, že znáš, ale tajně doufám, že si to přečte i peta a možná tomu i porozumí.
peta
Profil
uz jsme se o tom jednou bavili
http://diskuse.jakpsatweb.cz/index.php?action=vthread&topic=40352&foru m=8&page=-1
a vim, ze jsem tento problem resil aspon 10x u starsich prohlizecu. Nechapu, o co ti ted jde. Podle mne, rozhodne lepsi bude, kdyz tam nebude uvadet koniny typu _blank, protoze prazdny retezec je spravne reseni.
adresace parent se preci dela
window.parent a ne window.open(url,'_parent')
a kdyz uz bych to napsal takto, tak by se tim pak museli dat zmenit rozmery hlavniho okna, coz mi prijde trosku na hlavu, nemyslis?
Bubák
Profil
vim, ze jsem tento problem resil aspon 10x u starsich prohlizecu.
Hlaste jména a verze! Nebo je to stále stejné oblíbené mlžení?


adresace parent se preci dela
window.parent a ne window.open(url,'_parent')

Teď se nebavíme o adresaci okna, nezačínej zase mlžit.
Téma jsou přípustné názvy okna opevřeného pomocí window.open. Zdůvodnění pro to, že podle mého předpokladu fungují názvy jako jako _self, _top, _parent a "kupodivu" bez hlášky v JS konzole, nemáš.

MSDN uvádí pro window.open tyto spesl názvy (viz odkaz výše):
_blank, _media, _parent, _search, _self, _top
Pro každý z těcho speciálních názvů popisuje chování (v přehledné tabulce), tak tu neblábol, že adresace okna se dědá jinak. Adresace okna je totiž něco jiného.

Citace z MDC, viz odkaz výše:
If you want to open a new window on every call of window.open(), you should use the special value _blank for strWindowName.
Volný překlad: "Pokud chcete otevřít v novém okně při každém volání window.open (), měli byste používat spesl hodnotu _blank pro retezecOknoJmeno.
Joker
Profil
peta
No jasně.
"Vím, že jsem někde četl, že to takhle nejde. Určitě mi to v nějakém starém prohlížeči nefungovalo. A dokaž, že nemám pravdu" ...a oponent aby znal obsah celého Internetu a vlastnil všechny prohlížeče.

Uděláme to jinak:
Nějaký dokument s alespoň částečnou autoritou, podle kterého "_blank" není přípustná hodnota parametru metody window.open? Nějaký konkrétní prohlížeč, ve kterém to nefunguje? Jakýkoliv konkrétní důkaz?

Já to vezmu z druhé strany.
Javascript: ten parametr je řetězec a navíc JS si na datové typy stejně moc nehraje. Hodnota "_blank" je z principu přípustná. Záleží tedy na implementaci v prohlížeči.
Microsoft: (viz odkaz, co posílal Bubák) _blank The sURL is loaded into a new, unnamed window.
Mozilla: (viz druhý odkaz, co posílal Bubák) If you want to open a new window on every call of window.open(), you should use the special value _blank for strWindowName.
Opera: ta dokumentaci k JS nemá, ale "_blank" samozřejmě funguje.
KHTML: pokud vím, tam to funguje taky.
...což pokrývá všechny prohlížeče obvykle měřené statistikami návštěvnosti (podle TOPlistu celkem 99,97% trhu).

Jestli to samotný Yuhů skutečně přepsal na základě nějakého příspěvku, který napsal peta, jen to dokazuje, jak moc nebezpečné takovéhle polopravdy jsou.
Bubák
Profil
Podle mne, rozhodne lepsi bude, kdyz tam nebude uvadet koniny typu _blank
Zatím pořád nechápu, proč je to konina.

protoze prazdny retezec je spravne reseni
Nikdo netvrdil, že by prázdný řetězec byl chybě. Já mám za to, že správné hodnoty pro nové, nepojmenované okno jsou dvě, prázdný řetězec "" a "_blank".
Chamurappi
Profil
Ve vedlejším vlákně peta uznal, že „trosku prestrelil, ze to tam nemuze byt“ a také, že hodnota „_blank“ se v praxi používá.

Ještě doplním Jokerův výčet zdrojů o návrh HTML 5, tam se o window.open píše:
• „The second argument, target, specifies the name of the browsing context that is to be navigated. It must be a valid browsing context name or keyword. If fewer than two arguments are provided, then the name argument defaults to the value "_blank".“
• „A valid browsing context name or keyword is any string that is either a valid browsing context name or that case-insensitively matches one of: _blank, _self, _parent, or _top.“
• „A valid browsing context name is any string with at least one character that does not start with a U+005F LOW LINE character.“

Všem je tu tedy jasné, že „_blank“ je správně a že funguje.
Všem je též jasné, že prázdný řetězec funguje.


Reaguji na peta:
protoze prazdny retezec je spravne reseni
Na to jsi přišel jak? Když jsem potkal prázdný řetězec poprvé, moc jsem mu tenkrát nedůvěřoval.

Microsoft nezmiňuje prázdný řetězec jako právoplatný argument.
Mozilla také nezmiňuje prázdný řetězec jako právoplatný argument.
Ty sám říkáš, že „smi obsahovat pouze znaky AZaz90 a musi zacinat pismenem“, čemuž prázdný řetězec neodpovídá.
Návrh HTML 5 požaduje, aby název okna měl alespoň jeden znak.

Můžeš mi, prosím, vysvětlit, kde jsi sebral, že je prázdný řetězec správně? (Nepopírám, že také funguje.)


Reaguji na Jokera:
Jestli to samotný Yuhů skutečně přepsal na základě nějakého příspěvku, který napsal peta
Najde-li peta chybu, píše poučné e-maily. Znám to z vlastní zkušenosti :-)
Teď prý ještě napíše výrobcům prohlížečů, aby odebraly podporu pro podtržítkové konstanty. Potom možná osloví i konsorcium, aby si opravilo specifikace. Takto se vyrábí svět podle peta.
Bubák
Profil
Jěště co jsem našel na MDC - http://developer.mozilla.org/en/DOM/window.open
DOM Level 0. window.open() is not part of any W3C specification or technical recommendation.
Takže to je ta dokumentace.

Můžeš mi, prosím, vysvětlit, kde jsi sebral, že je prázdný řetězec správně?
Já to našel tady (pokud jsem to dobře přeložil):
If a window with the name strWindowName already exists, then, instead of opening a new window, strUrl is loaded into the existing window. In this case the return value of the method is the existing window and strWindowFeatures is ignored. Providing an empty string for strUrl is a way to get a reference to an open window by its name without changing the window's location. If you want to open a new window on every call of window.open(), you should use the special value _blank for strWindowName.

Pokud správně chápu, co se píše na MSDN http://msdn.microsoft.com/en-us/library/ms536651(VS.85).aspx , tak jméno okna je volitelné. Z toho odvozuji, že prázdná řetězec je přípustná hodnota. Zatím jsem však nenašel, jak se má prohlížeč (v tomto případě pochopitelně IE) chovat.
Chamurappi
Profil
Reaguji na Bubáka:
Zvýrazněný „empty string“ na MDC se vztahuje ke strUrl, což je první argument metody window.open (to jest adresa).
Vestavěné metody prohlížečů většinou hledí na počet a typ argumentů. Nejsou tak rozvolněné jako uživatelsky definované funkce, rozlišují mezi argumentem neuvedeným a prázdným/nulovým/nepravdivým. To je i případ metody window.open. Dám-li jako druhý argument null, false nebo 0, chová se jinak, než při prázdném řetězci — vytváří okna se jmény „null“, „false“ a „0“.

Vtip bude asi v tom, že výchozí jméno normálně uživatelsky otevíraných oken je prázdný řetězec (viditelný v proměnné window.name, viz MDC a MSDN). Při rozpoznávání, jestli už okno/rám daného jména existuje, se prohlížeč kouká na známá window.name a ignoruje ta s výchozí hodnotou. Otevřu-li pomocí window.open okno se jménem rovným prázdnému řetězci, zapadne vesele mezi ostatní anonymní okna a už nikdo nikdy nezjistí jeho hanebný původ.

Nikde není definováno, že výchozí jméno okna musí být zrovna prázdný řetězec. Kdyby bylo jiné, mohlo by existovat jen jedno okno se jménem „“ a opakovaná volání by neotvírala nová okna. Je-li tato hypotéza správná, funguje petův postup sice spolehlivě, ale jen náhodou.
Bubák
Profil
Chamurappi
Zvýrazněný „empty string“ na MDC se vztahuje ke strUrl
To jsem přehlédl, příště budu pečlivější :o)
Yuhů
Profil
Pokud mi někdo reportuje chybu, mám tendenci věřit spíše reportérovi než sobě. Ano, psal mi Peter.

Ověřování můžu udělat jenom u prohlížečů, ve kterých aktuálně testuju. Ve všech se oba zápisy chovaly úplně stejně, ale říkal jsem si, že nemůžu vyloučit, že to v nějakém jiném starším neblbne.

Chamurappi, díky za kontrolu. Udělám asap další aktualizaci. Poučení si z toho beru to, že bych měl více ověřovat.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0