Typografická fičůrka II. (a lépe!)
Když jsem publikoval článek o drobné typografické fičůrce, netušil jsem, jaká překvapení mi tato zdánlivě jednoduchá konstrukce připraví.
Byl jsem varován
Čtu mail. Plaváček si stěžuje, že jeho Internet Explorer tedy můj web nezobrazí, ani kdyby se rozkrájel. Své tvrzení dokládá přesvědčivým obrasejmem, jemuž vévodí rudá chyba monstrózních rozměrů. S neblahým tušením hledám modré „éčko“ a svůj web v něm zkoumám. A opravdu, weblog produkuje javascriptovou chybu. Vzhledem k tomu, že jediný můj javascript na stránkách (nepočítám-li toplistí počítadlo) je nově přidaný kód, který zaručuje neodsazení prvního řádku po nadpisu, jsem doma. Zvědavě nakukuji (ve dvou dnech už podruhé) k Medhimu, který můj kód také implementoval, a zjišťuji, že u něj se chyba neprojevuje. Cítím se méněcenně. Koukám zoufale na původní kód:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Paragraph test</title>
<style type="text/css">
p { text-indent: 2em; }
* html p { text-indent: expression( this.previousSibling.tagName.search(/H[1–6]/) == 0 ? "0": ""); }
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p { text-indent: 0; }
</style>
</head>
<body>
<h3>nadpis</h3>
<p>Lorem ipsum dolor sit amet…</p>
<p>Cras porta…</p>
<p>Sed aliquet…</p>
</body>
</html>
Analýza
Možnou chybu nalézám záhy. Velkomožně totiž v původním skriptu nekontroluji, má-li odstavec vůbec nějakého předchozího sourozence, a rovnou přistupuji k jeho metodám. Přidávám tedy podmínku a testuji na jednoduché šabloně.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Paragraph test</title>
<style type="text/css">
p { text-indent: 2em; }
* html p { text-indent: expression( this.previousSibling ? this.previousSibling.tagName.search(/H[1-6]/) == 0 ? "0": "" : ""); }
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p { text-indent: 0; }
</style>
</head>
<body>
<p>Lorem ipsum dolor sit amet…</p>
<p>Cras porta…</p>
<p>Sed aliquet…</p>
</body>
</html>
Vše funguje k mé spokojenosti, uploaduji tedy mé řešení na server a jdu se přesvědčit, že problém neexistuje. Jenže on existuje nadále. Tomu nerozumím, vrtám se ve zdrojovém kódu a stále jsem nešťastný.
Jádro pudla
Uplynulo mnoho desítek minut. Pozoruji podezřelou konstrukci a říkám si, že tím to přece nemůže být. Wordpress mi generuje číslovaný seznam s komentáři tak, že tag <p> je sourozencem <li> a je tedy přímým potomkem <ol>. Uvědomuji si, že něco takového není přípustné, a inkriminovaný kód zapoznámkuji. Dobrá věc se podařila. Jakýkoliv pokus o přístup k metodám předchozího sourozence se nezdaří, nachází-li se výchozí tag v zakázaném kontextu. Taková věc se však může přihodit komukoliv, odstranit nevalidní konstrukci by nebylo řešení, kód musí být blbuvzdorný. Rozhoduji se tedy k drastickému řešení. Přepisuji javascript z expression do externího HTC souboru, který následně načítám pomocí CSS vlastnosti behavior. V tomto skriptu vypínám výpis chyb a je hotovo. Skript funguje, doufám, bezchybně v IE5+.
Výsledkem jsou dva soubory – HTML a HTC.
test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Paragraph test</title>
<style type="text/css">
p { text-indent: 2em; }
* html p { behavior: url("ie-indent.htc"); }
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p { text-indent: 0; }
</style>
</head>
<body>
<h3>nadpis</h3>
<p>Lorem ipsum dolor sit amet…</p>
<p>Cras porta…</p>
<p>Sed aliquet…</p>
</body>
</html>
ie-indent.htc
<component>
<script>
function stoperror(){
return true
}
window.onerror=stoperror;
if (element.previousSibling != null) { element.previousSibling.tagName.search(/H[1-6]/) == 0 ? element.style.textIndent = "0": ""; }
</script>
</component>
Pakliže budete tento kód používat, nezapomeňte upravit název a cestu k HTC souboru v definici vlastnosti behavior. Upravený kód používám zde na weblogu. Zpozorujete-li jakékoliv neobvyklé chování, informujte mne o tom, prosím. Doufám, že tento druhý díl je zároveň poslední a že tento kód už je víceméně finální.

