Während der Arbeit an einer Landingpage stieß ich auf ein seltsames Verhalten von JavaScript. Der Kunde wollte, dass beim Verlassen der Seite ein Popup geöffnet wird. Um Popupblocker zu umgehen, wird beim Klick auf einen Button ein Popunder – also ein neues Fenster, auf den kein Fokus gelegt wird – geöffnet. Verlässt der User die Seite, wird der Inhalt des Popunders ausgetauscht und in den Vordergrund gestellt, außer er klickt auf den Bestellbutton. Dann soll das Popunder geschlossen werden.
Dazu habe ich in JS eine Variable für das window-Objekt erstellt und – wie ich es von PHP gewohnt bin – mit NULL initialisiert. In einer Funktion wird nun geprüft, ob die Variable ein Objekt ist – also das Fenster bereits existiert bzw. existierte – und nicht bereits geschlossen wurde. Der entsprechende Code sah in etwa wie folgt aus:
var pu = null;
function closePopup() {
if ('object' === typeof pu && true !== pu.closed) {
pu.close();
}
}
Wird nun die Funktion closePopup() aufgerufen ohne dass das Fenster jemals geöffnet wurde, kommt es zu einem Fehler. typeof null gibt fälschlicher Weise ‘object’ zurück und versucht dann die Methode close() auszuführen, obwohl die Variable pu kein window-Objekt ist.
Umgehen lässt sich das einfach dadurch, dass man die Variable mit false initialisiert. Dann nämlich wird korrekt der Typ ‘boolean’ erkannt. Dieser Fehler tritt unabhängig vom verwendeten Browser auf.