2014-01-11 8 views
6

Ich muss dynamisch in der CSS verknüpfen (und JS, wenn Sie wissen, nicht getestet haben), aber wenn ich das mache, wird der Browser nicht die Stile rendern?Gibt es eine Möglichkeit, in einem Stylesheet zu verlinken, in dem die Erweiterung nicht .css ist?

Hier ist mein Code:

<link rel="stylesheet" href="css/test"/> 

Wenn ich manuell laden und speichern Sie die Datei als test.css es dann funktioniert.

<link rel="stylesheet" href="css/test.css"/> 

Gibt es eine Möglichkeit, um den Browser zu sagen: „Das ist eine CSS-Datei. Bitte ignorieren Sie, dass es nicht eine CSS-Erweiterung hat“?

MEHR
Der Grund ist, ich habe die Einrichtung eines Servers, die dem Benutzer erlaubt, ihre eigenen CSS dynamisch zu erstellen. Ich speichere diese Informationen in einer Datenbank und möchte nicht jedes Mal eine physische (digitale) Datei erstellen, wenn der Benutzer das CSS aktualisiert oder ein neuer Benutzer sein Konto erstellt. Also, die URL könnte sein, href = "http://somedomain.com/home.php?user=453 & css = true" oder so etwas und das, wenn in der URL des Browsers platziert, würde die rohe zurückgeben CSS.

+2

Gibt es eine Einschränkung, dass Sie Ihren CSS-Dateien nicht die richtige Erweiterung geben können? Es scheint eine einfachere Lösung für das Problem zu sein ... – Krease

+0

Ich habe das noch nie gesehen; Warum würden Sie die Erweiterung '.css' aus einer CSS-Datei entfernen (wirklich neugierig)? – Jules

+0

Solange der Server es als CSS-Datei sendet, sollten Sie in Ordnung sein, aber ich weiß nicht, ob Sie einen Server einrichten können, um Dateien als einen bestimmten Typ zu senden, wenn sie nicht schon irgendeine Art von Erweiterung haben Karte auch. Das größere Problem, das ich sehe, ist, wie jemand andere Ihre Code-Basis in der Zukunft ohne Erweiterungen aktualisieren wird? Das klingt wirklich chaotisch. –

Antwort

8

Browser schauen in erster Linie auf den MIME-Typ des Inhalts, den sie erhalten, dies ist prinzipiell unabhängig von der Dateiendung. Der MIME-Typ wird vom Webserver als Teil des HTTP-Headers gesendet (wenn möglich, der Umschlag der Datei).

Der korrekte MIME-Typ für CSS-Stylesheets ist text/css. Wenn Stylesheet-Dateien den Typ text/css MIME (definiert im HTTP-Header) haben, verwendet Ihr Browser diese, um die Stile unabhängig von der Erweiterung anzuwenden.

Wenn der MIME-Typ falsch ist, wird das Ergebnis nicht definiert: es hängt von dem Browser und der HTML-Version & Strikt wenn der Stil gerendert wird oder nicht. Sie können den MIME-Typ mithilfe des Debuggers Ihres Browsers überprüfen.

Ein Beispiel in Chrome finden Sie unter this screenshot.

this screenshot

Jeder Absatz hat color: red Regel in der entsprechenden Datei, aber eine nicht angewendet wird. Wie Sie sehen, wird der Stil in der text/plain-Datei gerendert, obwohl sein MIME-Typ nicht korrekt ist. Der Browser gibt eine Warnung aus. Der Stil in der von PHP generierten text/html-Datei wird nicht gerendert (und es wird eine Warnung ausgegeben.)

PHP und andere Skript-Engines erlauben es jedoch, den MIME-Typ zu manipulieren, wie ich es in test.css.fixed getan habe .php-Datei (Code unten). Wie Sie sehen können, beschwert sich der Browser nicht mehr und wendet die Stile unabhängig von seiner Erweiterung an.

In PHP kann der MIME-Typ wie folgt festgelegt werden (dies ist test.css.fixed.php):

<?php 
    header("Content-Type: text/css"); 
?> 

    p.test_css_fixed_php { 
     color: red; 
    } 

Die header Funktion ändert die HTTP-Header, die vom Server gesendet wird.

Wenn Sie nicht mit einem Skriptmodul arbeiten, können Sie Ihren Webserver so konfigurieren, dass er den MIME-Typ korrekt festlegt (siehe z. B. Apache mod_mime configuration).

Beachten Sie, dass die HTML-Version und Strenge auch Einfluss darauf haben. In Chrome scheinen Stile in einer Text/HTML-Datei trotzdem gerendert zu werden, wenn der HTML-Typ nicht streng ist. Aber Sie können nicht darauf zählen, so ist es eine schnelle & dreckige Lösung bestenfalls.

+0

Nach dem Lesen habe ich überprüft und es gibt eine Möglichkeit, den Mime-Typ auf dem Link-Tag auf der Client-Seite zu setzen. Es gibt. Es ist das Typattribut. Ich habe es auf "text/css" gesetzt, aber es wurde nicht angewendet. Der Browser erkennt es nicht als CSS, was ich vermute, dass es sich um einen Fehler handelt. Ich werde versuchen, die Header zu setzen. "+1" oder "Danke" –

+2

Der HTML5-Standard erfordert tatsächlich, dass der Benutzeragent den MIME-Typ priorisiert, der vom Server über den MIME-Typ gesendet wird, der als Verknüpfungstyp-Attribut auf dem Client festgelegt ist. Sie können darüber lesen [http://dev.w3.org/html5/spec-preview/the-link-element.html#attr-link-type], was Ihren Fall explizit abdeckt. Das clientseitige Attribut soll verhindern, dass der Benutzeragent Dateitypen herunterlädt, die nicht unterstützt werden (z. B. keine VB-Skripts herunterladen, wenn VB-Skripts nicht unterstützt werden). – wkampmann

-2

Jede CSS-Datei muss die CSS-Dateierweiterung haben. So weiß HTML, dass die Datei als Stylesheet verwendet werden soll. Ansonsten handelt es sich nur um eine Reihe von Klartextzeichen ohne Bedeutung.

+0

Ich stimme nicht zu - es kann .php sein und es wird funktionieren. –

+3

Nein. Die Dateierweiterung bestimmt nicht den Inhalt. Dafür gibt es MIME-Typen. Zum Beispiel: 'image.jpg' könnte tatsächlich ein PNG sein. – BenM

+0

Das ist falsch - es ist nicht erforderlich. Siehe [wkampmanns Antwort] (http://stackoverflow.com/a/21067379/836214) für Details darüber, warum. – Krease

-1

ich denke, die Erweiterung ist kein Problem - es kann jede Erweiterung sein. versuche einen punkt hinzuzufügen - vielleicht klappt das auch css/test.

Verwandte Themen