Czy można importować arkusze stylów css do strony HTML za pomocą Javascript? Jeśli tak, jak to zrobić?
PS javascript będzie hostowany na mojej stronie, ale chcę, aby użytkownicy mogli wstawić <head>
tag swojej witryny i powinien móc importować plik css hostowany na moim serwerze na bieżącą stronę internetową. (zarówno plik css, jak i plik javascript będą hostowane na moim serwerze).
javascript
html
css
dhtml
Kliknij opcję Upvote
źródło
źródło
Odpowiedzi:
Oto sposób „starej szkoły”, który, mam nadzieję, działa we wszystkich przeglądarkach. Teoretycznie
setAttribute
użyłbyś niestety IE6 nie obsługuje go konsekwentnie.Ten przykład sprawdza, czy CSS został już dodany, więc dodaje go tylko raz.
Umieść ten kod w pliku javascript, poproś użytkownika końcowego o dołączenie javascript i upewnij się, że ścieżka CSS jest bezwzględna, aby została załadowana z twoich serwerów.
VanillaJS
Oto przykład, który używa zwykłego JavaScript do wstrzykiwania linku CSS do
head
elementu na podstawie nazwy pliku URL:Wstaw kod tuż przed
head
tagiem zamykającym, a CSS zostanie załadowany przed wyrenderowaniem strony. Użycie zewnętrznego.js
pliku JavaScript ( ) spowoduje wyświetlenie Flash niestylizowanej treści ( FOUC ).źródło
link.onload = function(){ ... }
przed dołączeniemJeśli używasz jquery:
źródło
$('head').append('<link rel="stylesheet" type="text/css" href="https://dl.dropboxusercontent.com/s/ep1nzckmvgjq7jr/remove_transitions_from_page.css">');
Wydaje mi się, że coś takiego zrobiłby ten skrypt:
Ten plik JS zawiera następującą instrukcję:
Adres javascript i css musiałby być bezwzględny, jeśli mają odnosić się do Twojej witryny.
Wiele technik importowania CSS omówiono w tym artykule „Powiedz nie hackom CSS za pomocą technik rozgałęziających” .
Ale artykuł „Korzystanie z JavaScript do dynamicznego dodawania arkuszy stylów CSS Portlet” wspomina również o możliwości CreateStyleSheet (własna metoda dla IE):
źródło
document.createStyleSheet()
do przeglądarek, które go nie mają: stackoverflow.com/questions/524696/…document.write
nie jest to zalecane, ponieważ zastępuje ono całą treść witryny.<style>
element zamiast zakładać, że jest to pierwszy element potomny<head>
via("head")[0]
?var style = document.getElementsByTagName("style")[0];
Element.insertAdjacentHTML ma bardzo dobrą obsługę przeglądarki i może dodawać arkusz stylów w jednym wierszu.
źródło
Jeśli chcesz wiedzieć (lub czekać), aż sam styl się załaduje, działa to:
źródło
Wiem, że to dość stary wątek, ale oto moje 5 centów.
Jest inny sposób na zrobienie tego w zależności od potrzeb.
Mam przypadek, w którym chcę, aby plik css był aktywny tylko przez chwilę. Jak przełączanie css. Aktywuj css, a następnie po innym zdarzeniu dezaktywuj go.
Zamiast dynamicznie ładować css, a następnie go usuwać, możesz dodać identyfikator klasy / id przed wszystkimi elementami w nowym css, a następnie po prostu przełączyć tę klasę / id węzła podstawowego twojego css (jak znacznik body).
Dzięki temu rozwiązaniu początkowo zostanie załadowanych więcej plików css, ale masz bardziej dynamiczny sposób przełączania układów css.
źródło
W nowoczesnej przeglądarce możesz używać
promise
tego w ten sposób. Utwórz funkcję modułu ładującego z obietnicą:Wtedy oczywiście chcesz coś zrobić po załadowaniu CSS. Możesz wywołać funkcję, która musi działać po załadowaniu CSS w następujący sposób:
Przydatne linki, jeśli chcesz dokładnie zrozumieć, jak to działa:
Oficjalne dokumenty dotyczące obietnic
Przydatny przewodnik po obietnicach
Świetny film wprowadzający o obietnicach
źródło
Użyj tego kodu:
źródło
Istnieje ogólna wtyczka jquery, która ładuje synchronizację plików css i JS i asych na żądanie. Śledzi także to, co zostało już załadowane :) patrz: http://code.google.com/p/rloader/
źródło
Oto sposób z metodą tworzenia elementów jQuery (moje preferencje) i wywołaniem zwrotnym
onLoad
:źródło
Biblioteki YUI może być to, czego szukasz. Obsługuje także ładowanie między domenami.
Jeśli używasz jquery, ta wtyczka robi to samo.
źródło
Możesz użyć tej biblioteki YUI lub użyć tego artykułu do wdrożenia
źródło
Poniżej pełnego kodu używanego do ładowania JS i / lub CSS
źródło
Chciałbym udostępnić jeszcze jeden sposób, aby załadować nie tylko css, ale wszystkie zasoby (js, css, obrazy) i obsłużyć zdarzenie onload dla grupy plików. Jest
async-assets-loader
. Zobacz przykład poniżej:Według asynchroniczny-aktywów-ładowarki docs
źródło
Używam thymeleaf i to działa dobrze. Dzięki
źródło
th:href
atrybut po stronie klienta? Nie zostanie przetworzony przez Thymeleaf, więc wydaje się tutaj zbędny.