Информационная панель IE8, блокирующая загрузку скриптового файла в ответ на запрос JQuery AJAX - PullRequest
3 голосов
/ 30 ноября 2010

У меня есть внешний интерфейс html / javascript, который использует AJAX-запрос JQuery для отправки XML-файла, содержащего введенные пользователем данные формы, в бэкэнд-приложение, которое, в свою очередь, создает PDF-файл из этой информации.В ответ веб-интерфейс получает UUID, который затем использует в URL-адресе для загрузки сгенерированного PDF.

Это прекрасно работает в Firefox и Safari, но блокируется защитой Internet Explorer 8 от загрузок по сценарию.Указание IE8 загрузить файл через порожденную информационную панель приводит к перезагрузке страницы, которая закрывает весь введенный пользовательский контент.

Одиночное событие onMouseUp в элементе esque-button запускает генерациюXML для отправки, отправка XML, получение ответа, а затем инициирование загрузки с помощью установки URL-адреса в объекте window.location.Разделение этой загрузки на другую кнопку (при которой одна генерирует и отправляет xml и извлекает UUID, а другая только инициирует загрузку с использованием URL-адреса, созданного из UUID) обходит информационную панель, но разрушает простоту и интуитивность интерфейса.

Вот соответствующие функции javascript:

function sendXml()
{
    var documentXml = generateDocumentXml();
    var percentEncodedDocumentXml = escape(DocumentXml);
    var url = "generate?document=" + percentEncodedDocumentXml;
    $.ajax({
        url: url,
        type: "GET",
        dataType: "xml",
        success: function (xml)
        {
            var uuid = $(xml).find('uuid').text();
            getPdf(uuid);
        },
        error: function (xhr)
        {
            alert("There was an error creating your PDF template");
        }
    });
}

function getPdf(uuid)
{
    var url = "generate?get-pdf=" + uuid;
    window.location = url;
}

Я жду предложений о том, как лучше всего решить эту проблему.Мое первое предпочтение состояло бы в том, чтобы информационная панель вообще не вмешивалась, но сведение к минимуму ее вреда было бы существенным улучшением по сравнению с текущей ситуацией.Если бы он не мог перезагрузить и стереть интерфейс веб-интерфейса и фактически перейти к загрузке файла, когда пользователь выбирает «Загрузить файл ...» через меню информационной панели, это поможет.

1 Ответ

2 голосов
/ 30 ноября 2010

Я проверил его, и причиной появления панели является тот факт, что нет прямой связи между действием пользователя (наведением мыши) и загрузкой URL (предположим, PDF-файл).

Этот обходной путь решит проблему:

Создайте iframe (может быть скрыт) внутри документа и используйте

window.open(url,'nameAttributeOfTheIframe') 

... для загрузки PDF.Панель также появляется, но если пользователь выбирает загрузку, текущий документ также будет перезагружен, но пользовательский контент (если вы имеете в виду данные формы) останется, так как панель принадлежит элементу iframe, а не родительскому документу.

Обязательно отправляйте заголовок вложения вместе с PDF, чтобы остерегаться показывать его внутри браузера (если браузер может), потому что, если вы используете скрытый iframe, пользователь не может видеть, что там загружено.

<iframe name="nameAttributeOfTheIframe" style="display:none"></iframe>
<input type="button" value="click here"  onclick="f1()"/>
<input value="default value">
<script type="text/javascript">
<!--
function f1()
{
   //simulate delayed download
   setTimeout(f2,1000)     
}

function f2()
{
  window.open('http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf','nameAttributeOfTheIframe');      
}

document.getElementsByTagName('input')[1].value='this is modified value, should remain';

//-->
</script>
...