He, a ja z toho byl tak strasne rozladeny kdyz jsem nemohl rolovat na tve strance pres zmacknute kolecko
Nebo dokonce selektovat
kus textu… Dokonce jsme si na chvili vypnul i JS…!
Omlouvám se, Tomáši, velice se omlouvám. Věř mi však, že Tvoje rozladění byla jen jemná disharmonie proti skřípotu v mé hlavě. :o)
To myslite vazne, neco takovyho kvuli prvnimu odstavci, a jeste do toho tahat htc? Leo
Ano, Leo, myslím. Neříkám, aby se všichni sebrali a začali to používat. Jen ukazuji, jaká úskalí takovýto triviální, základní typografický problém nese a jak je lze překonat.
Proč nepsat i o takových věcech? Dá se říct, že trhám fialky dynamitem, ale nemyslím si, že zcela bezúčelně.
Dobrý příspěvek, nenechte se odradit bručouny.
Skoro bych řekl, že použití htc by bylo vhodné, i kdyby k popisované chybě nedocházelo. Oddělení funkční části webu od obsahu je správný směr. Pokud se ta "funkčnost" týká jenom vzhledu, tím spíše patří mimo hlavní dokument.
"Oddělení funkční části webu od obsahu je správný směr. Pokud se ta "funkčnost" týká jenom vzhledu, tím spíše patří mimo hlavní dokument."
Samozrejme, ale standardnim zpusobem (JavaScript/DOM), ne udelatky jako je htc. A odsazeni prvniho radku neni funkcnost, ale vzhled. Jako cviceni dobry, ale jinak… Leo
Rád se nechám poučit, ale já neznám žádnou jinou metodu jak oddělit důsledně javascript od dokumentu než pomocí HTC. Takže bych tomu neříkal udělátko, ale moc šikovný nástroj.
Díky za ten výzkum a dokonce přímou radu pro mě v minulém článku. Nové řešení se ale už opravdu zdá být možná zbytečně složité pro člověka jako jsem já, který přesná prvidla typografie tolik neuvctívá. Možná se vrátím zpět k neodsazení. ak už zde bylo někde uvedeno, pravidla nejsou porušena, pokud toho nelze nějak rozumě dosáhnout. Budu se tedy utěšova tímto.
Pekne, jen taky nejsem moc zastancem htc reseni. Neslo by ale to osetreni chyb dat primo do expression? Zkusil jsem ho tam pridat… ale nevim, jak nasimulovat ten chybovy stav, cos popisoval.
Já bych si tak přísná kritéria nedával. Pokud chci, aby se výsledek zobrazoval správně, musí být kód v první řadě validní.
<p>jako potomek<ol>není validní ani zdaleka a nic mi nezaručí, že se zobrazí tak, jak očekávám. Podle mě by stačilo tento kód napsat tak, aby fungoval s jakýmkoliv validním HTML.Jakub Vrána: Já třeba ano. CMS může udělat chybu a v takovém případě, kdy je porušena struktura dokumentu, Internet Explorer šílí. V určitých případech nabízí stránku opakovaně k ladění (protože při jakékoliv manipulaci s oknem prohlížeče je třeba expression vykonat znovu) a to je nepřípustné.
Pokud si je někdo zcela jistý, že struktura jeho webu je zcela v pořádku, tak pro něj platí kód, který uvádím v části Analýza.
spud: Zkoušel jsem kvantum metod. Této jsem dával největší šance na úspěch do chvíle, kdy jsem si uvědomil, že v CSS sekvence pravá závorka středník uzavírá definici současné CSS vlastnosti. A opravdu, Explorer přednostně uzavře definici CSS a poté si postěžuje na chybějící závorku v definici funkce. Nedokázal jsem to obejít – na druhou stranu, javascript neovládám nikterak extra dobře, kdybys našel nějakou cestičku, byl bych jen rád.
Dero, musím říct, zajímavé řešení, ale opravdu bych ho v praxi nepoužil. Není přece jenom lepší dát tam tu třídu ? ;o)
Zajímavé, ale prasácké. Jinak musím říct že je fajn že věci dotahuješ do konce.
Čvachta: U menších projektů možná ano, ale u velkých webů plných textů se těchto pár řádek vyplatí. Zvlášť pokud to pravidlo aplikujeme zpětně na hotový obsah.
Zajimavy clanek, zajimavy blog. Ale moje filosofie je, ze kdo chce videt stranky dobre, poridi si adekvatni browser. Kvuli ocazeni prvniho radku tolik tun kodu, a to vsechno kvuli chybe jednoho browseru – nic pro me
Chyba je podle me ze volate DOM property na node jez takovou property ani mit nemusi. Stacilo by pred pouzitim vlastni metody zkotrolovat jestli node tuto property vubec ma. Takze ve Vasem pripade
if (node.tagName !== undefined) { node.tagName == ‚neco na porovnani‘; }
A ano je nutno pouzit identicke porovnani, node.tagName != undefined nebo obecneji !node.tagName nepomuze, ach jo testovat undefined je vubec v javascriptu „radost“.
Hmm koukam ze jsem tam sam zapomel dalsi podminu takze misto node.tagName == ‚neco na porovnani‘; si doplnte jakekoli pouziti node.tagName . :)
048,Rolex – Replica Rolex -
<h1>buy shoesiphone 3gs wholesale无为人生</h1>
<h1>tiffanychina iphonewholesale fashion</h1>
srerwholesale nfl</br>ser wholesale mbt shoes</br>sd wholesale abercrombie</br>fdserr
As days are advancing, more and more Christian Louboutin Shoes recent innovations are brought into these Men's casual
replica watches
replica Maurice Lacroix watches
replica Rolex DateJust<BR
1 shoes: NIKE (air force one, air max, air shox, tn, dunk), Jordan, BAPE, ICECREAM,GUCCI,TIMBERLAND,PRADA,PUMA,JAMES,MEN BOOT,UGG BOOT. wikishoes fashion blog wholesale jordan shoes wholesale puma shoes 2. Apperal: POLO BURBERRY BAPE BBC Evisu EDHARDY, T-shirts; EVISU BAPE BBC D&G A&F Ed-hardy hoodies; EVISU RED MONKEY BAPE BBC jeans. NEW BAPE hat&caps.
3. LV GUCCI CHANEL CHOLE BAPE handbag&wallets.wikishoes fashion blog 4. BAPE ROLEX TISSOT OMEGA wrist watches.air yeezy shoes jordan six rings 5. CHANEL GUCCI LV D&G PRADA sunglasses, there are many new styles and colors for you
hollister uk
hollister ukgood thio
[url=http://www.uggboots5815.com]UGG Classic Boots,UGG Boots Classic Tall[/url] [url=http://www.uggboots5815.com]UGG Classic Tall Boots,UGG Boots 5815[/url]
It's always nice when you can not only be informed, but also engaged! abercrombie fitch
It's always nice when you can not only be informed, but also engaged! abercrombie fitch
Well said, such a person should be a good sentenceed eyebrow with this as welltiffany outlet7894543213 dnsjfuhn sdfijkhf
You made fantastic nice points here. I performed a search on the issue and discovered almost all peoples will agree with your blog. oil paintings discount paintings
Good,Greet,The market research can also be done using the internet giving you peace of mind and saving of time. Wholesale AccessoriesTherefore, make your search effective to get the effective supplies results. There are a number of wholesale suppliers in the market offering some reallyChina Wholesale nice assortments of tattoo kits at really reasonable and inexpensive prices. You're just required to dig thosetattoo machine wholesale suppliers out and benefit from their eye catchy deals and offers.
Good,Greet,Kawasaki Z1000The market research can also be done using the internet givingKawasaki ZX12R you peace of mind and saving of time.Therefore, Suzuki GSX R1000make your search effective to get the effective supplies results.
jordan 15 shoes jordan 16 shoes
Good,Greet,The market research canUGGS also be done using the internet giving you peace of mind and saving ugg 5803of time.Therefore, make your search effective to UGG Boots Classic Shortget the effective supplies results.
<P> military sweep replica watch</P> <P> military sweep the table the same as the design of their own simple race to become the object of counterfeiters. Now need to open the table cover to distinguish between true and false, to identify. But recently the BR series of simulated table techniques have improved, and covers many tbecause the fake form of mechanical body to be nothing out of the ordinary than the real replica watch.So far, BR01 series of four unique teeth lock screw is relatively easy ypes and colors.Audemars Piguet Royal Oak Offshore Titanium replica watch was fake a long time</P>
You have some really good articles on your blog. I also like the theme and theNike Air Jordan
layout as well. excellent work!
I'm really involved with this topic. When can I find out more selective details Timberland Boots all-around this? Or, when you can pursue this further more here.