XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Javascript & Ajax (http://xhtmlforum.de/forumdisplay.php?f=83)
-   -   Neues Fenster öffnen mit JS (http://xhtmlforum.de/showthread.php?t=69721)

acb1980 15.07.2013 16:22

Neues Fenster öffnen mit JS
 
n'Abend,

wie man aus einer HTML-Seite heraus eine Seite in einem neuen Fenster öffnet ist ja hinlänglich bekannt. Alternativ zu target="_blank" besteht ja auch die Möglichkeit, das Ganze mit JS zu realisieren, nämlich mit window.open(). Letzteres funktioniert jedoch nicht immer, vor allem bei neueren Browsern funktioniert window.open() nur noch dann, wenn man es direkt einen onClick-Event zuweist und so auch anruft.

Mein Problem ist nun konkret Folgendes: Ich habe eine Web-Application, in der zu jedem Formular eine Druckversion abrufbar sein soll. Da diese Druckversion in Form eines PDF-Dokuments erzeugt wird, möchte ich das nur ungern in einem iFrame o.ä. anzeigen, sondern ein neues Fenster öffnen. Mache ich das jedoch direkt (also über einen normalen Link), so fehlen in der Druckversion die letzten Änderungen.

Da ich eigentlich alle Funktionen über AJAX realisiert habe war meine Idee nun die, dass ich zunächst das Formular via AJAX speichere und anschließend die Druckversion in einem neuen Fenster aufrufe. Das funktioniert jedoch aufgrund der o.g. Einschränkungen nicht, denn window.open() wird ja erst im Callback des AJAX-Calls (wenn die Änderungen in die DB geschrieben wurden) aufgerufen und fällt damit unter die Browser-Restriktion des nicht direkten Klickens.

Im Moment stecke ich daher tatsächlich komplett fest. Ich habe auch schon versucht, die Druckversion mit Hilfe von jQuery zu öffnen, indem ich einen Klick auf einen Link simuliere, das funktioniert jedoch nur mit entsprechend registrierten Events, nicht jedoch mit den "normalen" HTML-Attributen wie HREF und TARGET.

Ich bin nun am Ende meiner Ideen, vielleicht findet sich ja hier noch jemand, dem eine Alternative einfällt. Ansonsten muss ich wohl oder übel doch auf eine iFrame-Lösung zurückgreifen...

vanDerb 15.07.2013 17:55

Wirst du so wohl nicht anders hinbekommen.

Du könntest die window.open auf den onclick des Drucklinks setzen.
Die Zielurl bekommt dann den Ajax-Request, in dem du im Callcack dann z.b. wiederum eine Weiterleitung zur PDF setzen kannst.

MitjaStachowiak 16.07.2013 13:14

Also ich habe das so verstanden: Du hast da einen Link "Seite ausdrucken". Wenn man da drauf klickt, wird (mit Verzögerung) ein PDF erstellt, welches du jetzt in einem Popup anzeigen willst?

Ich weis jetzt nicht, ob du bei PDFs prüfen kannst, ob das Fenster geöffnet wurde, aber auf jeden Fall kannst du dem User nach erstellen das PDFs einen weiteren Link anbieten... Im Notfall ein Onclick auf die ganze Seite, so kann man es nicht verpassen. An sonsten musst du das PDF eben in ein Frame-basiertes Fenster laden.

Wer Websiten ausdrucken will, muss einfach damit rechnen, dass er manuell ein Popup zulassen muss, das ist nichts neues. Kannnst dir ja mal angucken, wie ich auf meiner Homepage das ausdrucken gelöst habe (Menü --> Drucken - ist noch ein Prototyp ;) )

acb1980 16.07.2013 14:06

Zitat:

Zitat von vanDerb (Beitrag 531445)
Wirst du so wohl nicht anders hinbekommen.

Das fürchte ich aktuell auch.

Zitat:

Zitat von vanDerb (Beitrag 531445)
Du könntest die window.open auf den onclick des Drucklinks setzen.
Die Zielurl bekommt dann den Ajax-Request, in dem du im Callcack dann z.b. wiederum eine Weiterleitung zur PDF setzen kannst.

Ich verstehe nicht ganz, was du damit meinst...?


Zitat:

Zitat von MitjaStachowiak (Beitrag 531462)
Also ich habe das so verstanden: Du hast da einen Link "Seite ausdrucken". Wenn man da drauf klickt, wird (mit Verzögerung) ein PDF erstellt, welches du jetzt in einem Popup anzeigen willst?

Nein, das PDF wird beim Aufruf der entsprechenden URL mit fpdf für PHP direkt erzeugt. Eine Verzögerung ist nur vor dem Aufruf dieser URL notwendig, um zuvor noch die Inhalte zu speichern.

Zitat:

Zitat von MitjaStachowiak (Beitrag 531462)
Wer Websiten ausdrucken will, muss einfach damit rechnen, dass er manuell ein Popup zulassen muss, das ist nichts neues.

Mag sein, dass es nichts neues ist. Ist aber eine Barriere, die nicht jeder findet. Und tote Links, die nicht funktionieren, sind das schlimmste, was man in einer Web Application haben kann...

MitjaStachowiak 16.07.2013 14:18

Also wenn man einen Link anklickt, öffnet sich doch das Popup, oder?
Auf jeden Fall mit target="_blank" - ist halt kein Fensterchen, aber was soll's?

Ich dachte, das PDF stünde nicht sofort zur Verfügung und müsste nachträglich per Timer o.Ä. geöffnet werden.

Und wie gesagt: Ich würde mal testen, ob man mit einer Abfrage, wie if (window.open(...)) nicht einfach testen kann, ob das Popup da ist, und wenn nicht eine entsprechende Meldung anzeigen.

[EDIT:] Ja, acb1980 schreibt ausdrücklich, dass das PDF nicht sofort zur Verfügung steht. Also ich würde da verschiedene Möglichkeiten durchtesten: Erstmal window.open aufrufen, wenn das nicht geht, den Trick mit document.getElementsByTagName('a')[x].click() (natürlich in einem try..catch) wenn das auch nicht geht eben eine Lösung mit Frame einbauen, oder den User darauf aufmerksam machen. Wenn es probleme macht, zu testen, ob das fenster offen ist, einfach erstmal eine html-seite in das fenster laden, die per Javascript der ursprünglichen Seite mitteilt, dass das Fenster offen ist und die sich dann selbst auf das PDF neulädt (self.location.href = "Das PDF").

Ist etwas aufwändig, aber was anderes fällt mir nicht ein.

vanDerb 16.07.2013 15:59

Zitat:

Zitat von acb1980 (Beitrag 531463)
Ich verstehe nicht ganz, was du damit meinst...?

- onclick-handler auf eine temporärer Seite setzen
- diese speichert in die Datenbank
- danach wird eine Weiterleitung zum PDF ausgeführt


Beispiel

Code:
1. onClick-Handler (Beispielweise auf einem Forumlar)
2. Abfangen der Parameter und Absenden des Ajax-Requests
3. Ausgabe der PDF

Natrürlich sollte das Ganze aus Sicherheitsgründen auf POST-Parameter umgemünzt werden. Die temporäre Seite muss also die Request-Parameter des Formulars serverseitig abgreifen.

Gruß

acb1980 18.07.2013 14:53

Zitat:

Zitat von MitjaStachowiak (Beitrag 531464)
Also wenn man einen Link anklickt, öffnet sich doch das Popup, oder?
Auf jeden Fall mit target="_blank" - ist halt kein Fensterchen, aber was soll's?

Mehr möchte ich sowieso nicht. Ein Fenster mit target="_blank" reicht vollkommen aus, nur darf es eben erst dann geöffnet werden, wenn die Inhalte via AJAX gespeichert wurden.

Zitat:

Zitat von MitjaStachowiak (Beitrag 531464)
Und wie gesagt: Ich würde mal testen, ob man mit einer Abfrage, wie if (window.open(...)) nicht einfach testen kann, ob das Popup da ist, und wenn nicht eine entsprechende Meldung anzeigen.

Das ist mir vorgestern auch noch eingefallen – und genau so mache ich es jetzt auch. Wird kein PopUp geöffnet erscheint ein kleiner Hinweis in einem entsprechend gestalteten Div mit einem normalen Link und target="_blank". Da der Hinweis erst erscheint, wenn die Inhalte gespeichert wurden, kann das PDF ja dann sofort aufgerufen werden.


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:02 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2020, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2019