Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

DedicatedWorkerGlobalScope: cancelAnimationFrame() Methode

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨März 2023⁩.

Hinweis: Diese Funktion ist nur in Dedicated Web Workers verfügbar.

Die cancelAnimationFrame() Methode der DedicatedWorkerGlobalScope Schnittstelle storniert eine zuvor durch einen Aufruf von requestAnimationFrame() geplante Animationsframe-Anforderung.

Das Aufrufen der cancelAnimationFrame() Methode erfordert, dass der aktuelle Worker ein zugeordnetes Eigentümer-window hat. Das bedeutet, dass der aktuelle Worker von einem window oder von einem dedizierten Worker, der ebenfalls ein zugeordnetes Eigentümer-window hat, erstellt worden sein muss.

Syntax

js
cancelAnimationFrame(handle)

Parameter

handle

Die ID, die durch einen Aufruf von requestAnimationFrame() zurückgegeben wurde; der Aufruf muss im selben Worker erfolgt sein.

Rückgabewert

Keiner (undefined).

Ausnahmen

NotSupportedError DOMException

Wird ausgelöst, wenn die Methode vom aktuellen Worker nicht unterstützt wird.

Beispiele

Hier ist ein vollständiges Beispiel, das zeigt, wie requestAnimationFrame() in einem dedizierten Worker mit einem OffscreenCanvas verwendet wird.

Das HTML sollte Folgendes enthalten:

html
<canvas width="100" height="100"></canvas>

Es sollte auf folgendes JavaScript verlinken:

js
const worker = new Worker("worker.js");

// Transfer canvas control to the worker
const offscreenCanvas = document
  .querySelector("canvas")
  .transferControlToOffscreen();

// Start the animation
worker.postMessage(
  {
    type: "start",
    canvas: offscreenCanvas,
  },
  [offscreenCanvas],
);

// Stop the animation after 5 seconds
setTimeout(() => {
  worker.postMessage({
    type: "stop",
  });
}, 5000);

worker.js:

js
let ctx;
let pos = 0;
let animationId;
let isRunning = false;
let lastTime = 0;

function draw(currentTime) {
  if (!isRunning) return;

  // Calculate delta time for smooth animation
  if (lastTime === 0) lastTime = currentTime;
  const deltaTime = (currentTime - lastTime) / 1000;
  lastTime = currentTime;

  // Clear and draw the moving rectangle
  ctx.clearRect(0, 0, 100, 100);
  ctx.fillRect(pos, 0, 10, 10);
  pos += 50 * deltaTime; // Move 50 pixels per second

  // Loop the animation
  if (pos > 100) pos = -10;

  animationId = self.requestAnimationFrame(draw);
}

self.addEventListener("message", (e) => {
  if (e.data.type === "start") {
    const transferredCanvas = e.data.canvas;
    ctx = transferredCanvas.getContext("2d");
    isRunning = true;
    lastTime = 0;
    animationId = self.requestAnimationFrame(draw);
  }
  if (e.data.type === "stop") {
    isRunning = false;
    if (animationId) {
      self.cancelAnimationFrame(animationId);
    }
  }
});

Im Hauptthread beginnen wir, indem wir die Kontrolle über ein <canvas> Element an ein OffscreenCanvas übertragen, mittels HTMLCanvasElement.transferControlToOffscreen(), und senden eine Nachricht, um die Arbeit mit dem Offscreen-Canvas im Worker zu "starten".

In der Worker-Datei (worker.js) bearbeiten wir die Animationslogik. Beim Empfang der "start" Nachricht startet der Worker die Animation und bewegt das Rechteck von links nach rechts. Beim Empfang einer "stop" Nachricht wird die Animation gestoppt.

Schließlich kann der Hauptthread eine "stop" Nachricht an den Worker senden, um die Animation nach einer Verzögerung zu stoppen, sodass die Animation sichtbar wird, bevor sie gestoppt wird.

Spezifikationen

Specification
HTML
# animationframeprovider-cancelanimationframe

Browser-Kompatibilität

Siehe auch