Naar de inhoud
Gratis naslagwerk over HTML
HTML leren en naslaan
Naslag / Structuur van een pagina

Het element <script>

Het <script>-element van HTML wordt gebruikt om uitvoerbare code of gegevens in te sluiten; dit wordt doorgaans gebruikt om JavaScript-code in te sluiten of ernaar te verwijzen. Het <script>-element kan ook gebruikt worden met andere talen, zoals de GLSL-shaderprogrammeertaal van WebGL en JSON.

Attributen

Dit element bevat de globale attributen.

async

Voor klassieke scripts geldt: als het async-attribuut aanwezig is, wordt het klassieke script parallel aan het parsen opgehaald en zo snel mogelijk geëvalueerd zodra het beschikbaar is.

Voor modulescripts geldt: als het async-attribuut aanwezig is, worden de scripts en al hun afhankelijkheden parallel aan het parsen opgehaald en zo snel mogelijk geëvalueerd zodra ze beschikbaar zijn.

Let op

Dit attribuut mag niet gebruikt worden als het src-attribuut ontbreekt (dat wil zeggen bij inline scripts) voor klassieke scripts; in dat geval zou het geen effect hebben.

Dit attribuut maakt het mogelijk om parser-blokkerende JavaScript te elimineren, waarbij de browser scripts zou moeten laden en evalueren voordat het verdergaat met parsen. defer heeft in dit geval een vergelijkbaar effect.

Als het attribuut samen met het defer-attribuut opgegeven wordt, gedraagt het element zich alsof alleen het async-attribuut opgegeven is.

Dit is een booleaans attribuut: de aanwezigheid van een booleaans attribuut op een element representeert de waarde true, en de afwezigheid van het attribuut representeert de waarde false.

Zie Browsercompatibiliteit voor opmerkingen over browserondersteuning. Zie ook Async scripts for asm.js.

attributionsrc Verouderd Niet-standaard

Geeft aan dat u wilt dat de browser een Attribution-Reporting-Eligible-header meestuurt met het verzoek om de scriptbron. Aan de serverzijde wordt dit gebruikt om het verzenden van een Attribution-Reporting-Register-Source- of Attribution-Reporting-Register-Trigger-header in het antwoord te triggeren, om respectievelijk een op JavaScript gebaseerde attributiebron of attributietrigger te registreren. Welke antwoordheader teruggestuurd moet worden, hangt af van de waarde van de Attribution-Reporting-Eligible-header die de registratie geactiveerd heeft.

Opmerking

Als alternatief kunnen op JavaScript gebaseerde attributiebronnen of -triggers geregistreerd worden door een fetch()-verzoek te sturen met de attributionReporting-optie (rechtstreeks ingesteld op de fetch()-aanroep of op een Request-object dat aan de fetch()-aanroep meegegeven wordt), of door een XMLHttpRequest te sturen waarop setAttributionReporting() op het requestobject aangeroepen is.

Er zijn twee versies van dit attribuut die u kunt instellen:

  • Booleaans, dat wil zeggen alleen de naam attributionsrc. Dit geeft aan dat u wilt dat de header Attribution-Reporting-Eligible naar dezelfde server gestuurd wordt waar het src-attribuut naar verwijst. Dit is prima wanneer u de registratie van de attributiebron of -trigger op dezelfde server afhandelt. Bij het registreren van een attributietrigger is deze eigenschap optioneel, en wordt een lege stringwaarde gebruikt als deze weggelaten wordt.

  • Een waarde die een of meer URL's bevat, bijvoorbeeld:

    HTML
    <script
      src="myscript.js"
      attributionsrc="https://a.example/register-source https://b.example/register-source"></script>

    Dit is nuttig in gevallen waarin de opgevraagde bron zich niet op een server bevindt die u beheert, of wanneer u de registratie van de attributiebron gewoon op een andere server wilt afhandelen. In dit geval kunt u een of meer URL's opgeven als waarde van attributionsrc. Wanneer het bronverzoek plaatsvindt, wordt de header Attribution-Reporting-Eligible naast de bronorigin ook naar de URL('s) gestuurd die opgegeven zijn in attributionSrc. Deze URL's kunnen vervolgens naar behoefte antwoorden met een header Attribution-Reporting-Register-Source of Attribution-Reporting-Register-Trigger om de registratie te voltooien.

    Opmerking

    Het opgeven van meerdere URL's betekent dat er meerdere attributiebronnen voor dezelfde functionaliteit geregistreerd kunnen worden. U zou bijvoorbeeld verschillende campagnes kunnen hebben waarvan u het succes probeert te meten, waarbij verschillende rapporten over verschillende gegevens gegenereerd worden.

