2010-01-26 2 views
10

Я разрабатываю приложение JavaScript, предназначенное для запуска либо с веб-сервера (через http), либо из файловой системы (по файлу: // URL).Читать файл: // URL в IE XMLHttpRequest

В качестве части этого кода мне нужно использовать XMLHttpRequest для загрузки файлов в том же каталоге, что и страница и в подкаталоги страницы.

Этот код работает отлично («PASS») при выполнении на веб-сервере, но не работает («FAIL») в Internet Explorer 8 при запуске от файловой системы:

<html><head> 
<script> 
window.onload = function() { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", window.location.href, false); 
    xhr.send(null); 
    if (/TestString/.test(xhr.responseText)) { 
    document.body.innerHTML="<p>PASS</p>"; 
    } 
} 
</script> 
<body><p>FAIL</p></body> 

Конечно , сначала он терпит неудачу, потому что никакие скрипты вообще не могут запускаться в файловой системе; пользователю предлагается желтая полоса, предупреждая, что «Чтобы защитить вашу безопасность, Internet Explorer ограничил эту веб-страницу запуском скриптов или элементов ActiveX, которые могли бы получить доступ к вашему компьютеру».

Но даже когда я нажимаю на панель и «Разрешить блокировку содержимого», страница все еще не работает; Я получаю сообщение об ошибке «Отказано в доступе» при вызове xhr.open.

Это меня озадачивает, потому что MSDN говорит, что «Для целей разработки протокол протокола: // разрешен в зоне локального компьютера». Этот локальный файл должен быть частью зоны локального компьютера, не так ли?

Как я могу заставить код работать? Я в порядке, предлагая пользователю предупреждения о безопасности; Я не в порядке, заставляя их отключать безопасность в панели управления.

EDIT: Я действительно не загружаю XML-документ в свой случай; Я загружаю простой текстовый файл (.txt).

+0

Вы попробовали var xhr = new ActiveXObject ("MSXML2.XMLHTTP"); (см. мой ответ ниже)? Это не должно ограничиваться XML-файлами. Но он будет ограничен IE. – Don

+0

FWIW, у меня такая же проблема в Chrome, что в основном то же самое. – apollodude217

ответ

7

Хм, это может быть разница между собственным объектом XMLHttpRequest и ActiveX? Кажется, я что-то помню об этом. То есть, вместо того, чтобы

var xhr = new XMLHttpRequest(); 

попробовать

var xhr = new ActiveXObject("MSXML2.XMLHTTP"); 

Очевидно, поставить некоторые проверки на месте, чтобы увидеть, если браузер поддерживает ActiveX. Конечно, это ограничивается только IE.

+0

все еще получают разрешение в IE10 – FlavorScape

+0

ummmm yes SCRIPT5: Доступ запрещен. такая же ошибка :( –

+0

очень понравился. спасибо –

6

Я просто случайно наткнулся на ту же проблему. Как было предложено выше, работает не-native ActiveX-конструктор. Я не уверен, существуют ли разные политики для двух объектов, но поскольку jQuery упоминает ту же проблему, это может быть подлинная ошибка. Вот соответствующая часть кода из источника JQuery (1.4.2, строка 4948):

// Create the request object; Microsoft failed to properly 
// implement the XMLHttpRequest in IE7 (can't request local files), 
// so we use the ActiveXObject when it is available 
// This function can be overriden by calling jQuery.ajaxSetup 
xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? 
    function() { 
     return new window.XMLHttpRequest(); 
    } : 
    function() { 
     try { 
      return new window.ActiveXObject("Microsoft.XMLHTTP"); 
     } catch(e) {} 
    } 
+0

А вот это объясняет, почему обновление jQuery после v1.11.1 вызывало проблемы с разрешением на IE11 при работе с методом .load. Я думаю, что jQuery просто прекратил проверку этого после определенного версия. – calculuswhiz

6

Как я могу получить код, как это работает?

Как указано выше, это выглядит как ошибка в Microsoft XMLHttpRequest. JQuery (июль 2011) также пишет: -

Microsoft не удалось должным образом реализовать XMLHttpRequest в IE7 (не может запрашивать локальные файлы)

я подтверждаю этот отказ для IE8 тоже.

Решение должно использовать new window.ActiveXObject("Microsoft.XMLHTTP") для локальных файлов, если XMLHttpRequest не работает.

Неудача в xhr.open линии, так что можно поймать там, а затем попытаться ActiveXObject следующим образом: -

var xhr = new XMLHttpRequest() 
try { 
    xhr.open('GET', url, true) 
} 
catch(e) { 
    try { 
     xhr = new ActiveXObject('Microsoft.XMLHTTP') 
     xhr.open('GET', url, true) 
    } 
    catch (e1) { 
     throw new Error("Exception during GET request: " + e1) 
    } 
} 

Этот код будет по крайней мере использовать стандартный XMLHttpRequest для IE9 (непроверенных) и будущих браузеров IE, если это/когда Microsoft исправляет ошибку. С приведенным выше кодом jQuery нестандартный Microsoft.XMLHTTP будет использоваться всякий раз, когда доступен ActiveXObject, даже если Microsoft исправляет ошибку.

+0

Не работает. Все еще получают разрешение, запрещенное с новым ActiveXObject («Microsoft.XMLHTTP») в IE10. – FlavorScape

+0

Ошибка в этой проблеме. XMLHttpRequest терпит неудачу для локальных файлов, даже до IE11. Подумайте, почему Microsoft никогда не исправляла это. Возможно, они сделали в Edge, я не знаю. Хорошо, что ActiveXObject работает как минимум. – calculuswhiz

Смежные вопросы