сохранение HTML на стороне сервера до открытия отчета, который использует сохраненный HTML, не работает в Safari - PullRequest
1 голос
/ 07 января 2010

Я придумал javascript, который очищает экран html, необходимый для отчета, и сохраняет его на сервере с помощью вызова ajax, после чего я вызываю отчет, который использует ранее сохраненный html через всплывающее окно. Вот код:

   function SaveAndPrintHtml(htmlToPrint) {
      try {
         $.ajax({
            type: 'POST',
            async: true,
            url: 'temp.aspx?Action=SaveHtmlToPrint',  //SAVE DATA TO PRINT
            data: {
               htmlToPrint: encodeFormData(htmlToPrint)
            },
            dataType: "json",
            success: function() {               
                    try {         
                      var url =  'report.aspx';
                      window.open(url, '_blank'); //OPEN REPORT
                    } catch (e) {
                    }           
            },
            error: handleError
         });
      } catch (ex) {
         alert('Unexpected Error!; \n\r ' + ex.message);
      }

Идея заключается в том, что когда пользователь нажимает кнопку печати, чтобы получить html с клиента, отправьте его на сервер, сохраните его и при успешном сохранении откройте отчет, который использует ранее сохраненный html, во всплывающем окне. Этот подход прекрасно работает во всех браузерах, протестированных как на MAC, так и на ПК, кроме Safari на MAC.

Есть идеи, почему это может быть?

EDIT:

JavaScript-код, который пытается открыть всплывающее окно, когда браузер впервые загружает (или выгружает) страницу, не удастся.

Принимая во внимание вышеупомянутое утверждение, возможно, Safari рассматривает попытку открыть всплывающее окно после ajax-запроса как начальную стадию загрузки / выгрузки страницы и поэтому запрещает это?

1 Ответ

0 голосов
/ 07 января 2010

Скорее всего, блокировщик всплывающих окон блокирует ваш window.open().

Возможно, вам повезет больше, если вы сделаете что-то вроде этого:

function SaveAndPrintHtml(htmlToPrint) {
  var $form = $('<form method="post" />');
  $form.attr('target', '_blank');
  $form.attr('action', 'temp.aspx?Action=SaveHtmlToPrint');
  $form.append($("<input type='hidden'/>").val(htmlToPrint);
  // grab the form DOM object and submit it - it should open in a new window:
  $form[0].submit();
}

Это должно опубликовать форму с правильными данными по соответствующему URL, открывая для этого новое окно. Затем вы заставляете ваш temp.aspx передавать заголовок перенаправления на print.aspx.

...