Hai bisogno di testo / javascript specificato nei tag <script>?


157

Ho letto da qualche parte che non hai più bisogno di cose come type="text/javascript"e le cose strane CDATAe <!--nei tag dei tuoi script. Quindi, invece di:

<script type="text/javascript">
//<![CDATA[
<!--

    //your script here

-->
//]]>
</script>

Dovresti semplicemente fare:

<script>
    //your script here
</script>

Non riesco a ricordare dove ho letto questo però. Penso che sia stato da un ingegnere di Google o Yahoo e hanno specificamente menzionato quali browser richiedessero questi costrutti arcaici e perché. Qualcuno sa di quale post / articolo di blog si è parlato o ha una buona risorsa a parlarne?


Per i nuovi browser, ma su quelli più vecchi (se esistono ancora) <! - -> è necessario. Informazioni sul tipo in alcune app se non omesso, ha bisogno di quello giusto.
Bakudan,

1
Buona lettura su CDATA: stackoverflow.com/questions/66837/…
kapa

1
Ogni volta che apro un file con text/javascriptspecificato, lo rimuovo. È rumore.
The Muffin Man,

Un post molto correlato qui contenente informazioni aggiornate sulle linee guida HTML5 nella risposta accettata.
RBT

Risposte:


135

Vedi il testo di Crockford sul <script>tag , in particolare:

Non utilizzare l' <!-- //-->hack con gli script. È stato progettato per impedire che gli script vengano visualizzati come testo nei browser di prima generazione Netscape 1 e Mosaic. Non è stato necessario per molti anni. <!-- //-->dovrebbe segnalare un commento HTML. I commenti devono essere ignorati, non compilati ed eseguiti. Inoltre, i commenti HTML non devono essere inclusi --, quindi uno script che diminuisce presenta un errore HTML.

...

type="text/javascript"

Questo attributo è facoltativo. Da Netscape 2, il linguaggio di programmazione predefinito in tutti i browser è JavaScript. In XHTML, questo attributo è obbligatorio e non necessario. In HTML, è meglio lasciarlo fuori. Il browser sa cosa fare.


75
Richiesto e non necessario? Mi sto perdendo qualcosa?
Izkata,

17
@Izkata, è necessario per la convalida, ma non ha alcun effetto.
bdukes

