2017-06-27 1 views
0

Ich habe eine Seite auf einer Website, wo Sie Dateien herunterladen können, die Sie zuvor bezahlt haben. Die Datei ist ein Zip-Archiv, das viele PDF-Dateien enthält. Wenn der Download-Link angeklickt wird, wird eine PHP-Datei aufgerufen, die etwas Arbeit leistet (Hinzufügen eines Stempels auf den PDFs), bevor die Datei geliefert wird. Da dies bei größeren Dateien einige Zeit dauern kann, habe ich einen Abfragemechanismus eingebaut, um dem Benutzer zu zeigen, was passiert. Die Abfrage wird über einen Ajax-Aufruf durchgeführt, die wie folgt aussieht:Ajax Polling, während andere Anfrage gesendet wurde funktioniert nicht auf Safari

$('.rm-table').on(clickhandler,'.fa-download', function(e){ 

    tr = $(this).closest('tr'); 
    id = tr.attr('id'); 
    tr.find("progress").show(); 
    tr.find('.downloadstatus').show(); 
    tr.find('.downloadstatus').html('Start Download...'); 
    setTimeout(getDownloadStatus(), 250); 
}); 

function getDownloadStatus(){ 
    setTimeout(function() { 
     $.ajax({ 
     url: '/process/{{Auth::id()}}/'+id, 
     type: 'POST', 
     async: true, 
     cache: false, 
     data: {}, 
     dataType: "json", 
     success: function(data, textStatus, jqXHR) 
     { 
       var tekst = data.tekst; 
       var perc = data.percentage; 

       tr.find('.downloadstatus').html(tekst); 
       tr.find('progress').val(perc); 

       if(tekst != 'done'){ 
        getDownloadStatus(); 
       } else { 
        tr.find('.downloadstatus').html("Done!"); 
        tr.find('progress').val(100); 
          setTimeout(
           function() 
           { 
           tr.find('progress').val(0); 
           tr.find('progress').hide(); 
           tr.find('.downloadstatus').html(""); 
           tr.find('.downloadstatus').hide(); 
           }, 750); 

       } 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 

       var response = jQuery.parseJSON(jqXHR.responseText); 
        alert(response.error); 
     } 
     }); 
     }, 250);   
} 

Die Abfrage erfolgt, nachdem der Benutzer auf den Link klickt. So wird das Standardverhalten der Verbindung nicht verhindert.

Dies funktioniert in allen Browsern unter Windows, aber die Abfrage wird irgendwie nicht auf Safari auf einem Mac oder sogar anderen Browsern auf einem iPad gestartet. Irgendjemand eine Ahnung von was das Problem sein könnte?

+0

Was ist clickhandler in dieser Zeile '$ ('. Rm-table'). On (clickhandler, '.fa-download', funktion (e) {'? –

+0

var clickhandler = ('ontouchstart' in document.documentElement ? "touchstart": "click"); Zum Erkennen klicken oder berühren – HarmJan

+1

Haben Sie das Ereignis 'onprogress' in' XMLHttpRequest' versucht? https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/ Using_XMLHttpRequest – RamRaider

Antwort

0

ok, so das Problem war, dass Safari im Gegensatz zu Browsern auf Windows, scheint alle JavaScript-Aktivitäten auf einer Seite zu stoppen, wenn ein Link angeklickt wird. Während also die "andere Seite" noch geladen wird, egal ob es sich um eine Weiterleitung oder einen Download handelt, ist Ajax-Polling nicht möglich. Ich löste es, indem ich die Datei auch durch Ajax angefordert habe. Immer noch Fallback erlaubt, falls JavaScript nicht verfügbar ist, falls das jemals der Fall sein sollte.

Verwandte Themen