W3docs

JavaScript-Popups und window.open()

Browserfenster in JavaScript öffnen, steuern und schließen mit window.open(), window.close(), Focus/Blur-Events und postMessage — inkl. Sicherheitshinweisen.

Zu den Möglichkeiten von JavaScript gehört das Öffnen und Steuern separater Browserfenster, was sich für Login-Flows, OAuth-Handshakes, Druckvorschauen und umfangreiche Benachrichtigungsoberflächen nutzen lässt. Dieses Kapitel deckt alles Wesentliche ab: ein Fenster mit window.open() öffnen, es in Größe und Position anpassen, Nachrichten damit austauschen, auf Focus- und Unload-Events reagieren und es sauber schließen — zusammen mit den modernen Sicherheitseinschränkungen, die das Verhalten aller Browser in diesem Bereich bestimmen.

Für die einfacheren einzeiligen Dialoge (alert, prompt und confirm) siehe JavaScript alert, prompt und confirm. Diese Seite behandelt vollständige Browserfenster.

JavaScript-Popups verstehen

Ein Popup ist ein separates Browser-Fenster auf oberster Ebene, das von Ihrem Skript geöffnet wird. Anders als ein modales alert() besitzt es ein eigenes Dokument, eine eigene URL und bleibt geöffnet, bis der Benutzer (oder Ihr Code) es schließt. Popups sind nützlich für Inhalte, die außerhalb der aktuellen Seite existieren müssen — der Login-Bildschirm eines OAuth-Anbieters, ein Zahlungs-Widget oder ein druckbarer Bericht. Der einzige Einstiegspunkt für all das ist die Methode window.open().

Wie window.open() funktioniert

window.open() nimmt drei Argumente entgegen und gibt eine Referenz auf das neue Fenster zurück (oder null, wenn der Browser es geblockt hat):

let win = window.open(url, name, features);
ArgumentBedeutung
urlDie zu ladende Seite. Übergeben Sie einen leeren String "", um ein leeres Fenster zu öffnen, das Sie per Skript befüllen.
nameEin Zielname. Wenn derselbe Name wiederverwendet wird, wird dasselbe Fenster erneut verwendet, anstatt ein neues zu öffnen. Spezielle Werte wie _blank öffnen stets ein neues Fenster.
featuresEin kommagetrennnter String mit Optionen wie width=400,height=300,left=100,top=100. Lassen Sie diesen weg, um die Standardwerte zu übernehmen.

warning Browser erlauben window.open() nur dann, wenn es direkt innerhalb einer Benutzeraktion wie einem Klick aufgerufen wird. Ein Aufruf beim Laden der Seite oder in einem setTimeout wird als unerwünschtes Popup gewertet und geblockt — win ist dann null. Lösen Sie Popups stets aus einem echten Event-Handler aus und prüfen Sie den Rückgabewert.

Ein einfaches Popup-Fenster erstellen

Um ein einfaches Popup-Fenster zu erstellen, rufen Sie window.open() aus einem Click-Handler auf. Die Methode öffnet ein neues Browserfenster und gibt eine Referenz darauf zurück, mit der Sie das Fenster weiter bearbeiten können.

<p>Click the button to trigger the popup!</p>
<button onclick="openPopup()">Open Popup</button>

<script>

// Function to open a new popup with a message
function openPopup() {
    let newWindow = window.open("", "Example", "width=400,height=400");
    // Use innerHTML for safer dynamic content injection
    newWindow.document.body.innerHTML = "<h1>Welcome to our popup!</h1>";
}
</script>

warning Hinweis: document.write kann das gesamte Dokument überschreiben, wenn es nach dem Laden der Seite aufgerufen wird. In der modernen Entwicklung wird innerHTML oder DOM-Manipulation bevorzugt, um Inhalte sicherer dynamisch einzufügen.

Dieses Code-Beispiel erstellt eine Schaltfläche auf der Webseite. Beim Klicken öffnet es ein neues Popup-Fenster mit den Abmessungen 400×400 Pixel und zeigt eine Begrüßungsnachricht an.

Die Steuerung von Inhalt und Verhalten von Popups ist entscheidend dafür, dass sie die Benutzererfahrung positiv beeinflussen und nicht aufdringlich wirken.

<p>Click the button to trigger the popup!</p>
<button onclick="openInteractivePopup()">Learn More</button>

<script>
// Function to open a popup and control its content and behavior
function openInteractivePopup() {
    // Open a new window with specific dimensions
    let popup = window.open("", "InteractivePopupExample", "width=400,height=400");
    // Use innerHTML to inject content safely
    popup.document.body.innerHTML = `
        <h1>Interactive Popup</h1>
        <p>Click the button to change this message.</p>
        <button onclick='document.body.innerHTML = "<h1>Content Updated!</h1><p>Thanks for interacting.</p>";'>Update Content</button>
    `;
}
</script>

