Опрос Ajax, когда другой запрос был отправлен, не работает в сафари

У меня есть страница на веб-сайте, где вы можете скачать файлы, за которые вы ранее заплатили. Файл представляет собой zip-архив, содержащий множество pdf-файлов. При нажатии на ссылку для скачивания вызывается php-файл, который выполняет некоторую работу (добавление штампа в PDF-файлы) до того, как файл будет отправлен. Поскольку для больших файлов это может занять некоторое время, я встроил механизм опроса, чтобы показать пользователю, что происходит. Опрос выполняется с помощью вызова ajax, который выглядит следующим образом:

$('.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);         
}

Опрос выполняется после перехода пользователя по ссылке. Таким образом, поведение ссылки по умолчанию не предотвращается.

Это отлично работает во всех браузерах в Windows, но опрос почему-то не запускается в Safari на Mac или даже в других браузерах на iPad. Кто-нибудь знает, в чем может быть проблема?


person HarmJan    schedule 27.06.2017    source источник
comment
Что такое clickhandler в этой строке $('.rm-table').on(clickhandler,'.fa-download', function(e){?   -  person Pankaj Makwana    schedule 27.06.2017
comment
var clickhandler = ('ontouchstart' в document.documentElement ? touchstart : щелчок); Для обнаружения щелчка или прикосновения   -  person HarmJan    schedule 27.06.2017
comment
Вы пробовали событие onprogress, доступное в XMLHttpRequest? developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/   -  person Professor Abronsius    schedule 27.06.2017
comment
У меня нет, но кажется, что вызов zip-файла также должен проходить через javascript. Я бы предпочел, чтобы сам файл не нуждался в javascript. Так что я надеялся, что будет другое решение. Я все же посмотрю.   -  person HarmJan    schedule 27.06.2017


Ответы (1)


Итак, проблема заключалась в том, что Safari, в отличие от браузеров в Windows, кажется, останавливает активность javascript на странице при нажатии на ссылку. Таким образом, пока «другая страница» все еще загружается, будь то перенаправление или загрузка, опрос ajax невозможен. Я решил это, запросив файл через ajax. По-прежнему разрешен запасной вариант на случай, если javascript недоступен, если это когда-либо произойдет.

person HarmJan    schedule 30.06.2017