Ошибки данных URI и ошибки Internet Explorer 9

У меня возникла проблема с использованием схемы URL-адресов данных RFC 2397 с версиями IE 6-9. Мой пример кода работает без проблем при использовании текущих версий Safari, FF, Opera и Chrome.

data:text/html;base64,PG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDt1cmw9aHR0cDovL2dvb2dsZS5jb20vIj4g 

или

 data:text/html,%3Cmeta%20http-equiv%3D%22refresh%22%20content%3D%220%3Burl%3Dhttp%3A//google.com/%22%3E%20 

Если вышеуказанный код вставлен почти в любой браузер, исключая IE, он будет перемещаться по адресу google.com, когда при попытке с IE он терпит неудачу со следующей ошибкой.

Невозможно отобразить веб-страницу

Скорее всего, причина:

  • Некоторым контентом или файлами на этой веб-странице требуется программа, которую вы не установили.

То, что вы можете попробовать:

Поиск в Интернете для программы, которую вы можете использовать для просмотра этого веб-контента.

Введите адрес повторно.

При проверке источника страницы созданной страницы ошибки IE есть ссылка, которая ссылается на ассоциации файлов и протоколы.

Тип протокола:

Описание: UnKnown

Windows не распознает данный протокол.

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

Я искал все решения и пробовал много примеров с IE, надеясь, что это мой синтаксис, но все же нашел решение.

URI данных нельзя использовать для навигации, для сценариев или для заполнения фреймов или элементов iframe в IE.

Согласно http://msdn.microsoft.com/en-us/library/cc848897%28v=vs.85%29.aspx :

URI данных поддерживаются только для следующих элементов и / или атрибутов.

 object (images only) img input type=image link CSS declarations that accept a URL, such as background, backgroundImage, and so on. 

URI данных могут быть вложенными.

По соображениям безопасности URI данных ограничены загруженными ресурсами. URI данных нельзя использовать для навигации , для сценариев или для заполнения элементов фрейма или iframe.

URI данных не может быть больше 32 768 символов.

Данные ресурсов должны быть правильно закодированы; в противном случае возникает ошибка, и ресурс не загружается. Символы «#» и «%» должны быть закодированы, а также управляющие символы, неамериканские символы ASCII и многобайтовые символы.

Для получения дополнительной информации см. RFC2397: Схема URL-адресов данных.

Доступно как в Windows Internet Explorer 8 или новее. **

Для меня поиск document.execCommand был спасателем жизни. Он использует iFrame как и некоторые другие примеры, но execCommand обеспечивает совместимость функции Save As .

Вот пример

 var getCsvFileForIE = function(target) { var csvData = target.attributes["data-csv"].value; if (navigator.appName === "Microsoft Internet Explorer") { csvData = decodeURIComponent(csvData); var iframe = document.getElementById('csvDownloadFrame'); iframe = iframe.contentWindow || iframe.contentDocument; csvData = 'sep=,\r\n' + csvData; iframe.document.open("text/html", "replace"); iframe.document.write(csvData); iframe.document.close(); iframe.focus(); iframe.document.execCommand('SaveAs', true, 'data.csv'); } else { if (console && console.log) { console.log('Trying to call getCsvFileForIE with non IE browser.'); } } }; 

Мы делаем это для IE, и для всех других браузеров мы используем стандартную ссылку URI данных. Вы можете увидеть полный текст для получения более подробной информации. Кончик шляпы Эндрю Блондоу для направления .


ОБНОВИТЬ

Лучший способ определить, поддерживает ли браузер URI данных

supportsDataUri = 'download' in document.createElement('a');

Также кажется, что IE все еще сталкивается с проблемами. Для IE10 + вам может понадобиться использовать msSaveOrOpenBlob а для IE8 / 9 вам все равно нужно выполнить execCommand в iFrame .

ОБНОВЛЕНИЕ 2

Существует проблема Modernizr для обнаружения схемы uri данных. Он ссылается на другой ответ SO . Обязательно проверьте их.

Internet Explorer поддерживает URI данных (ресурс немного устарел). У этого есть некоторые соображения безопасности, хотя это мешает ему разрешить вредоносные попытки перенаправить пользователей или иным образом разрешить хакерам заниматься фишинг, не требуя сторонних скриптов или размещенных ресурсов.

Это означает, что вы можете использовать его с JavaScript:

  

Каскадные таблицы стилей (с кодировкой base64 или без нее):

   

Или даже изображения:

  

Однако вы не можете использовать их с window.open или iframe , так как это может привести к некоторым очень опасным вещам, включая фишинг с URI данных :

  