Um sicher zwischen dem übergeordneten Fenster und dem Popup zu kommunizieren, verwenden Sie die Eigenschaft window.opener, um auf das übergeordnete Fenster zu verweisen, und postMessage() für Cross-Origin- oder sichereren Datenaustausch. Für eine ausführliche Behandlung dieses Themas siehe Cross-Window Communication.

<!-- In parent window -->
<script>
let popup = window.open("popup.html", "Popup", "width=400,height=400");
popup.postMessage("Hello from parent!", "*");
</script>

<!-- In popup window -->
<script>
window.addEventListener("message", (event) => {
    console.log("Received:", event.data);
    // Respond back if needed
    window.opener.postMessage("Hello back!", event.origin);
});
</script>

Wichtige Aspekte:

  • Diese Funktion öffnet nicht nur ein Popup, sondern bettet auch interaktive Elemente ein (z. B. eine Schaltfläche innerhalb des Popups).
  • Sie demonstriert die dynamische Steuerung des Popup-Inhalts nach dessen Erstellung, was interaktiver ist und auf Benutzereingaben oder andere Ereignisse reagieren kann.

Erweiterte Window-Methoden und Events

Über einfache Popups hinaus bietet JavaScript eine Vielzahl von Methoden zur Interaktion mit Browserfenstern, die Funktionalität und Benutzerinteraktivität verbessern.

Elemente in Größe und Position anpassen

JavaScript ermöglicht die dynamische Größenanpassung und Neupositionierung von Seitenelementen, was besonders für die Erstellung responsiver, benutzerfreundlicher Webanwendungen nützlich ist. (Hinweis: window.resizeTo() und window.moveTo() existieren für Legacy- oder eingeschränkte Testumgebungen, werden aber von modernen Browsern aus Sicherheitsgründen stark eingeschränkt. Dieses Beispiel simuliert das Verhalten mithilfe eines gestylten div. Für ziehbare oder größenveränderliche UI-Elemente wird position: absolute gegenüber relative bevorzugt, um vorhersehbare Koordinatenberechnungen zu gewährleisten.)

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Simulate Window Adjustments</title>
    <style>
        #simulatedWindow {
            width: 300px;
            height: 300px;
            position: absolute;
            background-color: #f3f3f3;
            border: 2px solid #ccc;
            margin: 20px;
            padding: 10px;
            transition: all 0.5s ease; /* Smooth transition for size and position changes */
        }
    </style>
</head>
<body>
    <button onclick="adjustSimulatedWindow()">Adjust Window</button>
    <div id="simulatedWindow">This is a simulated window. Click the button to adjust its size and position.</div>

    <script>
        function adjustSimulatedWindow() {
            const elem = document.getElementById('simulatedWindow');
            // Toggle size and position to demonstrate the effect
            if (elem.style.width === '500px') {
                elem.style.width = '300px';
                elem.style.height = '300px';
                elem.style.top = '0px';
                elem.style.left = '0px';
            } else {
                elem.style.width = '500px';
                elem.style.height = '500px';
                elem.style.top = '100px';
                elem.style.left = '100px';
            }
        }
    </script>
</body>
</html>

Wichtige Aspekte:

  1. HTML-Struktur: Enthält eine Schaltfläche und ein div-Element, das wie ein Fenster gestylt ist. Das div repräsentiert das Fenster, das wir „skalieren" und „verschieben" werden.
  2. CSS-Styling: Definiert die Ausgangsgröße und -position des simulierten Fensters mit sanften Übergängen für einen visuellen Effekt.
  3. JavaScript-Funktion: Beim Klicken auf die Schaltfläche schaltet die Funktion adjustSimulatedWindow die Größe und Position des simulierten Fensters um. Die Positionsänderung wird durch Anpassen der CSS-Eigenschaften top und left gesteuert und simuliert so die Bewegung eines Fensters über den Bildschirm.

Window-Events verarbeiten

Event-Handling ist entscheidend für die Erstellung interaktiver Anwendungen. JavaScript stellt mehrere Events zu Fensteraktionen bereit, wie onbeforeunload und onunload, mit denen Code zu strategischen Zeitpunkten ausgeführt werden kann.

