2012-08-06 25 views
16

Sto lavorando con un CMS che ci impedisce di modificare la sezione di testa. Devo aggiungere il foglio di stile CSS al sito, subito dopo il tag. C'è un modo per farlo con JS, dove posso aggiungere uno script in fondo alla pagina (ho accesso ad aggiungere uno script subito prima del tag) che poi inietterebbe il foglio di stile nella sezione head?Aggiungi foglio di stile a Head utilizzando javascript nel corpo

+2

Letteralmente un paio di domande in basso: http://stackoverflow.com/questions/11833325/css-hack-adding-css-in-the-body -of-a-website – Kwon

+2

quale CMS stai usando? Di solito c'è almeno un modo per includerli. –

+0

Foglio di stile in linea o esterno? –

risposta

52

Aggiornamento: Secondo specs, l'elemento link non è ammesso nel corpo. Tuttavia, la maggior parte dei browser lo renderà ancora perfetto. Pertanto, per rispondere alle domande nei commenti, è necessario aggiungere link allo head della pagina e non allo body.

function addCss(fileName) { 

    var head = document.head; 
    var link = document.createElement("link"); 

    link.type = "text/css"; 
    link.rel = "stylesheet"; 
    link.href = fileName; 

    head.appendChild(link); 
} 

addCss('{my-url}'); 

O un po 'più facile con jQuery

function addCss(fileName) { 
    var link = $("<link />",{ 
    rel: "stylesheet", 
    type: "text/css", 
    href: fileName 
    }) 
    $('head').append(link); 
} 

addCss("{my-url}"); 

risposta originale:

Non è necessario necessariamente aggiungerlo alla testa, basta aggiungerlo alla tag di fine del corpo.

$('body').append('<link rel="stylesheet" type="text/css" href="{url}">') 

come Juan Mendes accennato, è possibile inserire foglio di stile per la testa invece

$('head').append('<link rel="stylesheet" type="text/css" href="{url}">') 

E lo stesso senza jQuery (vedi codice qui sopra)

+3

Potresti usare quasi la stessa cosa per appenderlo alla testa. –

+0

@Juan Mendes, lo so, ma quello che dico è che può essere inserito nel corpo – vittore

+0

Ciao vittore, ho aggiunto il secondo script che hai menzionato prima del tag, tuttavia, non sembra caricare il CSS nella sezione principale ... pensieri? Il problema principale è che stiamo creando un nuovo foglio di stile per sovrascrivere il foglio di stile che il CMS ci obbliga a utilizzare. Così abbiamo creato un NUOVO foglio di stile per sovrascrivere le loro impostazioni. Ci piacerebbe caricare RIGHT dopo che hanno caricato il loro ... altrimenti, il loro foglio di stile viene caricato e mostra il sito, e poi qualche secondo dopo, le nostre modifiche appaiono ... –

12

Questo farà quello che vuoi in modo intelligente modo. Anche usando puro JS.

function loadStyle(href, callback){ 
    // avoid duplicates 
    for(var i = 0; i < document.styleSheets.length; i++){ 
     if(document.styleSheets[i].href == href){ 
      return; 
     } 
    } 
    var head = document.getElementsByTagName('head')[0]; 
    var link = document.createElement('link'); 
    link.rel = 'stylesheet'; 
    link.type = 'text/css'; 
    link.href = href; 
    if (callback) { link.onload = function() { callback() } } 
    head.appendChild(link); 
} 
+2

Ho modificato per aggiungere "i" mancante nel ciclo for: 'if (document.styleSheets [i] .href == href) {' – cronoklee

+0

Ho provato il metodo di aggiungere l'elemento link alla testa e ho scoperto che funziona, tuttavia, ciò causa un flash molto evidente nel browser poiché tutto viene rerenderizzato. L'ho osservato su Google Chrome, ma avevo utenti in tutti i diversi browser che lo segnalavano. Ho provato questo in due prodotti diversi con lo stesso risultato, ed entrambi avevano un HTML molto diverso, a indicare che il flash si verificherà indipendentemente da quale HTML sia presente. Per farla breve, non è consigliabile aggiungere il collegamento alla testata – Trevor

+0

La soluzione è controllare anche il rendering tramite JS. Come caricare prima il css, che mai viene utilizzato per i carichi. È possibile aggiungere un argomento di callback e inserire un evento onload all'interno della funzione. Questo ti dirà quando è pronto per essere usato. Lo stesso vale per altri elementi come frame, script, ecc. – Eddie

4

Ho modificato la funzione di Eddie per rimuovere o levetta il foglio di stile o disattivare. Restituirà anche lo stato corrente del foglio di stile. Questo è utile ad esempio, se si desidera avere un pulsante di attivazione/disattivazione sul proprio sito Web per utenti con problemi di vista e la necessità di salvare le proprie preferenze in un cookie.

function toggleStylesheet(href, onoff){ 
    var existingNode=0 //get existing stylesheet node if it already exists: 
    for(var i = 0; i < document.styleSheets.length; i++){ 
     if(document.styleSheets[i].href && document.styleSheets[i].href.indexOf(href)>-1) existingNode = document.styleSheets[i].ownerNode 
    } 
    if(onoff == undefined) onoff = !existingNode //toggle on or off if undefined 
    if(onoff){ //TURN ON: 
     if(existingNode) return onoff //already exists so cancel now 
     var link = document.createElement('link'); 
     link.rel = 'stylesheet'; 
     link.type = 'text/css'; 
     link.href = href; 
     document.getElementsByTagName('head')[0].appendChild(link); 
    }else{ //TURN OFF: 
     if(existingNode) existingNode.parentNode.removeChild(existingNode) 
    } 
    return onoff 
} 

di utilizzo Esempio:

toggleStylesheet('myStyle.css') //toggle myStyle.css on or off 

toggleStylesheet('myStyle.css',1) //add myStyle.css 

toggleStylesheet('myStyle.css',0) //remove myStyle.css 
+2

Come utilizzare la proprietà standard '' .disabled'' su StyleSheet per attivarla/disattivarla –

+0

Ovviamente questa è un'opzione e sarebbe un po 'più veloce per accenderla una seconda volta, ma ciò richiederebbe un terzo caso nella funzione per gestire il foglio di stile già esistente in uno stato disabilitato, quindi la funzione sarebbe un po 'più lunga. – cronoklee

Problemi correlati