Start · Sprachen · JavaScript · Referenz · BarProp

BarProp

Schnittstelle

Steht für ein Oberflächenelement des Browsers, etwa die Adressleiste oder die Symbolleiste, und zeigt über <code>visible</code> an, ob es sichtbar ist.

seit JavaScript Baseline: alle Browser (HTML Living Standard) Kategorie: webapi

Signatur

interface BarProp

Beschreibung

Das Interface BarProp steht für ein Element der Browser-Oberfläche, auf das Skripte zugreifen können. Man erzeugt es nicht selbst. Stattdessen stellt jedes Window-Objekt sechs fertige Instanzen bereit: window.locationbar, window.menubar, window.personalbar, window.scrollbars, window.statusbar und window.toolbar.

Das Interface hat nur eine Eigenschaft: visible. Sie ist schreibgeschützt und liefert einen booleschen Wert. Laut aktuellem HTML-Standard bedeutet dieser Wert nicht mehr, dass eine bestimmte Leiste wirklich sichtbar ist. Er zeigt nur an, ob das Fenster ein Popup ist. In einem normalen Tab oder Fenster ist visible bei allen sechs Objekten true. In einem Popup, das mit window.open() und Fenstermerkmalen wie popup oder width/height geöffnet wurde, ist der Wert bei allen false.

In der Praxis nutzt man BarProp deshalb fast nur, um zu erkennen, ob eine Seite in einem Popup läuft. So kann man zum Beispiel das Layout eines OAuth-Anmeldedialogs vereinfachen oder einen Schließen-Button einblenden. Leisten ein- oder ausblenden kann man damit nicht.

Parameter

Name Typ Default Beschreibung
$visible boolean Schreibgeschützte Eigenschaft. true in normalen Fenstern und Tabs, false, wenn das Fenster als Popup geöffnet wurde.

Rückgabewert

Typ
BarProp
Beschreibung
Man bekommt eine BarProp-Instanz nur über die Eigenschaften von window (locationbar, menubar, personalbar, scrollbars, statusbar, toolbar). Einen öffentlichen Konstruktor gibt es nicht.

Beispiele

Alle BarProp-Objekte eines Fensters auslesen

const bars = ['locationbar', 'menubar', 'personalbar', 'scrollbars', 'statusbar', 'toolbar'];

for (const name of bars) {
  console.log(`${name}.visible:`, window[name].visible);
}

console.log(window.toolbar instanceof BarProp);
locationbar.visible: true menubar.visible: true personalbar.visible: true scrollbars.visible: true statusbar.visible: true toolbar.visible: true true

Erkennen, ob die Seite in einem Popup läuft

// z. B. auf einer Login-Seite, die per window.open(url, 'login', 'popup,width=500,height=600') geöffnet wird
const isPopup = !window.locationbar.visible;

if (isPopup) {
  document.body.classList.add('popup-layout');
  const closeBtn = document.createElement('button');
  closeBtn.textContent = 'Fenster schließen';
  closeBtn.addEventListener('click', () => window.close());
  document.body.append(closeBtn);
}

console.log('Popup-Modus:', isPopup);
Popup-Modus: true (im Popup) Popup-Modus: false (im normalen Tab)

Kein Konstruktor und kein Schreibzugriff

try {
  new BarProp();
} catch (err) {
  console.log(err.name); // TypeError: Illegal constructor
}

// Im Sloppy Mode wird die Zuweisung stillschweigend ignoriert (im Strict Mode: TypeError)
window.toolbar.visible = false;
console.log(window.toolbar.visible);
TypeError true

// Wichtig · Fallstricke

  • Aussage ist ungenau: Moderne Browser geben absichtlich für alle sechs Objekte denselben Wert zurück. Er hängt nur davon ab, ob das Fenster ein Popup ist. Ob der Nutzer die Lesezeichenleiste oder die Menüleiste wirklich ausgeblendet hat, erfährt man so nicht. Das dient dem Schutz vor Fingerprinting.
  • Schreibgeschützt: Früher konnten privilegierte Skripte in Firefox visible setzen. Heute wird eine Zuweisung ignoriert, im Strict Mode wirft sie einen TypeError. Leisten lassen sich per Skript nicht steuern.
  • Kein Konstruktor: new BarProp() wirft TypeError: Illegal constructor.
  • Popup-Erkennung: Ob ein Popup vorliegt, entscheidet der Browser anhand der windowFeatures von window.open(). Ein Aufruf ohne Merkmale öffnet normalerweise einen neuen Tab, und dort ist visible === true.
  • Kompatibilität: Wird in allen aktuellen Browsern unterstützt. Das vereinheitlichte Popup-Verhalten gibt es etwa seit Chrome 99, Firefox 98 und Safari 15.4. Ältere Versionen können abweichende Werte liefern.