<!DOCTYPE html>
<html lang="en">
<head>
    <title>JavaScript Window Events Demo</title>
    <style>
        #message {
            padding: 20px;
            margin: 20px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <p>Watch how the message updates based on window events. Initially, it changes upon loading. If you attempt to exit or click the mock exit link below, a prompt will appear asking if you want to leave the page. Cancelling the action will update the message.</p>
    <div id="message">Wait for it...</div>
    <!-- Mock link for simulating page leave -->
    <a href="#" onclick="simulatePageLeave(); return false;">Mock Page Leave</a>
    <script>
        window.onload = function() {
            document.getElementById('message').innerHTML = '<strong>Window loaded successfully!</strong>';
        };

        // Function to simulate page leave
        function simulatePageLeave() {
            // Show dialog asking if the user really wants to leave
            var confirmLeave = confirm('Are you sure you want to simulate leaving the page?');
            if (confirmLeave) {
                // If confirmed, update message as if leaving
                document.getElementById('message').innerHTML = '<strong>Leaving the page...</strong>';
            } else {
                // If cancelled, update message accordingly
                document.getElementById('message').innerHTML = '<strong>Decided to stay on the page!</strong>';
            }
        }

        window.onbeforeunload = function() {
            document.getElementById('message').innerHTML = '<strong>Preparing to leave the page...</strong>';
            return 'Are you sure you want to leave?';
        };
    </script>
</body>
</html>

Wichtige Aspekte:

  1. Mock-Link zur Seitenabgang-Simulation: Der Link mit href="#" und einem onclick-Handler, der simulatePageLeave(); return false; aufruft, simuliert den Versuch, die Seite zu verlassen. Das return false; verhindert die Standardaktion des Links und hält den Benutzer auf der aktuellen Seite.
  2. Bestätigungsdialog: Die Funktion simulatePageLeave zeigt einen Bestätigungsdialog an, ähnlich dem, der bei einem echten Seitenabgang erscheinen würde. Er erlaubt dem Benutzer zu entscheiden, ob er die Seite „verlassen" möchte oder nicht.
  3. Nachrichten-Updates: Je nach Wahl des Benutzers im Bestätigungsdialog wird die Nachricht im div aktualisiert, um die Entscheidung widerzuspiegeln und das Verhalten bei einem echten Seitenabgang zu imitieren.
  4. Hinweis zum Browser-Verhalten: Moderne Browser ignorieren benutzerdefinierte Strings, die von onbeforeunload zurückgegeben werden, und zeigen nur einen Standard-Bestätigungsdialog an. Das Beispiel demonstriert das Event-Auslösen, der genaue Dialogtext wird jedoch vom Browser bestimmt.
Info

Das Ändern des innerHTML eines Elements macht Benutzerinteraktionen reibungsloser und weniger störend. Dieser Ansatz eignet sich hervorragend für interaktive Websites und Lernwerkzeuge.

Ein Popup-Fenster schließen

Es ist wichtig, dem Benutzer einen Mechanismus zum einfachen Schließen von Popups bereitzustellen. Dies verbessert die Benutzererfahrung, indem dem Benutzer die Kontrolle über seine Interaktion mit Ihrer Anwendung überlassen wird.

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Popup Example</title>
    <script>
        var myPopup = null; // Initialize the popup variable.

        // Function to open a popup
        function openPopup() {
            // Check if the popup already exists and is not closed
            if (myPopup === null || myPopup.closed) {
                myPopup = window.open("", "PopupWindow", "width=400,height=400");
                // Set the content of the popup using innerHTML
                myPopup.document.body.innerHTML = `
                    <html>
                    <head><title>Popup Content</title></head>
                    <body>
                        <h1>Welcome!</h1>
                        <p>This is your popup window.</p>
                        <button onclick="window.close()">Close Window</button>
                    </body>
                    </html>
                `;
                // Ensure the popup gets focus
                myPopup.focus();
            } else {
                // Bring the already opened popup to the front
                myPopup.focus();
            }
        }

        // Function to close the popup
        function closePopup() {
            if (myPopup && !myPopup.closed) {
                myPopup.close();
                myPopup = null; // Reset the popup variable after closing it.
            }
        }
    </script>
</head>
<body>
    <button onclick="openPopup()">Open Popup</button>
    <button onclick="closePopup()">Close Popup</button>
</body>
</html>

Wichtige Aspekte:

  1. Zustandsverwaltung: Die Variable myPopup wird zunächst auf null gesetzt und darauf geprüft, ob sie entweder null ist oder ob das Popup geschlossen wurde (myPopup.closed). So wird entschieden, ob ein neues Popup erstellt oder das vorhandene in den Vordergrund gebracht werden soll.
  2. Inhaltsduplizierung vermeiden: Durch die korrekte Prüfung, ob das Popup initialisiert oder geschlossen ist, wird eine Verdopplung des Inhalts verhindert. Jedes Öffnen des Popups beginnt neu.
  3. Focus-Verwaltung: Die Verwendung von myPopup.focus() stellt sicher, dass das Popup beim erneuten Klicken auf „Open Popup" in den Vordergrund tritt, wenn es bereits geöffnet ist.
Info

Testen Sie das Verhalten von Popups und Window-Methoden stets in verschiedenen Browsern und auf verschiedenen Geräten, um Kompatibilität und Responsivität sicherzustellen.

