Autor Zpráva
Misanek
Profil
Ahoj lidi,
prosím, poraďte mi někdo, jak v Opeře zajistit přidání pravidla CSS (importRule resp. addRule). Po pročtení všemožných diskuzních jsem řešení nenalezl a dle výrobce Opery ani tuto vlastnost nepodporuje (ani verze 8 - dle www.opera.com). Jestli vás někoho napadá nějaké řešení, jak to obejít (přes document.getElementById to zvládnu taky, ale to bohužel lze změnit až po načtení a zobrazení prvku - a to přeblikávání se mi fakt nelíbí...), budu vděčen.
Oswald
Profil
Tak tohle mě na slečince taky dost štve... Nicméně, i tohle jde obejít:


var var sheet = document.getElementsByTagName('link')[0];

// mame co docineni s neschopnym browserem?
if (!sheet.insertRule) {
// jasne, IE...
if (sheet.addRule) {
// ohackovani IE
}
// a ted ta Opera:
else if (window.opera) {
// metodu insertRule nezna, tak ji to naucime
sheet.insertRule = function (rule) {
// vtip je ve vytvoreni elementu style, kam se ta pravidla posleze
// budou pridavat, coz ma ve vysledku stejny efekt
if (!sheet.operaSheet) {
// jeste ho nemame, tak ho vytvorime
var newSheet = document.createElement('style');
newSheet.setAttribute('type', 'text/css');
sheet.parentNode.appendChild(newSheet);
sheet.operaSheet = newSheet;
}
// pravidlo se vlozi jako text do el style
sheet.operaSheet.appendChild(document.createTextNode(rule));
}
}

}
peta
Profil *
Misanek Proc to chces? Vetsinou to lze obejit hackovanim s podtrzitky.
Treba mas nejaky prvek, ktery je nutne pro IE dat jako display:inline-block . FF to zobrazi spravne, ale (stara) Opera si to zobrazi po svem spatne.
Finta je v tom, ze se to ma zobrazit jako block a ne inline (ala opera). Cili:
display:block;_display:inline-block;
Opera, FF blok, IE inline-block a vse je oki
Misanek
Profil
oswalde díky moc, určitě vyzkouším...jen ještě takový jeden dotaz: co když to pravidlo zase budu chtít odebrat? (nebo v opeře, pokud ho chci změnit nemusím původní odebírat?)

peto chci to kvůli rozbalovacímu menu a resizingu do celého okna prohlížeče...snažím se nějakým způsobem kompletně předělat framy na CSS pozicing :-D (bez komentářů, že jsem cvok - to já vím už dávno ;-)

kdyby jste se na to chtěli náhodou podívat, zde je link (ale je to pracovní verze teprve pár dnů stará, takže prosím moc nerejte, že to nefunguje, zatím si hraju jen s layoutem)
http://beta.michaldlouhy.name
peta
Profil *
zrejme to melo byt http://beta.michaldlouhy.cz/
ten tvuj mi nejak nefunguje.
Jen mi nejde do hlavy, proc pro operu musis mit neco jinaci. Ukaz presne ten konkretni problem, treba by to slo resit jinak.
Leo
Profil
Podpora JS v Opere je naprosto jak to rict slusne, *******, Leo
Oswald
Profil
Misanek: Bude to tam jak text, takže replace(), nebo přidat nové a tím to přebít nebo změnit class, ...

Leo: Tohle platilo kdysi. Jediný, kde má Opera ještě co dohánět, je právě modul Style. Jinak ECMAScript jako takový zvládá naprosto v pohodě, stejně tak DOM2 Core či Events.
.
Leo
Profil
Kdyz ono je core a ecmascipt na web jaksi malo, Leo
Misanek
Profil
peta: spravne je http://beta.michaldlouhy.name (pravděpodobně pánům Šimůnkům zase nejel server) potřebuji pro Operu něco extra, protože všechny ostatní majoritní prohlížeče (MSIE 6, FF, Mozilla, Netscape) jsou schopny přidat a odebrat CSS pravidlo, Opera ne...

Oswald: moc díky za snahu, ale na tom Tvém návodu se mi nelíbí jedna věc (sorry, nemyslím to zle) a to totiž, že používám DOCTYPE HTML 4.01 strict, čímž se mi vložením tagu style do prvku body zruší validita (i když mi možná řekneš, že na validitu házíš bobek ;-) Další problém je pak v tom, že ten script mám vložen a zpracován v hlavičce dokumentu, kam se (aspoň pokud vím) nic vložit nedá

