2013-07-02 11 views
5

mam ładowania Bootstrap CSS na mojej stronie z CDN bootstrapcdn.comZapewnić lokalną awaryjne dla CSS z CDN

<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet"> 

Jak mogę sprawdzić, czy arkusz stylów został załadowany, a jeśli nie zapewniają lokalną fallback?

I do nie chcę czekać na załadowanie biblioteki jQuery lub innych przed wykonaniem testu; Najpierw chcę załadować wszystkie CSS na stronę.

+0

To może być trudne, ponieważ * myślę * CSS ładuje się asynchronicznie. – Pointy

+1

Nie chcesz, aby JQuery lub inne zasoby były ładowane, ale kod, który udostępniłem poniżej, jest czystym kodem JavaScript i nie ma zależności od jQuery (chyba). Bez używania javascript nie znam żadnego innego sposobu osiągnięcia tego, czego szukasz. O ile oczywiście nie ma jakiejś wersji do specyfikacji w3, w której można określić bibliotekę zastępczą - co, jak sądzę, byłoby bardzo dobrą aktualizacją specyfikacji w przyszłości. – smallworld

Odpowiedz

2

To jest to, co stworzyłem dla naszych potrzeb. Jeśli to spełnia twoje potrzeby, po prostu wywołaj funkcję ensureCssFileInclusion (plik do sprawdzenia, wartość boolowska). Będziesz musiał dostosować go do swoich potrzeb, aby upewnić się, że podasz cssFileToCheck, fallbackCssFile w tej funkcji.

/** 
* Checks the page for given CSS file name to see if it was already included within page stylesheets. 
* If it was, then this function does nothing else. If CSS file was not found among page stylesheets, 
* then this function will attempt to load the stylesheet by adding an HTML link tag to the document 
* HEAD section. You must also specify whether given cssFileToInclude is a relative path or an absolute path. 
*/ 
ensureCssFileInclusion = function(cssFileToInclude, isRelativePath) { 
    if (isRelativePath) { 
    if (!window.location.origin) { 
     cssFileToInclude = window.location.protocol+"//"+window.location.host + cssFileToInclude; 
    } 
    } 
    var styleSheets = document.styleSheets; 
    for (var i = 0, max = styleSheets.length; i < max; i++) { 
    if (styleSheets[i].href == cssFileToInclude) { 
     return; 
    } 
    } 
    // because no matching stylesheets were found, we will add a new HTML link element to the HEAD section of the page. 
    var link = document.createElement("link"); 
    link.rel = "stylesheet"; 
    link.href = cssFileToInclude; 
    document.getElementsByTagName("head")[0].appendChild(link); 
}; 
+0

Czy to działa w różnych przeglądarkach bez problemów? Masz problemy z czasem wczytywania strony? – BadHorsie

+0

Jesteśmy już w fazie wstępnej, ale funkcja ta funkcjonuje od około roku i nie widzieliśmy niczego, co by nas dotyczyło. Jedno, co zawsze przypominam tym, którzy są zaniepokojeni (lub próbują zoptymalizować) 30-miesięcznym procesem takim jak to jest .... że tak czy owak przesuniemy zbyt dużo śmieci (javascripts/css/images) itp. Do maszyny klienta tak czy inaczej, że to 20/30 ms nic nie zmieni. Po drugie, jeśli byłby to 20/30ms na serwerze, który jest przeznaczony dla milionów klientów, mógłbym myśleć o tym, ale nowocześni klienci z wielordzeniowymi procesorami i 4 + GB RAM są w stanie sobie z tym poradzić. – smallworld

+0

Na pytanie "Czy to działa w różnych przeglądarkach bez problemów?" ... jego czysty javascript, tak długo, jak długo obsługujesz przeglądarkę obsługującą javascript, nie rozumiem, dlaczego to nie zadziałałoby! – smallworld

Powiązane problemy