Start · Sprachen · JavaScript · Referenz · Document: beforescriptexecute

Document: beforescriptexecute

Ereignis

Wird am <code>Document</code> ausgelöst, kurz bevor ein statisches <code>&lt;script&gt;</code>-Element ausgeführt wird; lässt sich mit <code>preventDefault()</code> abbrechen.

seit JavaScript Nicht standardisiert, veraltet – nur Firefox (Geck deprecated seit ja Kategorie: webapi

Signatur

document.addEventListener("beforescriptexecute", handler)

Beschreibung

Das Ereignis beforescriptexecute tritt auf, kurz bevor ein im HTML-Quelltext stehendes (statisches) <script>-Element ausgeführt wird. Das Ziel des Ereignisses (event.target) ist das betroffene <script>-Element. Das Ereignis steigt bis zum document auf und kann dort zentral abgefangen werden.

Weil es abbrechbar ist, verhindert ein Aufruf von event.preventDefault() die Ausführung des Skripts. Früher nutzten Erweiterungen und Userscripts das, um unerwünschte Inline-Skripte zu blockieren oder Skripte vor der Ausführung zu protokollieren. Das Gegenstück afterscriptexecute wird ausgelöst, nachdem das Skript ausgeführt wurde.

Registrieren kannst du den Handler mit document.addEventListener("beforescriptexecute", handler) oder über die Eigenschaft document.onbeforescriptexecute. Wichtig: Das Ereignis ist nicht standardisiert, gilt als veraltet und wird nur von Firefox unterstützt. Für Produktivcode ist es daher ungeeignet; für die Skriptkontrolle nimmt man heute die Content Security Policy oder einen MutationObserver.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Der Ereignisname "beforescriptexecute".
$handler Pflicht (event: Event) => void Callback, der ein allgemeines Event bekommt. event.target ist das HTMLScriptElement, das gleich ausgeführt wird.
$options boolean | AddEventListenerOptions false Optionen wie capture, once, passive oder signal. Mit passive: true ist preventDefault() wirkungslos.

Rückgabewert

Typ
void
Beschreibung
addEventListener gibt nichts zurück. Ruft der Handler event.preventDefault() auf, wird das Skript nicht ausgeführt.

Beispiele

Skriptausführungen protokollieren

// Muss vor den zu beobachtenden Skripten im <head> stehen
document.addEventListener("beforescriptexecute", (event) => {
  const script = event.target;
  const quelle = script.src || "(Inline-Skript)";
  console.log("Gleich ausgeführt:", quelle);
});
Gleich ausgeführt: https://example.com/app.js Gleich ausgeführt: (Inline-Skript)

Skripte einer bestimmten Domain blockieren

const blockierteHosts = ["tracker.example.net"];

document.addEventListener("beforescriptexecute", (event) => {
  const { src } = event.target;
  if (!src) return;
  const host = new URL(src, location.href).hostname;
  if (blockierteHosts.includes(host)) {
    event.preventDefault(); // Ausführung verhindern
    console.warn("Blockiert:", src);
  }
});
Blockiert: https://tracker.example.net/t.js

Handler per on-Property setzen und wieder entfernen

const beobachter = (event) => {
  console.log("Skript:", event.target.id || "ohne id");
};

// Feature-Erkennung: gibt es die on-Property?
if ("onbeforescriptexecute" in document) {
  document.onbeforescriptexecute = beobachter;

  // Nach dem Laden nicht mehr nötig
  window.addEventListener("load", () => {
    document.onbeforescriptexecute = null;
  });
} else {
  console.log("beforescriptexecute wird nicht unterstützt");
}
beforescriptexecute wird nicht unterstützt // z. B. in Chrome/Safari

Einmaliger Listener mit removeEventListener

const einmal = (event) => {
  console.log("Erstes Skript:", event.target.src || "inline");
  document.removeEventListener("beforescriptexecute", einmal);
};

document.addEventListener("beforescriptexecute", einmal);
Erstes Skript: inline

// Wichtig · Fallstricke

  • Nicht standardisiert und veraltet: Nur Firefox kennt das Ereignis. Chrome, Edge und Safari lösen es nie aus. Nicht in Produktivcode verwenden.
  • Nur statische Skripte: Für Skripte, die dynamisch eingefügt werden (z. B. mit appendChild() oder document.createElement(\"script\")), wird das Ereignis nicht ausgelöst. Das gilt auch für Modul-Skripte (type=\"module\").
  • Reihenfolge: Der Listener muss registriert sein, bevor der Parser das betroffene Skript erreicht. Er gehört also möglichst weit nach oben in den <head>.
  • Keine Sicherheitsgrenze: Wer Skripte so blockiert, bekommt keinen verlässlichen Schutz vor XSS. Nimm stattdessen eine Content Security Policy (script-src, Nonces, Hashes) oder Trusted Types.
  • Mit { passive: true } registriert, kann der Listener die Ausführung nicht verhindern.