Script vypadá následovně, pokud ho někdo budete schopen upravit do té míry, aby fungoval i v Opeře, budu moc vděčen...případně jsem ochoten se domluvit i na nějaké finanční odměně (script musí být vložen a zpracován v hlavičce html souboru - ještě před zpracováním prvku body a kód statického i generovaného souboru musí být validní pod HTML 4.01 strict)


function styluj(selector,rule,atrib) {
var ss,nazev,pravidlo,intI,strTemp,pocet,prvni,posledni,levy,pravy;
if (document.all&&navigator.userAgent.indexOf("Opera")<0) {
ss=document.styleSheets[0].rules;
nazev="removeRule";
pravidlo="addRule(selector, rule)";
}
else if (navigator.userAgent.indexOf("Opera")<0) {
ss=document.styleSheets[0].cssRules;
nazev="deleteRule";
pravidlo="insertRule(selector+' {'+rule+'}',0)";
}
if (navigator.userAgent.indexOf("Opera")<0) {
for (intI=0;intI<ss.length;intI++) {
if (ss[intI].selectorText.toLowerCase()==selector.toLowerCase()) {
strTemp=ss[intI].style.cssText.toLowerCase();
pocet=strTemp.length;
prvni=strTemp.indexOf(atrib+": ",0);
if (prvni>-1) {
posledni=strTemp.indexOf(";",prvni);
levy=strTemp.substring(0,prvni);
pravy="";
if (posledni>-1) {
pravy=strTemp.substring(posledni+1,strTemp.length);
}
rule=levy+rule+pravy;
}
eval("document.styleSheets[0]."+nazev+"(intI)");
break;
}
}
eval("document.styleSheets[0]."+pravidlo);
}
}


jako příklad ještě uvádím řádek, kterým pak měním pravidla (příklad pro prvek body, místo body může být jakýkoliv tag, třída nebo ID)



styluj('body','background-color: #ff0000;','background-color;');


ještě jednu věc jsem zjistil, že Opera neumí :-(
document.getElementByTagName
document.getElementByClassName

ono document.getElementById taky není všespasitelné (případně je to pak zbytečně složité určovat pro skupinu prvků vlastnost pro každý zvlášť) a asi je taky nějaká chybička ve vykreslovacím jádru...při změně vlastností nezobrazí někdy změněnou vlastnost na celý prvek, ale jakmile se shodí okno do lišty nebo se přes to otevře jiný program, tak se to hned zpraví...
Fred
Profil
1/Proč by se měla jako zrušit validita
2/mám vložen a zpracován v hlavičce dokumentu, kam se (aspoň pokud vím) nic vložit nedá
Proč ne ?
3/Na takovýhle blbiny je toho pěkného scriptu od Oswalda poněkud škoda, co takhle použít nějaké jednoduché show/hide a normální seznam menu, třeba suckerfish dropdowns přepsané na onclick.
4/Mimochodem ve firebirdu mi to nefunguje,proklikává mi to na ty přebitý odkazy, kde ty stránky nejsou.
Když už je tam <a href="nekam.html" onclick="nejakyscript();return false;"> proč tam není nekam.html, kdyby to nevyšlo?
Oswald
Profil
Misanek

- validita: script najde první element link (var sheet), pro Operu se při první použití sheet.insertRule vytvoří el. style a ten se přidá na konec rodiče toho elementu link, to znamená do sekce <head>, takže to validní je.

- vkládání do head: jde to


ještě jednu věc jsem zjistil, že Opera neumí :-(
document.getElementByTagName
document.getElementByClassName


Ani se nedivím :)

Metodou getElementByTagName jsi nejspíš myslel getElementsByTagName.

Metodu getElementByClassName si budeš muset napsat sám, protože zkrátka neexistuje.
Misanek
Profil
Oswald: chlape jsi zlatej, díky moc

Fred:
1) pokud není kód validní, tak nebude ani validní dynamicky vygenerovaný (prvek styl se v HTML 4.01 strict nenachází)
2) o tom vložení do hlavičky jsem měl nejspíš špatné informace
3) každej tomu říká jinak, někdo blbiny, někomu to vyhovuje, to je individuální názor (show hide bych použil na menu, ale ne, když chci měnit celý layout - to pak nechutně přeblikává)
4)kam bych měl dát ještě to nekam.html? aspoň podle toho, co pár předních českých webdesignerů tvrdí ve svých publikacích, měl by takhle napsaný script fungovat, a pokud bude vypnutá jeho podpora nebo nepůjde zpracování, měl by se provést standartní odkaz
Leo
Profil
"pokud není kód validní, tak nebude ani validní dynamicky vygenerovaný (prvek styl se v HTML 4.01 strict nenachází"

