2017-12-07 6 views
0

Ich arbeite an einer Client-Site, um eine PDF nach dem Absenden eines Formulars durch Öffnen der PDF-URL in einem neuen Tab bei der Einreichung von Formular herunterladen. Aber in Chrome, Safari und FF blockieren sie alle das "Popup". Ich habe festgestellt, dass einige Artikel über Möglichkeiten sprechen, Browser daran zu hindern, window.open() zu blockieren. Sie beziehen sich normalerweise auf Ajax, aber ich benutze keinen Ajax. Die anderen Artikel sprechen darüber, wie window.open() nur innerhalb eines Click-Ereignisses funktioniert. Und selbst das funktioniert nicht für mich. Es muss nicht eine Tonne SinnKönnen wir nicht mehr window.open() verwenden

machen, aber in meinem Beispiel versuche ich das Auslösen einer Klick und

<script> 
    jQuery(document).ready(function() { 
     jQuery(".gform_confirmation_message a").on("click", function(e){ 
      e.preventDefault(); 
      var newWin = window.open("", "_blank"); 
      newWin.location = jQuery(".gform_confirmation_message a").attr("href"); 
     }); 

     jQuery(".gform_confirmation_message a").trigger("click"); 
    }); 
</script> 

Auch wenn ich eine einfache Linie außerhalb jquery setzen, funktioniert nicht und blockiert wird.

var newWin = window.open("", "_blank"); 

Auch beide von diesen beiden tun absolut nichts. Das Popup wird nicht geblockt.

jQuery(".gform_confirmation_message a").trigger("click"); 
OR 
jQuery(".gform_confirmation_message a").click(); 

Ich weiß, Browser sind auf Spam/Ad-Sicherheit hämmern, aber das ist lächerlich.

+0

Ein versteckter Iframe, der der Seite hinzugefügt wurde, die zur URL ging, wäre wahrscheinlich eine effektive Arbeit. – Taplar

+0

@Carcigenicate window.open() ist seit jeher eine JavaScript-Funktion. Keiner der anderen Programmierer in meinem Team hat etwas über alle Browser gehört, die diese Funktion entfernen. – pinksharpii

+0

Related: https://stackoverflow.com/questions/3077242/force-download-a-pdf-link-using-javascript-ajax-jquery –

Antwort

1

Popups sind noch möglich. Sie müssen nur von einer Benutzeraktion ausgelöst werden. Das Erstellen eines falschen Ereignisses click wird nicht als Benutzeraktion betrachtet.

Eine Möglichkeit, den Download starten können, ist einfach die Seite an die mit dem richtigen Inhaltstyp so eingestellt PDF umleiten, dass sie sofort herunterladen werden:

Content-Type: application/octet-stream 

oder

Content-Disposition: attachment 

Mit HTML5 Sie können auch einen Download starten, indem Sie ein temporäres <a>-Tag erstellen und sein download-Attribut auf die Datei-URL setzen. Ein virtuelles Klickereignis funktioniert weiterhin.

var textFile = new Blob(["hello world"], {type: "text/plain"}); 
 
var blobUrl = URL.createObjectURL(textFile); 
 

 
var a = document.createElement("a"); 
 
a.href = blobUrl; 
 
a.download = "myTextFile.txt"; 
 
a.click(); // start the download

Ich weiß Browser auf Spam/ad Sicherheit nach unten hämmern, aber das ist lächerlich.

Popups sind nervig. Es gibt viele Möglichkeiten, eine Datei herunterzuladen, ohne ein nutzloses Popup-Fenster zu erstellen.

+0

ein richtiger 'content-disposition' Antwort-Header kann auch helfen (re: Content-Typ Teil der Antwort) –

+0

Ich würde nicht in Betracht ziehen, was ich versuche, ein" Popup "zu machen, sondern einen Link in einem neuen Tab öffnen. Wir möchten nicht, dass Benutzer von der Site weggebracht werden, um das PDF anzusehen. Diese Vanilla-JS-Lösung funktioniert aber ganz gut, danke. – pinksharpii

+0

@pinksharpii Viele Browser, die den Client an einen Speicherort umleiten, an dem der Inhaltstyp ein Oktettstream ist, starten den Download nur und bleiben auf derselben Seite. Es hat die größte Abwärtskompatibilität, während die HTML5-Lösung in älteren Browsern wie IE6 möglicherweise nicht funktioniert. –

Verwandte Themen