Start · Sprachen · JavaScript · Referenz · CropTarget

CropTarget

Schnittstelle

Steht für ein DOM-Element, auf dessen Bereich eine Bildschirmaufnahme des eigenen Tabs zugeschnitten wird. Eine Instanz erhält man über die statische Methode <code>CropTarget.fromElement()</code>.

seit JavaScript Chrome/Edge 104+ (experimentell, nicht in Firefox Kategorie: webapi

Signatur

interface CropTarget

Beschreibung

CropTarget gehört zur Region Capture API, einer Erweiterung der Screen Capture API. Ein CropTarget ist ein nicht durchschaubarer Verweis auf ein Element im aktuellen Dokument. Übergibt man ihn an BrowserCaptureMediaStreamTrack.cropTo(), enthält ein Videotrack aus der Aufnahme des eigenen Tabs nur noch den Bereich, den dieses Element auf dem Bildschirm einnimmt. Alles andere wird weggeschnitten.

Typische Einsatzfälle sind Web-Videokonferenzen, die neben einer eingebetteten Präsentation (etwa einem <iframe>) laufen und nur diese Präsentation übertragen sollen. Auch Aufzeichnungen einzelner Bereiche einer Seite wie Canvas, Editor oder Vorschau gehören dazu, ohne dass Bedienelemente oder private Inhalte im Bild landen.

Die Schnittstelle hat keinen öffentlichen Konstruktor. Instanzen erzeugt man nur mit der statischen, asynchronen Methode CropTarget.fromElement(element). Sie gibt ein Promise<CropTarget> zurück. Der Zuschnitt folgt dem Element auch dann, wenn es sich verschiebt oder seine Größe ändert. Ein CropTarget ist serialisierbar und lässt sich deshalb per postMessage() an ein anderes Dokument im selben Tab schicken, zum Beispiel an ein <iframe>, das die Aufnahme verwaltet.

Parameter

Name Typ Default Beschreibung
$element Pflicht Element Parameter von CropTarget.fromElement(): das Element, auf dessen sichtbaren Bereich die Aufnahme zugeschnitten werden soll. Ältere Chrome-Versionen akzeptieren nur <div> und <iframe>.

Rückgabewert

Typ
Promise<CropTarget>
Beschreibung
CropTarget.fromElement() gibt ein Promise zurück, das mit einer CropTarget-Instanz für das Element erfüllt wird. Das Promise wird abgelehnt, wenn das Element nicht geeignet ist.

Beispiele

Eigenen Tab aufnehmen und auf ein Element zuschneiden

const startCroppedCapture = async () => {
  if (!('CropTarget' in self && 'fromElement' in CropTarget)) {
    console.warn('Region Capture wird nicht unterstützt');
    return null;
  }

  const area = document.querySelector('#praesentation');
  const cropTarget = await CropTarget.fromElement(area);

  // Nutzer um Freigabe des aktuellen Tabs bitten
  const stream = await navigator.mediaDevices.getDisplayMedia({
    video: true,
    preferCurrentTab: true
  });

  const [track] = stream.getVideoTracks();
  await track.cropTo(cropTarget);

  document.querySelector('video#vorschau').srcObject = stream;
  console.log('Zuschnitt aktiv');
  return track;
};

document.querySelector('#start').addEventListener('click', startCroppedCapture);
Zuschnitt aktiv

Zuschnitt zur Laufzeit wechseln oder aufheben

// track: Videotrack aus getDisplayMedia() (eigener Tab)
const switchCrop = async (track, selector) => {
  if (selector === null) {
    await track.cropTo(null); // Zuschnitt aufheben, wieder ganzer Tab
    console.log('Ganzer Tab wird übertragen');
    return;
  }
  const target = await CropTarget.fromElement(document.querySelector(selector));
  await track.cropTo(target);
  console.log(`Zuschnitt auf ${selector}`);
};

// Beispielaufrufe:
// await switchCrop(track, '#editor');
// await switchCrop(track, null);
Zuschnitt auf #editor Ganzer Tab wird übertragen

CropTarget per postMessage an ein iframe übergeben

// Im Hauptdokument: Ziel erzeugen und an das Konferenz-iframe schicken
const iframe = document.querySelector('iframe#konferenz');
const cropTarget = await CropTarget.fromElement(document.querySelector('#folien'));
iframe.contentWindow.postMessage({ cropTarget }, 'https://konferenz.example');

// Im iframe (https://konferenz.example):
window.addEventListener('message', async (event) => {
  if (event.origin !== 'https://parent.example') return;
  const stream = await navigator.mediaDevices.getDisplayMedia({ preferCurrentTab: true });
  const [track] = stream.getVideoTracks();
  await track.cropTo(event.data.cropTarget);
  console.log('Folienbereich wird übertragen');
});
Folienbereich wird übertragen

// Wichtig · Fallstricke

  • Kompatibilität: Nur Chromium-Browser ab Version 104 auf dem Desktop unterstützen die API. Firefox und Safari kennen sie nicht. Vor der Nutzung sollte man deshalb prüfen, ob sie vorhanden ist ('CropTarget' in self).
  • Nur der eigene Tab: cropTo() funktioniert nur, wenn der aufgenommene Tab derjenige ist, in dem das Element liegt. Bei Fenstern, Bildschirmen oder fremden Tabs wird das Promise abgelehnt.
  • Die API braucht einen sicheren Kontext (HTTPS). getDisplayMedia() braucht außerdem eine Nutzeraktion, etwa einen Klick.
  • Zuschnitt heißt nicht Ausblenden: Alles, was das Element optisch überdeckt, zum Beispiel Pop-ups, Tooltips oder überlappende Elemente, erscheint trotzdem im Bild. Wer nur das Element selbst ohne Überlagerungen aufnehmen will, nutzt die neuere Element Capture API mit RestrictionTarget (Chrome 132+).
  • Wird das Element entfernt oder unsichtbar, liefert der Track keine neuen Bilder mehr. Er wird dabei nicht beendet.
  • Beim Senden über postMessage() immer event.origin prüfen und eine konkrete Ziel-Herkunft angeben. Der Empfang funktioniert nur innerhalb desselben Tabs.