[JS] Uitlezen complete stylesheet met actuele inhoud

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 20-09 19:50

Neman

Een uit de lucht gegrepen naam

Topicstarter
Een stylesheet is embedded opgenomen in de HTML. Gebruikmakende van Prototype worden vervolgens diverse stijlen aangepast middels:

code:
1
$('div1').style.background = color;


Vervolgens doe ik een poging om de complete stylesheet uit te lezen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (document.styleSheets)
        for (sheetKey in document.styleSheets)
            if (document.styleSheets[sheetKey]['title'] == 'stylesheet1')
            {
                var rules = '';
                
                for (ruleKey in document.styleSheets[sheetKey].cssRules)
                {
                    if (document.styleSheets[sheetKey].cssRules[ruleKey].cssText != undefined)
                        rules += document.styleSheets[sheetKey].cssRules[ruleKey].cssText+'\r\n';
                }
            
                alert(rules);
                break;
            }


Dit levert klaarblijkelijk de initiële stylesheet op, waar de veranderingen niet in zijn doorgevoerd. Deze site beschrijft het probleem:
If you use the former method to read the style properties for H1, but have declared them inline as in the latter example, you get the wrong values—those defined in the embedded stylesheet, not those defined in the inline style attribute. ...

There is a standard way to read the current style properties for any element, the getComputedStyle() method, but it is not yet supported on the Macintosh platform.
getComputedStyle moet worden aangeroepen op een specifiek element, ik heb zodoende wat problemen om de complete stylesheet uit te lezen. Heeft iemand tips?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Je stylesheet bevat inderdaad geen inline styles, maar wat probeer je precies te bereiken?

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 20-09 19:50

Neman

Een uit de lucht gegrepen naam

Topicstarter
Ik laad een stylesheet met standaardkleuren, pas vervolgens realtime kleuren van veel elementen aan en het eindresultaat wil ik vervolgens wegschrijven als complete stylesheet.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

En wat voor selector zou er dan voor die elementen 'gegenereerd' moeten worden?

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 20-09 19:50

Neman

Een uit de lucht gegrepen naam

Topicstarter
Ik denk dat ik al een oplossing heb, namelijk het aanpassen van de betreffende styles in de stylesheet i.p.v. inline te werk te gaan. Ik heb de volgende functie geschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function changeStyle(elm, prop, value)
{
    if (document.styleSheets)
        for (sheetKey in document.styleSheets)
            if (document.styleSheets[sheetKey]['title'] == 'stylesheet1')
            {
                for (ruleKey in document.styleSheets[sheetKey].cssRules)
                {
                    if (document.styleSheets[sheetKey].cssRules[ruleKey]['selectorText'] == elm)
                    {
                        document.styleSheets[sheetKey].cssRules[ruleKey].style[prop] = value;
                        break;
                    }
                }
            }
}


Om dan terug te komen op het voorbeeld uit mijn startpost, dat zou het volgende worden:

code:
1
changeStyle('#div1', 'background', color);


Vervolgens kan ik gewoon de stylesheet uitlezen met de functie zoals vermeld in de startpost :P.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

En als er nou bijvoorbeeld dit in je stylesheet staat:
Cascading Stylesheet:
1
2
3
p#div1 {
    background-color: red;
}

of een uitgebreidere selector, of meerdere selectors die hetzelfde element zouden kunnen targetten. Kortom: hoe weet je zeker dat de rule die je zoekt ook letterlijk zo bestaat, en met letterlijk die property?

Nog afgezien van de problemen die je krijgt om eea crossbrowser-compatible te krijgen (cssRules bestaat niet in IE, daar heet de rules-collection 'rules') vraag ik me af waarom je de basis stylesheet niet gewoon de basis stylesheet laat en geen gebruik maakt van de cascading eigenschap van CSS en aan de hand van de gemaakte keuzes gewoon extra stylerules genereert?

[ Voor 4% gewijzigd door crisp op 06-05-2009 22:26 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 20-08 09:22

Clay

cookie erbij?

If you use the former method to read the style properties for H1, but have declared them inline as in the latter example, you get the wrong values—those defined in the embedded stylesheet, not those defined in the inline style attribute. ...

There is a standard way to read the current style properties for any element, the getComputedStyle() method, but it is not yet supported on the Macintosh platform.
Dat slaat op het met javascript opvragen van element.style.[property], niet op het uitlezen van css uit de stylesheets die aan de pagina hangen.

Maar waarom wil je styles in je stylesheets toevoegen? Als je met prototype kleuren aanpast, en ergens anders bv wil opvragen wat voor kleur iets nou heeft gekregen, dan heb je dat namelijk helemaal niet nodig.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Lijkt me ook een aardig beveiligings risico als je er maar domweg vanuit gaat dat de stylesheet die je uitleest door jouw code is gegenereerd. Want ik kan die complete stylesheet omzeephelpen vanuit de console bijvoorbeeld.

Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 20-09 19:50

Neman

Een uit de lucht gegrepen naam

Topicstarter
Het is puur voor eigen gebruik en het is voldoende als het enkel onder Mozilla werkt, vandaar dat er weinig aandacht is besteed aan veiligheidsrisico's en browsercompatibiliteit. Het is naar mijn idee een handige methode om aan de hand van een basisstylesheet met kleuren te spelen en vanuit daar een nieuwe stylesheet te genereren...

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 21:30

Sebazzz

3dp

Wat is er anders mis met Web Developer Toolbar of Firebug? ;) In het CSS tab van Firebug kan je lekker experimenteren, en naderhand doe je Ctrl-A Ctrl-C en je hebt je stylesheet.

[ Voor 48% gewijzigd door Sebazzz op 07-05-2009 19:31 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]

Pagina: 1