Этот последний пример вполне мог быть полной версией экрана входа в систему PayPal. Вместо этого это просто кнопка HTML с привязкой к событиям и прослушивание кликов. Подобный хакерский процесс может возникнуть через window.open :

 window.open("data:text/html;base64,PHN0cm9uZz5XQVQhPzwvc3Ryb25nPg==", "OHAI"); 

Таким образом, Internet Explorer 10 поддерживает эту функцию, но защищает конечного пользователя от тех, кто будет использовать его злонамеренно. Я уверен, что Microsoft с радостью поднимет это ограничение, когда и если они определят лучший способ защитить свою базу пользователей.

Пока все не изменится, вам нужно найти другой способ включить файлы FLV. С другой стороны, вы можете не захотеть передавать фактические данные из вашего приложения в Stack Overflow.

В соответствии с ответом Франко здесь: Экспорт файлов CSV для IE

Просто создайте с ним объект Blob

 //Save file if (isMicrosoftIE()) { csvData = decodeURIComponent(csv); if(window.navigator.msSaveBlob){ var blob = new Blob([csvData],{ type: "application/csv;charset=utf-8;"}); navigator.msSaveBlob(blob, filename); } } else { csvData = "data:application/csv;charset=utf-8," + encodeURIComponent(csv); $(this).attr({ "href": csvData, "target": "_blank", "download": filename }); } 

И это работает для меня!

Здесь объясняются два альтернативных решения: http://sparecycles.wordpress.com/2012/03/08/inject-content-into-a-new-iframe/

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

Пример использования метода javascript: scheme приведен здесь: http://jsbin.com/uhenuz/4 (Если для использования с https потребуется дополнительный поиск в googling и хорошее тестирование, чтобы проверить, что смешанное предупреждение https / http никогда не появится.)

Я пришел сюда, пока искал способ обнаружения данных для поддержки файлов uri (в моем случае это PDF-файлы). Подход Modernizr к проверке поддержки изображений не был достаточно хорош, так как Internet Explorer 11 и Edge 25 поддерживают это, но не поддерживают такие типы файлов, как application / pdf. Подход Snekse к проверке атрибута загрузки работал на IE, но не на Edge. В конце концов, я написал свой собственный скрипт обнаружения функции, используя вызов AJAX, чтобы попытаться открыть URI данных и проверить наличие ошибок. Это сценарий, который я использовал (тестировался в IE 11, Edge 25, Firefox 46 и Chrome 49):

 checkDataURISupport(function (checkResult) { if (checkResult) { alert('Files in data URIs are supported.'); } else { alert('Files in data URIs are NOT supported.'); } }) function checkDataURISupport(callback) { try { var request = new XMLHttpRequest(); request.onload = function reqListener() { callback(true); }; request.onerror = function reqListener() { callback(false); }; request.open('GET', 'data:application/pdf;base64,cw=='); request.send(); } catch (ex) { callback(false); } } 

Обновить

Я понял, что любой код, который тестирует URI данных, является поддержкой iframe, а также проверяет поддержку открытия URI данных в новом окне. Таким образом, решение, упомянутое в этом ответе SO и связанное с обновлением ответа Snekse, технически превосходит, и я бы рекомендовал использовать его вместо приведенного выше кода.

  • Почему я не могу передать Protocol.Type на общий параметр T.Type?
  • Android / iOS - настройка пользовательского URI / протокола
  • Interesting Posts

    Документ Word имеет очень странное «скрытое» формирование после преобразования из PDF в .docx

    Преобразовать общий список / Перечислить в DataTable?

    Повторное применение пасты для теплопередачи

    Сообщение AJAX строкового массива JavaScript в JsonResult как List Всегда возвращает нуль?

    Трюки для ускорения времени запуска? Windows 7

    Почему расчетная ширина и высота в пикселе строки в Tkinter различаются между платформами?

    Как сделать gradleиентный цветный график времени в R

    Коробка для бродяг не может быть найдена или недоступна в удаленном каталоге – несовместимая версия завитка

    Разница между Console.Read () и Console.ReadLine ()?

    Конвенция о присвоении имен JSON

    Как создать импульсный эффект с использованием -webkit-animation – наружные кольца

    Выполнение static_assert, что тип шаблона является другим шаблоном

    Включить удаленное соединение с MySQL: ERROR 1045 (28000): доступ запрещен для пользователя

    Доступ к firebase.storage () с помощью AngularFire2 (Angular2 rc.5)

    группировка перетаскиваемых объектов с помощью jquery-ui draggable

    Давайте будем гением компьютера.