Focus und Blur bei einem Fenster

Die Events focus und blur können verwendet werden, um zu erkennen, wann ein Fenster oder eine Seite den Fokus erhält oder verliert. Dies ist nützlich, um Aktivitäten zu pausieren, wenn der Benutzer den Tab oder das Fenster wechselt.

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Focus and Blur Events Demo</title>
    <style>
        body { transition: background-color 0.5s ease; } /* Smooth transition for background color */
    </style>
    <script>
        // Function to handle focus event
        function handleFocus() {
            document.getElementById('status').innerHTML = 'Window is focused';
            document.body.style.backgroundColor = '#DFF0D8'; // Light green background
        }

        // Function to handle blur event
        function handleBlur() {
            document.getElementById('status').innerHTML = 'Window is not focused';
            document.body.style.backgroundColor = '#F2DEDE'; // Light red background
        }

        window.addEventListener('focus', handleFocus);
        window.addEventListener('blur', handleBlur);
    </script>
</head>
<body>
    <h1>Focus and Blur Events on Window</h1>
    <p>Status: <span id="status">Window is focused</span></p>
    <p><strong>Instructions:</strong> To test this functionality, click inside this window to focus, then click away to another window or tab to trigger the blur effect. Notice the background color change and status update.</p>
</body>
</html>

Wichtige Aspekte:

  • Event-Handler: handleFocus() und handleBlur() aktualisieren den Seiteninhalt und die Hintergrundfarbe basierend auf dem Focus-Zustand des Fensters.
  • Visuelles Feedback: Änderungen der Hintergrundfarbe liefern unmittelbares, klares visuelles Feedback über den Focus-Zustand und verbessern so das interaktive Erlebnis.

Sicherheit und Popup-Blocker

Da Popups in der Vergangenheit häufig missbraucht wurden, setzen moderne Browser strenge Regeln durch. Diese zu kennen erspart stundenlange Fehlersuche à la „warum ist mein Fenster null?".

  • Gestenpflicht. Ein Popup öffnet sich nur während einer synchronen Benutzeraktion (Klick, Tastendruck, Touch). Nach einem await oder einem setTimeout ist die Geste „verbraucht" und der Aufruf wird geblockt.
  • window.opener und noopener. Wenn Sie ein Fenster öffnen, kann die neue Seite den Opener über window.opener auslesen und sogar darin navigieren. Bei Links zu nicht vertrauenswürdigen Seiten stellt das ein Phishing-Risiko dar. Fügen Sie daher rel="noopener" zu Ankern hinzu oder übergeben Sie noopener im Features-String:
// Anchor form — the new tab cannot touch this page
// <a href="https://example.com" target="_blank" rel="noopener noreferrer">Open</a>

// Scripted form — returns null because the link is severed
window.open("https://example.com", "_blank", "noopener");
  • Ein geblocktes Popup erkennen. Prüfen Sie stets den Rückgabewert, da ein geblockter Aufruf null zurückgibt:
const win = window.open("/report", "report", "width=600,height=800");
if (!win || win.closed || typeof win.closed === "undefined") {
  // Popup was blocked — fall back to navigating in the same tab
  location.href = "/report";
}

Best Practices für die Verwendung von Popups und Window-Methoden

  1. Benutzereinwilligung und -kontrolle: Stellen Sie stets sicher, dass Popups die Benutzererfahrung nicht beeinträchtigen. Geben Sie dem Benutzer ausreichend Kontrolle, um unerwünschte Popups zu schließen.
  2. Sicherheitsüberlegungen: Beachten Sie die Sicherheitsimplikationen externer Inhalte in Popups. Verwenden Sie seriöse Quellen und sichere Verbindungen, um Benutzerdaten zu schützen.
  3. Performance-Optimierung: Verwenden Sie Popups und Window-Methoden sparsam, da sie die Performance Ihrer Webanwendung beeinflussen können. Optimieren Sie den Einsatz, um Funktionalität und Ressourceneffizienz in Einklang zu bringen.

Fazit

Der effektive Einsatz von JavaScript-Popups und Window-Methoden kann die Funktionalität und Benutzererfahrung von Webanwendungen erheblich verbessern. Durch das Befolgen der bereitgestellten Beispiele und Best Practices können Entwickler diese Features effizient und verantwortungsbewusst implementieren. Priorisieren Sie stets Benutzererfahrung und Sicherheit in allen Implementierungen, um die Integrität und Wirksamkeit Ihrer Webanwendungen zu wahren.

Verwandte Kapitel

Übungen

Übung
Welche der folgenden Methoden zeigen Popups in JavaScript an?
Welche der folgenden Methoden zeigen Popups in JavaScript an?
Was this page helpful?