Zie de Attribution Reporting API voor meer informatie.

blocking

Dit attribuut geeft expliciet aan dat bepaalde bewerkingen geblokkeerd moeten worden totdat het script uitgevoerd is. De bewerkingen die geblokkeerd moeten worden, moeten een door spaties gescheiden lijst met blokkerende tokens zijn. Momenteel is er slechts één token:

  • render: Het weergeven van inhoud op het scherm wordt geblokkeerd.
Opmerking

Alleen script-elementen in de <head> van het document kunnen mogelijk het renderen blokkeren. Scripts zijn standaard niet render-blokkerend; als een script-element geen type="module", async of defer bevat, blokkeert het parsen, niet renderen. Als zo'n script-element dynamisch via een script toegevoegd wordt, moet u blocking = "render" instellen om het renderen ermee te blokkeren.

crossorigin

Normale script-elementen geven minimale informatie door aan window.onerror voor scripts die niet slagen voor de standaard CORS-controles. Om foutlogging mogelijk te maken voor sites die een apart domein voor statische media gebruiken, gebruikt u dit attribuut. Zie CORS settings attributes voor een uitgebreidere uitleg van de geldige argumenten ervan.

defer

Dit booleaanse attribuut wordt ingesteld om aan een browser aan te geven dat het script bedoeld is om uitgevoerd te worden nadat het document geparset is, maar voordat het DOMContentLoaded-event afgevuurd wordt.

Scripts met het defer-attribuut voorkomen dat het DOMContentLoaded-event afgevuurd wordt totdat het script geladen en klaar met evalueren is.

Let op

Dit attribuut mag niet gebruikt worden als het src-attribuut ontbreekt (dat wil zeggen bij inline scripts); in dat geval zou het geen effect hebben.

Het defer-attribuut heeft geen effect op modulescripts — deze zijn standaard al uitgesteld.

Scripts met het defer-attribuut worden uitgevoerd in de volgorde waarin ze in het document voorkomen.

Dit attribuut maakt het mogelijk om parser-blokkerende JavaScript te elimineren, waarbij de browser scripts zou moeten laden en evalueren voordat het verdergaat met parsen. async heeft in dit geval een vergelijkbaar effect.

Als het attribuut samen met het async-attribuut opgegeven wordt, gedraagt het element zich alsof alleen het async-attribuut opgegeven is.

fetchpriority

Geeft een hint over de relatieve prioriteit die gebruikt moet worden bij het ophalen van een extern script. Toegestane waarden:
  • high
    • : Haal het externe script op met een hoge prioriteit ten opzichte van andere externe scripts.
  • low
    • : Haal het externe script op met een lage prioriteit ten opzichte van andere externe scripts.
  • auto
    • : Stel geen voorkeur in voor de ophaalprioriteit. Dit is de standaardwaarde. Deze wordt gebruikt als er geen of een ongeldige waarde ingesteld is.

integrity

Dit attribuut bevat een of meer hashes van het script. Het wordt gebruikt om te garanderen dat de inhoud van het script overeenkomt met wat de ontwikkelaar verwacht, en niet vervangen is door een kwaadaardig script bij een supplychainaanval. Het attribuut mag niet opgegeven worden wanneer het src-attribuut ontbreekt. Zie ook Subresource Integrity.

nomodule

Dit booleaanse attribuut wordt ingesteld om aan te geven dat het script niet uitgevoerd moet worden in browsers die ES-modules ondersteunen — hiermee kan dit gebruikt worden om fallback-scripts aan te bieden voor oudere browsers die geen modulaire JavaScript-code ondersteunen.

nonce

Een cryptografische nonce (een getal dat maar één keer gebruikt wordt) om scripts toe te staan in een script-src Content-Security-Policy. De server moet elke keer dat hij een policy verzendt een unieke nonce-waarde genereren. Het is cruciaal om een nonce te leveren die niet te raden is, aangezien het omzeilen van het beleid van een bron anders triviaal is.

referrerpolicy

