закрыть текущее всплывающее окно при загрузке файла - PullRequest
0 голосов
/ 03 октября 2018

Я пытался найти решение, но не смог получить никакого соответствующего ответа.Я хочу закрыть текущее всплывающее окно, как только в браузере откроется всплывающее окно загрузки файла.Например, в приведенном ниже исходном коде, если я напишу «window.close ()» после ajax-запроса, всплывающее окно загрузки файла никогда не отображается.

Но как только я удалю эту строку, загрузка файла будет работать, но как мне закрыть текущее всплывающее окно?

Мой пример использования:

main.php

<script>
    window.open('popup.php','redirect','width=500,height=500');
</script>

popup.php

<body>
    <script type="text/javascript" src="jquery-1.8.3.min.js"></script>
    <script>
        var url = 'download.php';
        var output_type = 'xls';
        params = "function=execute_cache&output="+output_type;
        $.ajax({
            type: "POST",
            url: url,
            data: params,
            success: function(response, status, request) {
                var disp = request.getResponseHeader('Content-Disposition');
                if (disp && disp.search('attachment') != -1) {
                    var form = $('<form method="POST" action="' + url + '">');
                    $.each(params, function(k, v) {
                        form.append($('<input type="hidden" name="' + k +
                                '" value="' + v + '">'));
                    });
                    $('body').append(form);
                    form.submit();
                }
            }
        });
        window.close();
    </script>
</body>

download.php

<?php
$handle = fopen("file.txt", "w");
fwrite($handle, "text1.....");
fclose($handle);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename('file.txt'));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');
exit;

Примечание: Я не могу использовать функцию setTimeout для автоматического закрытия всплывающего окна, потому что я не знаю, сколько времени будет загружаться файл.Поэтому я не могу дать максимальное время.Код, показанный в download.php, не является реальным кодом.На самом деле, я собирал огромные данные и генерировал XLS.

Я просто хочу автоматически закрыть текущее всплывающее окно, как только пользователю будет показано всплывающее окно загрузки файла.

1 Ответ

0 голосов
/ 03 октября 2018

используйте обещание для выполнения таких асинхронных вызовов.узнайте больше об этом https://www.sitepoint.com/overview-javascript-promises/

и дайте id для window.open как

windowPopup = window.open('popup.php','redirect','width=500,height=500');

и используйте

windowPopup.close();

var windowPopup = window.open('popup.php','redirect','width=500,height=500');

    function callRequest () {
      return new Promise(function (resolve, reject) {
        var url = 'download.php';
        var output_type = 'xls';
        var params = "function=execute_cache&output="+output_type;

        var xhr = new XMLHttpRequest();
        xhr.open('POST', url, param);
        xhr.onload = function () {
          if (this.status >= 200 && this.status < 300) {
              var disp = request.getResponseHeader('Content-Disposition');
              if (disp && disp.search('attachment') != -1) {
                  var form = $('<form method="POST" action="' + url + '">');
                  $.each(params, function(k, v) {
                      form.append($('<input type="hidden" name="' + k +
                              '" value="' + v + '">'));
                  });
                  $('body').append(form);

                  setTimeout(function(){
                    form.submit();
                    resolve(true);
                }, 1000);              
              }
          } else {
            reject(false);
          }
        };
        xhr.onerror = function () {
          reject(false);
        };
        xhr.send();
      });
    }


    callRequest()
    .then(function (res) {
        console.log('result : ',  res);
        if(res) {
            windowPopup.close();
        } 
    })
    .catch(function (err) {
      console.error('error : ', err);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...