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 2023
Newly available

Since ⁨March 2023⁩, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

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

Die cancelAnimationFrame() Methode des DedicatedWorkerGlobalScope-Interfaces storniert eine zuvor über einen Aufruf von requestAnimationFrame() geplante Animationsframe-Anforderung.

Der Aufruf 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 werden muss.

Syntax

js
cancelAnimationFrame(handle)

Parameter

handle

Die von einem Aufruf von requestAnimationFrame() zurückgegebene ID; 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 enthalten:

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

Es sollte mit folgendem JavaScript verknüpft sein:

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 Haupt-Thread beginnen wir damit, die Kontrolle über ein <canvas>-Element an ein OffscreenCanvas zu übergeben, indem wir HTMLCanvasElement.transferControlToOffscreen() verwenden und eine Nachricht senden, um die Arbeit mit dem Offscreen-Canvas zu "starten".

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

Schließlich kann der Haupt-Thread eine "stop"-Nachricht an den Worker senden, um die Animation nach einer Verzögerung zu stoppen, damit die Animation sichtbar ist, bevor sie endet.

Spezifikationen

Specification
HTML
# animationframeprovider-cancelanimationframe

Browser-Kompatibilität

Siehe auch