Geeft aan welke referrer verzonden moet worden bij het ophalen van het script, of van bronnen die door het script opgehaald worden:

  • no-referrer: De Referer-header wordt niet verzonden.
  • no-referrer-when-downgrade: De Referer-header wordt niet verzonden naar origins zonder TLS (HTTPS).
  • origin: De verzonden referrer wordt beperkt tot de origin van de verwijzende pagina: het schema, de host en de port.
  • origin-when-cross-origin: De referrer die naar andere origins gestuurd wordt, wordt beperkt tot het schema, de host en de poort. Navigaties binnen dezelfde origin bevatten nog steeds het pad.
  • same-origin: Er wordt een referrer verzonden voor dezelfde origin, maar cross-origin-verzoeken bevatten geen referrer-informatie.
  • strict-origin: Verzend alleen de origin van het document als referrer wanneer het beveiligingsniveau van het protocol gelijk blijft (HTTPS→HTTPS), maar niet naar een minder veilige bestemming (HTTPS→HTTP).
  • strict-origin-when-cross-origin (standaard): Verzend een volledige URL bij een verzoek binnen dezelfde origin, verzend alleen de origin wanneer het beveiligingsniveau van het protocol gelijk blijft (HTTPS→HTTPS), en verzend geen header naar een minder veilige bestemming (HTTPS→HTTP).
  • unsafe-url: De referrer bevat de origin en het pad (maar niet het fragment, wachtwoord of de gebruikersnaam). Deze waarde is onveilig, omdat deze origins en paden van TLS-beveiligde bronnen lekt naar onveilige origins.
Opmerking

Een lege stringwaarde ("") is zowel de standaardwaarde als een terugvalwaarde als referrerpolicy niet ondersteund wordt. Als referrerpolicy niet expliciet opgegeven is op het <script>-element, neemt het een hoger-niveau referrerbeleid over, dat wil zeggen een beleid dat ingesteld is voor het hele document of domein. Als er geen hoger-niveaubeleid beschikbaar is, wordt de lege string behandeld als gelijk aan strict-origin-when-cross-origin.

src

Dit attribuut geeft de URI van een extern script op; dit kan gebruikt worden als alternatief voor het rechtstreeks insluiten van een script in een document.

type

Dit attribuut geeft het type van het gerepresenteerde script aan. De waarde van dit attribuut is een van de volgende:
  • Attribuut niet ingesteld (standaard), een lege string, of een JavaScript-MIME-type
    • : Geeft aan dat het script een "klassiek script" is dat JavaScript-code bevat. Auteurs wordt aangeraden het attribuut weg te laten als het script naar JavaScript-code verwijst, in plaats van een MIME-type op te geven. JavaScript-MIME-typen staan vermeld in de IANA media types-specificatie.
  • importmap
    • : Deze waarde geeft aan dat de body van het element een import map bevat. De import map is een JSON-object dat ontwikkelaars kunnen gebruiken om te bepalen hoe de browser modulespecificaties oplost bij het importeren van JavaScript-modules.
  • module
    • : Deze waarde zorgt ervoor dat de code behandeld wordt als een JavaScript-module. De verwerking van de scriptinhoud wordt uitgesteld. De attributen charset en defer hebben geen effect. Zie onze gids JavaScript-modules voor informatie over het gebruik van module. In tegenstelling tot klassieke scripts vereisen modulescripts het gebruik van het CORS-protocol voor cross-origin ophalen.
  • speculationrules Experimenteel
    • : Deze waarde geeft aan dat de body van het element speculatieregels bevat. Speculatieregels hebben de vorm van een JSON-object dat bepaalt welke bronnen door de browser vooraf opgehaald (prefetch) of vooraf gerenderd (prerender) moeten worden. Dit maakt deel uit van de .
  • Elke andere waarde
    • : De ingesloten inhoud wordt behandeld als een gegevensblok en wordt niet door de browser verwerkt. Ontwikkelaars moeten een geldig MIME-type gebruiken dat geen JavaScript-MIME-type is om gegevensblokken aan te duiden. Alle overige attributen worden genegeerd, inclusief het src-attribuut.

Verouderde attributen

charset VerouderdIndien aanwezig, moet de waarde een ASCII-hoofdletterongevoelige overeenkomst zijn met utf-8. Het is niet nodig om het charset-attribuut op te geven, omdat documenten UTF-8 moeten gebruiken en het script-element zijn tekencodering overneemt van het document.
language Verouderd Niet-standaardNet als het type-attribuut identificeert dit attribuut de gebruikte scripttaal. In tegenstelling tot het type-attribuut zijn de mogelijke waarden van dit attribuut echter nooit gestandaardiseerd. Het type-attribuut zou in plaats daarvan gebruikt moeten worden.

