Immer wieder wird es bei Webprojekten notwendig Links zu Webseiten oder Dokumenten in einem neuen Fenster (PopUp) zu öffnen. In Javascript gibt hierzu genauso viele Lösungen wie es Entwickler gibt. Die meisten sind jedoch sehr kompliziert in Ihrer Anwendung, widersprechen in Ihrem Aufbau den heute aktuellen Webstandards und werden im allgemeinen sogar als Störend empfunden.
Die hier vorgestellte Javascript-Klasse wurde für diesen Artikel entwickelt um zu zeigen, daß PopUps nicht generell böse sein müssen.
<a href="javascript:void(window.open('http://www.webkrauts.de'));"> Fenster öffnen</a>
<a href="#" onclick="window.open('http://www.webkrauts.de');return false">Fenster öffnen</a>
… bei einem User mit einem Browser ohne Javascript-Unterstützung würde sich das PopUp nicht öffnen. Noch schlimmer ist aber, dass die gewünschte Seite, ohne jedes Feedback an den User, überhaupt nicht geladen werden würde. Wenn der Link auch ohne Javascript funktioniert und keine Fehlermeldung erzeugt ist die Verwendung in Ordnung.
<a href="http://www.webkrauts.de" onclick="window.open(this.href);return false">Fenster öffnen</a> Fenster öffnen
Bei der Verwendung in einem CMS z.B. wären hierbei auch für Redakteure Javascript-Kenntnisse notwendig. Sollte das Fenster zusätzliche Eigenschaften, wie z.B. eine festgelegte Grösse, benötigen, wird der Code sehr schnell noch unübersichtlicher.
Die Vermischung von HTML und Javascript stellt ebenfalls ein grosses Problem dar. Inhalt (HTML), Gestaltung (CSS) und Verhalten (Javascript) sollten generell voneinander getrennt werden [1][2].
Ein weiteres Problem ist auch, dass der Benutzer nicht darüber informiert wird, dass sich der Link in einem neuen Fenster öffnen wird.
Die aktuellen Screenreader können, im Gegensatz zur herrschenden Meinung, sehr wohl Javascript interpretieren. Dies hat hier aber eher Nachteile als Vorteile. Im letzten Beispiel, würde ein aktueller Screenreader tatsächlich ein neues Fenster öffnen aber den User nicht darauf hinweisen können. Für diesen hat es weiterhin den Anschein als wäre nichts passiert.
Eine ideale Lösung muss unbedingt einfach anwendbar sein. Das Hinzufügen eines “class”-Attributs wäre ein guter Ansatz, den auch die meisten CM-Systeme ermöglichen. Zusätzlich kann dem Link mit der Klasse über CSS eine besondere Formatierung zugerwiesen werden (z.B. ein Icon das den User über das neue Fenster Informiert).
Sinnvoll wäre es auch, wenn verschiedene Fenstertypen (z.B. feste Fenstergrössen oder Fenster ohne Adresszeile) erzeugt werden können. Wenn diese Fenstertypen zentral definiert werden könnten, könnten diese leicht in einer ganzen Website genutzt werden.
Der Nutzer sollte darüber informiert werden, dass der Link sich in einem neuen Fenster öffnen wird. Ein Hinweistext im “title”-Attribut wäre eine gute Lösung. Allerdings nur, wenn Javascript auch wirklich aktiviert ist und das PopUp geöffnet werden kann, wenn nicht, wäre der Hinweis wiederum sehr verwirrend.
Abschliessend wäre es natürlich noch toll, wenn gar kein Javascript im HTML-Dokument stehen müsste.
JsPopUp ist der Name der Javascript-Klasse, die ich für diesen Artikel entwickelt habe. Sie bietet Lösungen für die genannten Probleme und ist sehr leicht anzuwenden. Die benötigen Zeilen Javascript werden einfach innerhalb des Head-Bereichs eingebunden und werden dann automatisch ausgeführt.
Die Anpassungen für die eigene Seite können dann entweder direkt in dem aktuellen Dokument oder (besser noch) in einer weiteren externen Javascript-Datei erfolgen. Dadurch kann man das Script einfach für ein gesamtes Web einsetzen.
Für die Auszeichnung der PopUp-Links habe ich mich für das “class”-Attribut entschieden, da dieses im Vergleich zu dem ebenfalls geeigneten “rel”-Attribut zusätzlich auch über CSS gestylt werden kann.
Dieses Beispiel wird alle Links auf der Seite die mit der Klasse “popup” versehen wurden, so verändern, dass diese in einem neuen Fenster geöffnet werden. Zusätzlich wird der Text “Dieser Link wir in einem neuen Fenster geöffnet” in das Title-Attribut geschrieben, sodass der Nutzer weiss, was passiert wenn er klickt. Hinweis: der Einfachkeit-Halber wurde hier der window.onload-Event verwendet. Empfehlenswert statt dessen wäre ein moderner DomLoaded-Event [3].
<script language="javascript" type="text/javascript" src="popup.js"></script>
<script type="text/javascript">
window.onload = function(){
popup = new PopUp();
popup.apply();
}
</script>
Dieses erweiterte Beispiel zeigt, wie man zusätzliche Fenstertypen definieren kann. Man übergibt der Methode “addType()” ein Objekt mit den gewünschten Eigenschaften. Dabei ist jede Eigenschaft bis auf “name” optional (“name” wird immer benötigt, da dieser dem class-Attribut des PopUp-Links entspricht). Verfügbar sind derzeit folgende Eigenschaften mit den vordefinierten Standardwerten (weitere sind geplant):
In dem folgenden Beispiel wird der zusätzliche Fenstertyp “pdf” definiert. Fügt man Links nun zusätzlich zu der Klasse “popup” auch die Klasse “pdf” hinzu so werden diese mit dem geänderten Title-Text angezeigt und in einem neuen Fenster mit den angegebenen Eigenschaften geöffnet. Natürlich kann man auch diese Links über CSS wieder angepasst stylen (hier z.B. mit einem PDF-Icon)
<script language="javascript" type="text/javascript" src="popup.js"></script>
Aufruf der Klasse:
<script type="text/javascript">
window.onload = function(){
popup = new PopUp();
popup.addType({
name: "pdf",
width: 800,
height: 500,
resizable: true,
title: "Dieses PDF wird in einem neuen Fenster angezeigt"
});
popup.apply();
}
</script>
<a class="popup" href="http://www.webkrauts.de">Link</a>
<a class="popup pdf" href="http://www.webkrauts.de">Link</a>
Dirk Ginader ist Technischer Leiter der Unit Interactive von Bartenbach & Co. in Mainz. Er ist leidenschaftlicher Webworker is Sachen (X)HTML, CSS, Javascript, Dom, Ajax, PHP, Flash usw. Sein täglicher (stark Internet-lastiger) Output ist in seinem Blog: “web output” zu lesen.
Bitte die Hausregeln beachten. Alle Kommentare werden auf werbliche Links/Nicknames geprüft und gegebenenfalls gelöscht.
Kommentar-Feed für diesen Beitrag
Entschuldige, das Kommentarformular ist zurzeit geschlossen.
ich würde es nicht mit dem class atribut machen sondern mit "rel" z.b
..a href="http://www.webkrauts.de" rel="popup">Link...
was meinst du?!
Kommentar by FJ - 19. Dezember 2006 um 09:38
ist meinem empfinden nach üblicher das mit dem rel attribut zu machen. nichtsdestotrotz schöner artikel, schöne idee, gutes script!
Kommentar by manuel - 19. Dezember 2006 um 09:46
Ich habe ganz Bewusst daß
class-Attribut demrel-Attribut vorgezogen, da es sehr einfach stylebar ist, und die verschiedenen PopUp-Typen so auch optisch gut unterscheidbar sind.Zusätzlich unterstützen die meisten WYSIWYG-Editoren das
class-Attribut (ich habe noch keinen gesehen, der dasrel-Attribut unterstützt), was es so auch HTML-unkundigen Redakteuren ermöglicht Ihre Links als PopUp auszuzeichnen.Dennoch danke für Eure Hinweise
Kommentar by Dirk Ginader - 19. Dezember 2006 um 10:35
Sehr schöner Ansatz.
Einziger Nachteil auch hier: Normale Links oder auch Links, die ein target haben, kann ich durch Drücken entsprechender Tastenkombinationen trotzdem so öffnen, wie ich das gerne hätte (neues Fenster, neuer Tab etc.).
Hier öffnet sich leider zwangsläufig das durch Javascript generierte Fenster…
Kommentar by Matt - 19. Dezember 2006 um 11:20
Das ist vor allem dann nervig, wenn ein Link auf ein PDF unnötigerweise ein neues, leeres Tab öffnet.
Kommentar by Edoardo - 19. Dezember 2006 um 13:34
Ja, das ist leider wahr. Die Sinnhaftigkeit einen Link zu einem PopUp zu machen, liegt natürlich weiterhin beim Ersteller.
Es gibt aber immer wieder Situationen, in denen ich z.B. einfach nicht will, daß ein Fenster eine andere Größe/Position/Menüauswahl etc. hat, als die von mir vorgesehene.
Kommentar by Dirk Ginader - 19. Dezember 2006 um 13:37
Ein guter und interessanter Artikel, ich bin ebenfalls der Meinung, dass Popups nicht immer böse sind. Dieses denken ist in meinen Augen ignorant und kurzsichtig. Es gibt Fälle wo Popups sinnvoll sind, einen Mehrwert bieten und Vorteile haben.
Kommentar by Daniel - 19. Dezember 2006 um 14:35
Ich verwende diese Methode seit einiger Zeit auf verschiedenen Websites, vor allem für externe Links, die Klasse nenne ich dabei "extern". Nun machte ich aber vor kurzem die Entdeckung, ich glaube, das war mit Opera für Mac (oder war's mit IE 7? – kann das im Moment nicht überprüfen), dass die Standardkomfiguration PopUps blockt und damit im Browser nach einem Klick kommentarlos nichts passiert. Das hat mich verblüft, weil z. B auf Safari trotz geblockten PopUps diese Lösung geht.
Ich vermute, diese Neue-Fenster-Öffnungs-Scrips werden in Zukunft immmer mehr Probleme bereiten, oder dem unbedarften Besucher suggerieren, dass die Links nicht richtig funktionieren.
Kommentar by Glödu - 19. Dezember 2006 um 19:53
@Glödu:
Es würde mich sehr interessieren, in welchem Browser Du diesen Effekt beobachten konntest.
Eigentlich sollten PopUp-Blocker generell nur greifen, wenn ein Fenster ohne vorherige Userinteraktion (z.B. Klick) geöffnet wird. Wenn Du also ein anderes Verhalten beobachten konntest, würde ich Dich bitten, dies hier noch einmal detailliert zu kommentieren. Danke
Kommentar by Dirk Ginader - 20. Dezember 2006 um 07:30
@Dirk
Das Verhalten beobachtete ich in Opera für Mac, wo die Standardkonfiguration sämtliche PopUps blockiert. Gestern installierte ich die neuste Version 9.1, und bei der wird dann wenigstens beim erfolglosen Klick oben rechts ein Hinweisfensterchen eingeblendet.
Um eventuellen Missverständnissen vorzukommen: ich wollte keinesfalls gegen deinen Artikel schreiben.
Kommentar by Glödu - 20. Dezember 2006 um 14:26
@Glödu:
Vielen Dank für die Info. Ich werde mir den Mac-Opera mal vorknöpfen
Kommentar by Dirk Ginader - 20. Dezember 2006 um 17:40
Also hier funktioniert das mit Opera. Lediglich die Links popup und popup+pdf gehen direkt im neuen Tab auf, alles andere öffnet wie vorgesehen, ohne geblockt zu werden (Opera 9.02 und Opera 9.10).
Schon was geändert, Dirk?
Kommentar by Matt - 22. Dezember 2006 um 11:47
Hi Matt, danke der Nachfrage. Nein, ich habe noch nichts geändert. Ich selbst konnte den Effekt auf meinem frisch installiertem MAC Opera 9 auch nicht reproduzieren. Spannend, dass bei Dir alle Links funktionieren außer "popup" und "popup+pdf". Bekommst Du Fehlermeldungen?
Kommentar by Dirk Ginader - 22. Dezember 2006 um 18:01
vielen Dank für die schöne Idee. Leider funktioniert sie bei mir nur im Firefox und nicht im IE 7.0.
Hier ist der Link: Link
Viele Grüße
und fröhliche Weihnachten
Thomas
Kommentar by Thomas - 23. Dezember 2006 um 12:14
Hallo Thomas,
einen winzigen aber bösen Leichtsinnsfehler habe ich in Deinem Code gefunden:
Hier Dein Aufruf:
window.onload = function(){popup = new PopUp();
popup.addType({
name: "popup",
width: 700,
height: 600,
resizable: false,
});
popup.apply();
}
Du hast nach der letzten Property, die Du übergeben hast (
resizable: false,), fälschlicherweise noch ein Komma eingefügt. Hier ist ausnahmsweise der Firefox mal toleranter als der IE und führt den Code trotzdem aus, der IE bricht die Ausführung ab.So sieht der Aufruf aus, der fehlerfrei funktioniert:
window.onload = function(){popup = new PopUp();
popup.addType({
name: "popup",
width: 700,
height: 600,
resizable: false
});
popup.apply();
}
Schöne Weihnachten
Kommentar by Dirk Ginader - 25. Dezember 2006 um 08:19
Hallo Dirk,
besten Dank für die schnelle Hilfe, die ich heute als nachträgliche Bescherung im Netz fand.
Viele Grüße
Thomas
Kommentar by Thomas - 27. Dezember 2006 um 16:55
Hallo,
bei mir klappt das mit dem POPUP leider auch nur im Firefox (2.0) und im Opera (9.02).
Im IE7 öffnen sich die Links in einem neuer Registerkarte.
Hier der Link zur Seite mit PopUp-Links:
Link
Bitte um Hilfe, danke.
Lg,
Klaus
Kommentar by Klaus - 13. Februar 2007 um 00:05
@Klaus:
Hm – den beschriebenen Effekt im IE7 kann ich leider gar nicht nachvollziehen. Mein IE7 macht brav was er soll. Bekommst Du irgendwelche Javascript-Fehler angezeigt? Hast Du eine zusätzliche Toolbar installiert, die eventuell querschiesst?
Kommentar by Dirk Ginader - 13. Februar 2007 um 08:48
Hallo Dirk,
welche "Registerkarteneinstellungen" hast du bei PopUp's im IE7?
Ich habe "PopUps immer in neuer Registerkarte öffnen".
Nur dachte ich, das Script erzwingt dennoch im IE7 das PopUp, klappt ja im Opera und Firefox auch…
Lg,
Klaus
Kommentar by Klaus - 13. Februar 2007 um 09:33
@Klaus,
nein, der Internet Explorer ist bei dieser Einstellung sehr restriktiv. Im Firefox gibt es in einer der diversen Tab-Extensions auch so eine Einstellung die nachhaltig dafür sorgt, dass Popups in Tabs geöffnet werden. Da ist Javascript absolut machtlos – wenn der User nicht will kann Javascript (zum Glück) nichts machen…
Kommentar by Dirk Ginader - 13. Februar 2007 um 10:35
Das Script klingt wirklich interessant. Wie bekomme ich es denn hin, dass, wenn der link auf das Popup erneut geklickt wird und schon offen hinter einem Fenster liegt, es nur nach vorn geholt wird, und sein Inhalt nicht erneut geladen wird (z. B. für einen Musikplayer)?
Kommentar by nos - 2. April 2007 um 10:50
@ nos:
So etwas ist mit der aktuellen Version nicht möglich. Ich nehme das mal in die Feature-Request-List für die nächste Version auf – die ist schon recht voll
Kommentar by Dirk Ginader - 2. April 2007 um 12:37
Popups sind zwar manchmal von Vorteil, aber ich finde die Übertreibung von Werbung schrecklich. Da es immer mehr leute gab, die diese Möglichkeit ausgenutzt haben finde ich es gut das diese Popupblocker da sind.
Werde auch in Zukunft keine Popups akzeptieren.
Uwe
Kommentar by Uwe - 6. April 2007 um 08:26
Ist es auch möglich oder wird es auch möglich sein das Fenster fest rechts am Bildschirm zu positionieren?
Kommentar by Henning - 23. April 2007 um 15:43
@Henning:
Bisher noch nicht eingebaut aber gerade eben in die Feature-Wishlist aufgenommen
Kommentar by Dirk Ginader - 23. April 2007 um 16:14
Hi,
also bei mir funzt das Teil im IE6 sowie im IE7 nicht,
bei allen anderen Browsern schon. Trotzdem danke für
das nette Script.
Gruß darki
Kommentar by darki777 - 29. August 2007 um 09:34
P.S. habe vergessen zu erwähnen dass ich im IE6 und IE7 nur weitergeleitet werde, glaube es liegt am "return".
Gruß darki
Kommentar by darki777 - 29. August 2007 um 09:35
Sry für die Falschmeldung, habe es heute nochmal versucht, lag an den überhöhten Sicherheitseinstellungen.
Gruß darki
Kommentar by darki777 - 30. August 2007 um 08:36
Hallo,
vielen Dank, ich werde es bei unserem Shop mal ausprobieren.
Kommentar by Traser - 18. September 2007 um 16:54
Hallo,
das Script gefällt mir gut! nur wie kann ich eine Autoresize anpassung machen, so das dass Popup sich immer zb. an die grösse des Fotos anpasst?
Gruß Ralf Wittrock
Kommentar by Ralf Wittrock - 3. Oktober 2007 um 00:00
Hallo Ralf,
Reine Bild-PopUps mit automatischer Größenanpassung wird eines der neuen Features der kommenden neuen Version des Scripts sein.
Kommentar by Dirk Ginader - 3. Oktober 2007 um 10:07
Hallo Dirk,
danke für die Positive Nachricht!
Freue mich schon auf die neue Version.
Ralf Wittrock
Kommentar by Ralf Wittrock - 5. Oktober 2007 um 19:37
Hallo,
ist schon etwas wegen der neuen Version in sicht?
Ich benötige nähmlich dringend die Möglichkeit der Automatischen Größenanpassung für Bilder.
Vieleicht gibt es ja die Möglichkeit eine Version vorab zu testen.
Gruß Ralf Wittrock
Kommentar by Ralf Wittrock - 20. Oktober 2007 um 08:43
Hallo Ralf,
bisher hatte ich dieses neue Feature nicht wirklich priorisiert. Das kann ich aber Dir zuliebe gerne ändern (dauert aber dennoch noch ein bisschen – sorry)
Kommentar by Dirk Ginader - 22. Oktober 2007 um 11:48
Hallo,
danke das ist eine Super Nachricht.
Gruß Ralf
Kommentar by Ralf Wittrock - 23. Oktober 2007 um 22:53
Ich möchte das bei mir ein neues Browserfenster geöffnet wird. Was muss ich bei diesem Code wo einfügen?
Kommentar by Joerg - 11. Februar 2008 um 23:34
Da ist der Code:
Kommentar by Joerg - 11. Februar 2008 um 23:35
Auf der Suche nach Infos zu Jquery nun hier auf dieses JsPopUp gestoßen.
Wirklich interessant und verwenden werde ich es wahrscheinlich schon sehr bald
Kommentar by ThomasO - 21. April 2008 um 12:02