x-ƒ (x_f)

Problēma ar MSIE 6

pirmdien, 17.05.2004 @1:22 pm | x-ƒ ([info]style)

Bieži sastopama problēma, kā izrādās. Gadās, ka, lietojot Microsoft Internet Explorer 6, nav iespējams normāli iezīmēt tekstu. Šī problēma, lai cik dīvaini tas nebūtu, ir tieši ar sesto versiju. Ar piekto viss ir kārtībā. Lai gan tur ir citas problēmas.

Bieži vien, ja Tu centies iezīmēt tekstu, kas atrodas absolūti pozicionētos elementos, tad tas nemazam nestrādā. Tiek iezīmēta puse lapas, taču ne tas teksts, kuru vajadzēja. Šī problēma ir aktuāla tieši IE6, jo ar IE5 viss darbojās lieliski.
Šī problēma atgadās tad, ja tiek mēģināts iezīmēt tekstu, kas atrodas zemāk (vertikāli skatoties) par lapas statisko saturu (parasti tas nozīmē jebkādu taga <body> saturu) un tikai tad, ja pārlūks darbojas standards-compatible režīmā. Bet, kad tas notiek, tas ir ļoti kaitinoši. Tici man. Un, ja netici, vari pārbaudīt ar šo žūrnālu – tieši tā pati problēma.

Tagad neliela atkāpe teorijai. Kas tas tāds standards-compatible režīms? Nu, tāds.. mazs, pūkains zvēriņš, daudz neēd..
Pārlūks, attēlojot jebkuru HTML dokumentu, darbojas divos režīmos – atpakaļsavietojamajā (backward-compatible; Mozillas inženieri to sauc par quirks režīmu, MS to nesauc nekā) un standartiem atbilstošajā (Mozillai – strict, IE – standards-compatible). Otrais režīms ir pēc iespējas tuvāk W3C rekomendācijām.
Režīms, kādā pārlūks darbosies, tiek noteikts pēc HTML faila DOCTYPE. Vai tā neesamības. Īpaši lielas jēgas no DOCTYPE norādīšanas nav. Bet tas tā ir pagaidām. Nākotnē tam būs lielāka nozīme. Pagaidām tas skaitās labais stils tādu norādīt katram HTML failam. Šajā DOCTYPE var norādīt gan to, ka tas ir HTML 4.01 dokuments, gan to, ka tas ir XHTML 1.1 dokuments. Protams, ja pārlūkam kāds no šiem DOCTYPE izrādīsies liels jaunums un pirmā dzirdēšana, tad tas izmantos savu iebūvēto, veco DOCTYPE definīciju. Tas notiks arī tad, ja DOCTYPE netiks norādīts vispār. Tā ka nevar teikt, ka no tā vispār nav nekādas jēgas. Parasti to norāda tad, ja web-lapa tiek veidota tieši jaunākajām pārlūku versijām (piemēram, 6.), tiek izmantota precīza elementu pozicionēšana un smalki piestrādāts pie CSS un DOM specifikāciju ievērošanas.
Piezīme Starp citu, uzzināt, kāds režīms tiek izmantots, var ar JavaScript palīdzību, izmantojot document.compatMode īpašību. (Vienkārši dokumenta body elementā ievieto script tagu un tajā ieraksti "alert(document.compatMode);".) Paeksperimentē ar vairākiem pārlūkiem, pieliekot un noņemot gan XML prologu (<?xml .. ?>), gan pašu DOCTYPE. Rezultāti ar Netscape un MSIE atšķiras. (Heh.. protams!)
Īsumā Visas HTML 4.x/strict un XHTML DTD definīcijas ieslēdz standards-compatible režīmu, vienalga, vai, definējot DOCTYPE, ir norādīts DTD faila URL vai nav. Tāpat arī šis režīms tiek ieslēgts, ja, izmantojot HTML 4.x transitional un frameset DTD failus, tiek norādīta to URL adrese.

Un tagad atpakaļ pie problēmas. Tātad, ja IE darbojas standards-compatible režīmā, tad ir problēmas ar iezīmēšanu.
Risinājumi
1. neizmantot standards-compatible. Jā, tā var. Tādā gadījumā var vai nu vispār nenorādīt DOCTYPE (fuj!), vai arī pirms tā pierakstīt XML prologu "<?xml version="1.0" encoding="utf-8"?>" (enkoudings, protams, var būt cits). Tas nostrādās. IE darbosies tajā režīmā, ko Mozillinieki sauc par quirks. Patiesībā tas emulēs MSIE 5.x versijas pārlūku.
2. neizmantot absolūto pozicionēšanu. Stulbi.
3. neuztraukties par IE lietotājiem un ignorēt šo problēmu. Var! Lai vaino Microsoft'u, nevis mani. :)
4. SaiteTom Gilder iesaka izmantot šādu haku:

JS kods )

Hmm.. Es to izpētīju. Es to izmēģināju. Tas strādā. Bet tā arī nesapratu tā jēgu. Nu.. Kā tas darbojas un ko tas dara. Ir tāda nojauta, ka tas "izstiepj" body elementu pa visu ekrānu (un tāpēc visi absolūti pozicionētie elementi tik un tā atrodas body robežās). Tā ir? Uzminēju?

Lai nu kā, es ceru, ka vismaz kādam palīdzēju tikt vaļā no galvassāpēm bez medicīnas palīdzības, ja tas arī ir saskāries ar šādu problēmu.

Paldies SaiteKindai un Saiteasdf'am par informāciju. Šis lielākoties ir tulkots. Dažādi info avoti.
Saites: Saite1. avots, Saite2. avots, Saite3. avots.