Opmerkingen

Scripts zonder de attributen async, defer of type="module", evenals inline scripts zonder het type="module"-attribuut, worden onmiddellijk opgehaald en uitgevoerd voordat de browser doorgaat met het parsen van de pagina.

Het script moet aangeboden worden met het text/javascript-MIME-type, maar browsers zijn coulant en blokkeren scripts alleen als ze aangeboden worden met een afbeeldingstype (image/*), een videotype (video/*), een audiotype (audio/*), of text/csv. Als het script geblokkeerd wordt, wordt er een error-event naar het element gestuurd; anders wordt er een load-event gestuurd.

Voorbeelden

Basisgebruik

Dit voorbeeld laat zien hoe u (een extern) script importeert met behulp van het <script>-element:

HTML
<script src="javascript.js"></script>

Het volgende voorbeeld laat zien hoe u (een inline) script binnen het <script>-element plaatst:

HTML
<script>
  alert("Hello World!");
</script>

async en defer

Scripts die geladen worden met het async-attribuut worden gedownload zonder de pagina te blokkeren terwijl het script opgehaald wordt. Zodra de download voltooid is, wordt het script echter uitgevoerd, wat het renderen van de pagina blokkeert. Dit betekent dat de rest van de inhoud op de webpagina niet verwerkt en aan de gebruiker getoond kan worden totdat het script klaar is met uitvoeren. U krijgt geen garantie dat scripts in een specifieke volgorde uitgevoerd worden. Het is het beste om async te gebruiken wanneer de scripts op de pagina onafhankelijk van elkaar draaien en niet afhankelijk zijn van een ander script op de pagina.

Scripts die geladen worden met het defer-attribuut worden geladen in de volgorde waarin ze op de pagina voorkomen. Ze worden pas uitgevoerd nadat de volledige paginainhoud geladen is, wat nuttig is als uw scripts afhankelijk zijn van het feit dat de DOM al aanwezig is (bijvoorbeeld als ze een of meer elementen op de pagina wijzigen).

Hier is een visuele weergave van de verschillende methoden voor het laden van scripts en wat dat betekent voor uw pagina:

How the three script loading method work: default has parsing blocked while JavaScript is fetched and executed. With async, the parsing pauses for execution only. With defer, parsing isn't paused, but execution on happens after everything is else is parsed.

Deze afbeelding is afkomstig uit de HTML-specificatie, gekopieerd en bijgesneden tot een verkleinde versie, onder de licentievoorwaarden van CC BY 4.0.

Stel bijvoorbeeld dat u de volgende script-elementen heeft:

HTML
<script async src="js/vendor/jquery.js"></script>
<script async src="js/script2.js"></script>
<script async src="js/script3.js"></script>

U kunt niet vertrouwen op de volgorde waarin de scripts geladen worden. jquery.js kan voor of na script2.js en script3.js laden, en als dat het geval is, geeft elke functie in die scripts die van jquery afhankelijk is een fout, omdat jquery op het moment dat het script draait nog niet gedefinieerd is.

async moet gebruikt worden wanneer u een reeks achtergrondscripts heeft om te laden en u ze gewoon zo snel mogelijk gereed wilt hebben. Misschien heeft u bijvoorbeeld een aantal speldatabestanden om te laden, die nodig zijn zodra het spel daadwerkelijk begint, maar voorlopig wilt u gewoon doorgaan met het tonen van de spelintro, titels en lobby, zonder dat deze geblokkeerd worden door het laden van scripts.

Scripts die geladen worden met het defer-attribuut (zie hieronder) worden uitgevoerd in de volgorde waarin ze op de pagina voorkomen, zodra het script en de inhoud gedownload zijn:

HTML
<script defer src="js/vendor/jquery.js"></script>
<script defer src="js/script2.js"></script>
<script defer src="js/script3.js"></script>

In het tweede voorbeeld kunnen we er zeker van zijn dat jquery.js laadt voordat script2.js en script3.js laden, en dat script2.js laadt voordat script3.js laadt. Ze worden pas uitgevoerd nadat de volledige paginainhoud geladen is, wat nuttig is als uw scripts afhankelijk zijn van het feit dat de DOM al aanwezig is (bijvoorbeeld als ze een of meer elementen op de pagina wijzigen).

Samengevat:

  • async en defer geven beide de browser de instructie om de script(s) in een aparte thread te downloaden terwijl de rest van de pagina (de DOM, enzovoort) gedownload wordt, zodat het laden van de pagina niet geblokkeerd wordt tijdens het ophaalproces.
  • Scripts met een async-attribuut worden uitgevoerd zodra de download voltooid is. Dit blokkeert de pagina en garandeert geen specifieke uitvoeringsvolgorde.
  • Scripts met een defer-attribuut worden geladen in de volgorde waarin ze voorkomen en pas uitgevoerd zodra alles klaar is met laden.
  • Als uw scripts onmiddellijk uitgevoerd moeten worden en geen afhankelijkheden hebben, gebruikt u async.
  • Als uw scripts moeten wachten op het parsen en afhankelijk zijn van andere scripts en/of van het aanwezig zijn van de DOM, laadt u ze met defer en plaatst u de bijbehorende <script>-elementen in de volgorde waarin u wilt dat de browser ze uitvoert.

Modulefallback

Browsers die de waarde module voor het type-attribuut ondersteunen, negeren elk script met een nomodule-attribuut. Hierdoor kunt u modulescripts gebruiken terwijl u met nomodule gemarkeerde fallback-scripts aanbiedt voor niet-ondersteunende browsers.

HTML
<script type="module" src="main.js"></script>
<script nomodule src="fallback.js"></script>

Modules importeren met importmap

Wanneer u modules importeert in scripts en u de type=importmap-functionaliteit niet gebruikt, moet elke module geïmporteerd worden met een modulespecificatie die ofwel een absolute ofwel een relatieve URL is. In het onderstaande voorbeeld is de eerste modulespecificatie een absolute URL, terwijl de tweede ("./shapes/square.js") opgelost wordt ten opzichte van de basis-URL van het document.

JS
import { name as circleName } from "https://example.com/shapes/circle.js";
import { name as squareName, draw } from "./shapes/square.js";

Een import map stelt u in staat om een mapping op te geven die, indien overeenkomend, de tekst in de modulespecificatie kan vervangen. De onderstaande import map definieert de sleutels circle en square, die gebruikt kunnen worden als aliassen voor de hierboven getoonde modulespecificaties.

HTML
<script type="importmap">
  {
    "imports": {
      "circle": "https://example.com/shapes/circle.js",
      "square": "./shapes/square.js"
    }
  }
</script>

Hierdoor kunnen we modules importeren met behulp van namen in de modulespecificatie (in plaats van absolute of relatieve URL's).

JS
import { name as circleName } from "circle";
import { name as squareName, draw } from "square";

Voor meer voorbeelden van wat u kunt doen met import maps, zie de sectie Modules importeren met import maps in de gids voor JavaScript-modules.

Gegevens insluiten in HTML

U kunt het <script>-element ook gebruiken om gegevens in HTML in te sluiten bij server-side rendering, door een geldig niet-JavaScript-MIME-type op te geven in het type-attribuut.

HTML
<!-- Generated by the server -->
<script id="data" type="application/json">
  {
    "userId": 1234,
    "userName": "Maria Cruz",
    "memberSince": "2000-01-01T00:00:00.000Z"
  }
</script>

<!-- Static -->
<script>
  const userInfo = JSON.parse(document.getElementById("data").text);
  console.log("User information: %o", userInfo);
</script>

Renderen blokkeren totdat een script opgehaald en uitgevoerd is

U kunt het render-token opnemen in een blocking-attribuut; het renderen van de pagina wordt dan geblokkeerd totdat het script opgehaald en uitgevoerd is. In het onderstaande voorbeeld blokkeren we het renderen bij een async-script, zodat het script het parsen niet blokkeert, maar wel gegarandeerd geëvalueerd wordt voordat het renderen begint.

HTML
<script blocking="render" async src="async-script.js"></script>

Technische samenvatting

Content categories Metadata content, Flow content, Phrasing content.
Toegestane inhoud Dynamisch script zoals text/javascript.
Weglaten van tag Geen, zowel de begin- als eindtag zijn verplicht.
Toegestane ouders Elk element dat metadata content accepteert, of elk element dat phrasing content accepteert.
Impliciete ARIA-rol Geen bijbehorende rol
Toegestane ARIA-rollen Geen role toegestaan
DOM-interface HTMLScriptElement

Varianten van <script>

Verwante elementen