Za prve - validitu stranky po uprave JavaScriptem nemate jak zkontrolovat, a pokud prohlizece neodmitnout nevalidni dynamicky generovane html zobrazit, neni problem. A za druhe, HTML 4.01 Strict MA atribut style:

http://www.w3.org/TR/html4/strict.dtd

Leo
Fred
Profil
měl by se provést standartní odkaz: Ten tam právě není. Někam.html byl příměr.
Misanek
Profil
Leo: nedalo mi to a podival jsem se, co tu mam DTD HTML 4.01 strict z webu w3c vytisteno...a tam fakt neni element style zminovan (tak kde uz ma brat clovek korektni informace, kdyz ani w3c neumi udelat specifikaci :-( validitu vygenerovaneho kodu samozrejme nemohu overit, ale snazim se to delat zpusobem, jako kdybych vygenerovany kod ulozil do souboru a ten pak zvalidoval...

Fred: mozna se jednalo o verzi, u ktere jeste odkazy funkcni nebyly, protoze jsem nemel hotovy script...nyni uz je tam na zýacatku kazde sekce menu pokusny odkaz (nevede na jiny dokument, ale scrtipt funguje a do URL predava parametry, ktere pak nove nacteny soubor zpracuje...
Leo
Profil
Nevim, co mate vytisteno, ale v tom odkazu co jsem vam poslal, a coz je evidentne DTD pro strict, style evidentne je, Leo
Misanek
Profil
Oswald: tak jsem vyzkousel ten tvuj script a bohuzel, at jsem delal, co jsem delal, tak proste nefunguje :-( sice mi opera nevyhodi zadnou chybu (coz je mozna naopak skoda, by clovek aspon vedel, co je spatne), ale proste pravidlo nepouzije, i kdybych se na hlavu postavil :-( nezvladnul bys prosim udelat script trebas jen pro Operu tak, aby fungoval? s tim, ze fci bych volal napr. nasledovne: onClick="styluj('#menu','background-color: #ff0000;');"
fakt staci jen pro tu Operu, zbytek mam vyresen...predem moc diky za snahu
Misanek
Profil
ještě jeden poznatek: Opera opravdu nezvládá getElementsByTagName (aspoň u elementu body)
Oswald
Profil
Misanek
Když jsem to psal, měl jsem za to, že insertRule se volá přímo nad styleSheetem, ale ono se volá nad styleSheet.rules. Proto jsi to možná nerozchodil. Tohle si přidej do tý svojí funkce někam, kde odchytáváš Operu a mělo by to fungovat (nezkoušeno):


if (window.opera) {
if (!operaStyle) {
operaStyle = document.createElement('style');
operaStyle.setAttribute('type', 'text/css');
document.getElementsByTagName('head')[0].appendChild(operaStyle);
}
operaStyle.appendChild(document.createTextNode(selector + '{' + rule + '}\n'));
}


getElementsByTagName('body')[0] vrátí body a funguje to nejenom v Opeře, ale snad úplně všude :)
Jinak doporučuju nastudovat si nějaký články třeba na Intervalu apod.
Misanek
Profil
Oswald: studoval jsem toho dost, ale JS není zrovna mou silnou stránkou :-( už je mi jasné, proč mi nefungovala ta fce getElementsByTagName u body...jsem totiž ***** a nedal jsem tam číslo toho elementu

je možné řádek
operaStyle.setAttribute('type', 'text/css');

nahradit takto

operaStyle.setAttribute('type', 'text/css', 'media', 'screen');

aby se to aplikovalo pouze na výstup na monitoru, nikoliv na tiskárnu?
Misanek
Profil
jééé, to je hezký, jsem použil sprosté slovo a ono ho to samo nahradilo hvězdičkami...to se mi líbí ;-)
Misanek
Profil
Oswald: funguje to!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! :-)
sice jsem musel ještě přidat řádek
var operaStyle
, ale to už mi docvaklo
máš u mne obrovskou pusu :-D (ne, to byl samozřejmě jen fór), ale metr piv nebo flašku klidně
Toto téma je uzamčeno. Odpověď nelze zaslat.