Wann sollte die Anwendung JavaScript MIME vom Typ application / javascript anstelle von text / javascript verwendet werden?

157

Basierend auf der Frage, dass jQuery-Code im IE nicht funktioniert , text/javascriptwird er in HTML-Dokumenten verwendet, damit Internet Explorer ihn verstehen kann.

Aber ich frage mich, wann Sie es verwenden würden application/javascriptund was noch wichtiger ist, warum Sie es anstelle von verwenden würden text/javascript.

Mark Baijens
quelle

Antworten:

243

Theoretisch nach RFC 4329 , application/javascript.

Der Grund, warum es sein soll, applicationhat nichts damit zu tun, ob der Typ lesbar oder ausführbar ist. Dies liegt daran, dass es benutzerdefinierte Zeichensatzbestimmungsmechanismen gibt, die von der Sprache / dem Typ selbst festgelegt werden und nicht nur vom generischen charsetParameter. Ein Subtyp von textsollte von einem Proxy in einen anderen Zeichensatz transkodiert werden können, wobei der Zeichensatzparameter geändert wird. Dies gilt nicht für JavaScript, weil:

ein. Der RFC sagt, dass Benutzeragenten Stücklisten-Sniffing für das Skript durchführen sollten, um den Typ zu bestimmen (ich bin mir nicht sicher, ob dies tatsächlich von Browsern durchgeführt wird).

b. Browser verwenden andere Informationen - die Codierung der eingeschlossenen Seite und in einigen Browsern das script charsetAttribut -, um den Zeichensatz zu bestimmen. Jeder Proxy, der versucht hat, die Ressource zu transkodieren, würde seine Benutzer beschädigen. (Natürlich verwendet in Wirklichkeit sowieso niemand Transcodierungs-Proxys, aber das war die Absicht.)

Deshalb ist die genaue Bytes der Datei muss erhalten bleiben genau , was es zu einer binären macht applicationArt und technisch nicht zeichenbasierte text.

Aus dem gleichen Grund wird application/xmles offiziell vorgezogen text/xml: XML verfügt über eigene In-Band-Zeichensatz-Signalisierungsmechanismen. Und jeder ignoriert auch applicationXML.

text/javascriptund text/xmlvielleicht nicht das offizielle Richtige, aber es gibt das, was heute jeder aus Kompatibilitätsgründen verwendet, und die Gründe, warum sie nicht das Richtige sind, sind praktisch völlig unwichtig.

Bobince
quelle
4
Die "kompatibelste" Lösung besteht darin, überhaupt keinen Inhaltstyp in die Antwort aufzunehmen. RFC gibt an, dass der Empfänger ihn ohne einen expliziten Inhaltstyp "nach Kontext" interpretieren würde, was für alle Browser vom ersten Browser an immer das richtige Verhalten ist
Pacerier
Seien Sie vorsichtig mit application/javascriptund IE läuft im Kompatibilitätsmodus mit IE=8. Scheint, als ob Inline-Skripte nicht richtig ausgewertet werden. text/javascriptfunktioniert dort gut.
Joscha
2
@Pacerier - Ich weiß, dass dieser Kommentar 5 Jahre alt ist, aber heute ist es aus Sicherheitsgründen oft am besten, MIME-Typen einzuschließen, insbesondere für Websites vom Typ Forum. Wenn der Empfänger den Typ interpretiert, kann er angegriffen werden, indem eine schädliche Javascript-Datei als Bild hochgeladen wird und der Browser das Skript interpretiert und ausführt. Es ist besser, wenn der Server MIME-Typen für alle Antworten zurückgibt und den Header verwendet X-Content-Type-Options: nosniff, um zu verhindern, dass der Browser den Typ interpretiert.
sammy_winter
@sammy_winter Ich sehe überall solche Warnungen und erschrecke jedes Mal. Wenn ich Benutzern erlauben würde, Inhalte hochzuladen, würde ich wahrscheinlich mehr Validierungen durchführen als "Oh ja, der Name stimmt mit dem regulären Ausdruck für die PNG-Datei überein, dem kann ich vertrauen", nicht wahr? Wenn ein falscher Header zu einem "Sicherheitsproblem" wird, liegt das Problem vielleicht irgendwo tiefer, finden Sie nicht? Dies ist das gleiche wie beim Verstecken Server: nginxoder was auch immer Nginx sendet. Als ob jeder, der in der Lage ist, ein Loch zu finden, einen expliziten Header benötigt, um zu wissen, welchen Server Sie betreiben ...
Sahsahae
17

Das Problem mit dem MIME-Typ von Javascript ist, dass es seit Jahren keinen Standard mehr gibt. Jetzt haben wir Anwendung / Javascript als offiziellen MIME-Typ.

Tatsächlich spielt der MIME-Typ jedoch keine Rolle, da der Browser den Typ selbst bestimmen kann. Aus diesem Grund geben die HTML5-Spezifikationen an, dass das type="text/javascript"nicht mehr benötigt wird.

Harmen
quelle
5

applicationweil .js-Dateien nicht etwas sind, das ein Benutzer lesen möchte, sondern etwas, das ausgeführt werden sollte.

thejh
quelle
Das ist die offizielle Antwort, aber IE erstickt daran.
Benn
20
@Benn: Vielleicht, weil IE-Benutzer alle JS-Dateien lesen müssen, weil sie nicht richtig ausgeführt werden? Zumindest ist es ehrlich von Microsoft;)
thejh
Ich
1
Ich glaube nicht, ob du es lesen willst oder nicht, es hat etwas damit zu tun, warum. Es hat damit zu tun, wie die Daten transkodiert werden - oder vielmehr, ob dies möglich ist.
Zenexer
Technisch gesehen werden HTML und CSS auch vom Browser "ausgeführt" (analysiert), um das Ergebnis des Codes als visuellen Inhalt zu erzeugen, und ist nicht für den Benutzer zum "Lesen" gedacht. Daher ist diese Antwort nicht sehr sinnvoll. Ich denke, es gibt große Verwirrung darüber, was "Text" und was "Anwendung" ist. Wenn ich in dieser Angelegenheit abstimmen könnte, würde ich sagen, dass die IETF "Text" -Inhalte als textund binaryentweder application-oder den "Zweck" dieses Typs wie in "Bild" oder "Dokument" usw. betrachten sollte
1

application / javascript ist der richtige Typ, aber da er von IE6-8 nicht unterstützt wird, bleiben Sie bei text / javascript hängen. Wenn Sie sich nicht für die Gültigkeit interessieren (HTML5 ausgeschlossen), geben Sie einfach keinen Typ an.

Radu
quelle
Woher hast du das? Ich bin mir ziemlich sicher, dass es unterstützt wird. Oder zumindest wird es ignoriert.
Zenexer
@Zenexer las seine Antwort auf eine andere Frage . Scheinbar bedeutet IE-Kompatibilität nein application/javascript.
Camilo Martin
@CamiloMartin Ich benutze es gut mit IE bis zu 6 die ganze Zeit. Sie verwenden standardmäßig nur JavaScript.
Zenexer
@ Zenxer Hm, seltsam. Ich frage mich, worum es in den anderen Fragen und Antworten ging.
Camilo Martin
@Zenexer Es ist schon eine Weile her, dass ich mich damit befassen musste, aber hier sind einige andere Berichte darüber, die Probleme mit IE6-8 verursachen. Ich bin mir nicht ganz sicher, warum dies nur manchmal wichtig zu sein scheint, aber meiner Erfahrung nach hat es Probleme verursacht.
Radu