2012-08-06 11 views
16

Pracuję z CMS, który uniemożliwia nam edytowanie sekcji head. Potrzebuję dodać arkusz stylów CSS do strony, zaraz po tagu. Czy istnieje sposób, aby to zrobić z JS, gdzie mogę dodać skrypt na dole strony (mam dostęp do skryptu tuż przed tagiem), który następnie wprowadziłby arkusz stylów do sekcji head?Dodaj arkusz stylów do nagłówka używając javascript w ciele

+2

dosłownie kilka pytań dół: http://stackoverflow.com/questions/11833325/css-hack-adding-css-in-the-body -of-a-website – Kwon

+2

jakiego używasz CMS? Zwykle jest co najmniej jakiś sposób na uwzględnienie ich w tym celu. –

+0

Wewnętrzny lub zewnętrzny arkusz stylów? –

Odpowiedz

52

Aktualizacja : Zgodnie z specs, element link nie jest dozwolony w treści. Jednak większość przeglądarek nadal będzie je dobrze renderować. Aby odpowiedzieć na pytania w komentarzach, naprawdę trzeba dodać link do strony head, a nie do 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}'); 

Albo trochę łatwiej z jQuery

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

addCss("{my-url}"); 

Original odpowiedź:

Nie trzeba koniecznie dodać go do głowy, po prostu dodaj go do koniec tagu ciała.

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

jak Juan Mendes wspomniano, można wstawić arkusz stylów do głowy zamiast

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

i to samo bez jQuery (patrz kod powyżej)

+3

Możesz użyć prawie tej samej rzeczy, aby dołączyć ją do głowy. –

+0

@Juan Mendes, wiem, ale to co mówię to to, że po prostu można włożyć do ciała – vittore

+0

Witaj vittore, dodałem drugi skrypt, o którym wspomniałeś przed tagiem, jednak nie wydaje się załaduj CSS w sekcji head ... myśli? Głównym problemem jest to, że tworzymy nowy arkusz stylów, aby nadpisać arkusz stylów, który CMS zmusza nas do użycia. Stworzyliśmy NOWY arkusz stylów, aby nadpisać ich ustawienia. Chcemy ładować PRAWO po załadowaniu ich ... w przeciwnym razie ich arkusz stylów ładuje się i pokazuje stronę, a następnie kilka sekund później nasze zmiany pojawiają się ... –

12

to zrobi to, co chcesz w inteligentnym droga. Również używając czystego 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

Edytowałem, aby dodać brakujące 'i' w pętli for:' if (document.styleSheets [i] .href == href) {' – cronoklee

+0

Próbowałem metody dołączania elementu linku do głowy i stwierdziłem, że działa, jednak powoduje to bardzo zauważalny flash w przeglądarce, ponieważ wszystko jest ponownie wydane. Zauważyłem to w Google Chrome, ale zgłaszali to użytkownicy w różnych przeglądarkach. Próbowałem tego w dwóch różnych produktach z tym samym wynikiem, a oba miały bardzo różne HTML, co oznacza, że ​​flash będzie występował niezależnie od tego, jaki jest HTML. Krótko mówiąc, nie polecam dodawania linku do nagłówka – Trevor

+0

Rozwiązaniem jest kontrola renderowania przez JS. Jak ładowanie css wcześniej, co kiedykolwiek jest używany do obciążeń. Możesz dodać argument wywołania zwrotnego i umieścić zdarzenie onload wewnątrz funkcji. Dzięki temu dowiesz się, kiedy jest gotowy do użycia. To samo dotyczy innych elementów, takich jak ramki, skrypty, itp. – Eddie

4

Mam zmodyfikowana funkcja Eddiego do usunąć lub przełącznik stylów włączyć lub wyłączyć. Zwróci również bieżący stan arkusza stylów. Jest to przydatne na przykład, jeśli chcesz mieć przycisk przełącznika na swojej stronie dla użytkowników z zaburzeniami wzroku i zapisać swoje preferencje w pliku 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 
} 

użycia próbki:

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

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

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

Co powiesz na użycie standardowej właściwości '' .disabled'' na arkuszu stylów, aby ją włączyć/wyłączyć –

+0

Oczywiście jest to opcja i byłoby trochę szybciej włączyć po raz drugi, ale wymagałoby to trzeciego przypadku w funkcji do obsługi arkusza stylów już istniejącego w stanie wyłączonym, więc funkcja będzie nieco dłuższa. – cronoklee

Powiązane problemy