14
"Il browser sa cosa fare" ... per ora. Che dire della prossima settimana in cui RubyScript (l'ho inventato come esempio) è reso popolare e tutti si agitano i pantaloni per adottarlo? Questo è lo stesso tipo di pensiero miope che fa sì che le persone nominino i loro file "_new" e confonda altre persone per anni. È il "_nuovo"? O "_new_new"? O "_newer"? L'IMO è miope.
Slobaum,

18
@Slobaum, la specifica HTML5 afferma che per impostazione predefinita è JavaScript . Se ci sono nuovi tipi di script, verranno implementati solo nelle nuove versioni del browser che supportano tale impostazione predefinita dalle specifiche.
bdukes l'

8
se RubyScriptdiventa popolare, finirà .rbscripte il browser agirà di conseguenza.
Kirk Strobeck,

45

È una raccomandazione di Crockford . So di averlo visto echeggiare altrove (ppk forse?). Le specifiche HTML5 non le richiedono.

Stranamente, è diventato in qualche modo coraggioso utilizzare l'attributo "type" per contrassegnare i <script>blocchi che non si desidera valutare:

<script type='text/html-template'>
  <div> this is a template </div>
</script>

Dando uno strano tipo non JavaScript, si ottiene un modo per inserire il testo non elaborato nella pagina per usarlo con altro codice JavaScript (che è presumibilmente in un blocco di script che può essere valutato).


non riesco a capire appieno. per favore, spiega cosa type="text/html"significa e cosa text/javascriptsignifica ... grazie
T.Todua

4
@tazotodua non è molto importante cosa significhi "text / html"; la cosa importante è che è non è "text / javascript", i browser ignorano completamente il contenuto del <script>blocco. Tuttavia, l' <script> avrà a far parte del DOM, in modo che altri codice JavaScript possa trovare ed estrarre il loro contenuto.
Punta appuntita

È un trucco interessante. Non sono sicuro per cosa lo userei, però.
brennanyoung,

2
w3schools : In HTML5, the type attribute is no longer required for JavaScript. The default value is "application/javascript".
Amin Soheyli,

19

HTML5 non ha bisogno di type="text/javascript"(è l'impostazione predefinita).

CDATA è necessario solo per le pagine XHTML, se lo script contiene caratteri HTML (come '<' e '>').

<!-- dovrebbe essere necessario solo per i browser VECCHI.



3

L' attributo type identifica il linguaggio di scripting del codice incorporato in un elemento di script o referenziato tramite l'attributo src dell'elemento. Questo è specificato come tipo MIME; esempi di tipi MIME supportati includono text / javascript, text / ecmascript, application / javascript e application / ecmascript.

Secondo le specifiche HTML 4.01

L' attributo type specifica il linguaggio di scripting del contenuto dell'elemento e sovrascrive il linguaggio di scripting predefinito. Il linguaggio di scripting è specificato come tipo di contenuto (ad es. "Text / javascript"). Gli autori devono fornire un valore per questo attributo. Non esiste un valore predefinito per questo attributo.

Ma in HTML5 text/javascript è il tipo predefinito, quindi puoi ometterlo

L' attributo type fornisce la lingua dello script o il formato dei dati. Se l'attributo è presente, il suo valore deve essere un tipo MIME valido. Il parametro charset non deve essere specificato. L'impostazione predefinita, utilizzata se l'attributo è assente, è "text / javascript".


1
in altre parole, ometterlo potrebbe causare errori nei vecchi browser che non supportano HTML5
Serge

2

potresti pensare a questo articolo qui con la dipendenza che gli script impostano automaticamente text / javascript in HTML5 automaticamente, mentre i browser non HTML5 si aspettano ancora che tu definisca il tipo in modo specifico, anche se quasi sempre indovineranno text / javascript .


1

spetta al browser interpretare scriptcorrettamente il blocco in base alle intestazioni, credo, e non typeall'attributo. Quindi, per rispondere alla tua domanda, no non è necessario per i browser moderni (sto parlando IE7 +, FF, Webkit). Se stai supportando browser più vecchi di così ... Mi dispiace per te =)


2
Non dimenticare la Cina con oltre 385 milioni di utenti, molti dei quali utilizzano ancora IE6. netmarketshare.com/…
catena

3
conoscendo la severa politica di internet in Cina, è probabile che il tuo sito non li raggiunga mai = P
hellatan

La domanda riguarda uno script inline, quindi non ci sono intestazioni diverse dalla pagina principale (che sarebbe un tipo di contenuto HTML). Ad ogni modo, hai una fonte che indica che i browser tengono conto delle intestazioni (ad esempio se hai <script src = "qualcosa"> </script> semplice e hai pubblicato un'intestazione VBScript, c'è qualche browser che lo interpreterebbe come VBScript) ?
Matthew Flaschen,

1

Se stai inserendo un tag script all'interno di SVG , devi specificare l'attributo type. E dovrebbe essere "text/ecmascript"piuttosto che "text/javascript".

Se il tuo script è in linea (non collegato) dovrai avvolgere anche il corpo dello script in una dichiarazione CDATA. Lo scriptplate inline script per SVG (e altre varianti XML) è quindi

<script type="text/ecmascript">
<![CDATA[
// your javascript code goes here
]]>
</script>

Questi potrebbero essere casi speciali "allo stato brado", ma sono abbastanza reali e l'utilizzo di SVG è in crescita, quindi non è corretto per chiunque suggerire che l'attributo type e CDATA siano completamente obsoleti nei browser moderni. I casi d'uso sono stretti, sì, ma non inauditi.

"Cambia l'ambiente al suo contrario e ogni saggezza diventa la peggiore della follia." - Ashby


1
Ottima scelta. Ho appena lavorato su un SVG complesso e questo è davvero il caso!
Dave Everitt,

1

👉🏻 La specifica HTML5 esorta gli autori a omettere l'attributo anziché fornire un tipo MIME ridondante. MDN

L' analisi MIME standard permette di essere servita JavaScript utilizzando qualsiasi tipo MIME ( Multipurpose Internet Mail Extensions ) che corrisponde al seguente:

<script type="application/javascript"></script>
<script type="application/ecmascript"></script>

<script type="text/javascript"></script>
<script type="text/ecmascript"></script>

0

Bene, continuo a vedere altri esempi senza il testo / javascript ma per qualche ragione i miei script non funzioneranno in FF quando lo faccio. Consiglierei di conservare la dichiarazione text / javascript. Il tag CDATA impedisce che javascript sia mostrato come testo normale nel tuo sito web se il tuo browser ha javascript disattivato. Personalmente non uso più quei tag, non penso che ci siano molti utenti là fuori senza e se sono là fuori potrebbero voler far crescere un po 'di cervello: P


Né l'attributo type né la vecchia cosa CDATA sono necessari a meno che tu non voglia davvero scegliere come target browser veramente antichi. Non dovrebbero far male a nulla, purché utilizzi davvero il tipo giusto.
Punta il

Sto usando l'ultima versione stabile di FF e sembra che abbia problemi ad analizzare senza la dichiarazione di text / javascript, io uso jQuery btw ma questo non dovrebbe fare la differenza.
Michael

Bene, eseguo tutta la mia applicazione web con tag di script che sono semplicemente semplici <script>, senza "linguaggio" e senza "tipo", e funzionano perfettamente in tutti i browser. (Bene, tutti quelli ragionevoli: FF, Chrome, Safari, IE, Opera.)
Pointy

1
@pointy sembra che FatherStorm abbia appena pubblicato una risposta al perché questo sta accadendo. quindi i tuoi commenti sembrano essere errati.
Michael

@Michael potrebbe essere il caso che se hai commesso l'errore di usare XHTML / Strict potresti avere un problema, ma anche allora ne dubito. Esiste un accordo generale tra i luminari del mondo JavaScript sul fatto che l'attributo "tipo" non sia necessario, e in effetti dato che un "tipo" errato romperà uno script, è solo una fonte di bug.
Punta il

0

type="text/javascript" : Richiesto in HTML 4 e XHTML, ma facoltativo in HTML5.

CDATA : Richiesto in XHTML.

<!--: Utilizzato per nascondere JavaScript da browser molto vecchi. Ad esempio: Netscape 1 e Internet Explorer 2, nessuno dei quali nessuno ne utilizza più.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.