2012-11-14 4 views
2

У меня озадачивает проблема: это, казалось бы, простая страница не работает в IE9:Отказано в доступе при доступе к navigator.userAgent в IE9

<?xml version="1.0" encoding="UTF-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/> 
    <!-- jq.js is the non-minified jQuery library --> 
    <script type="text/javascript" src="jq.js"></script> 
    <script type="text/javascript" src="http://code.jquery.com/ui/1.9.0/jquery-ui.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $('body').append('<h1>ok</h1>'); 
     }); 
    </script> 
</head> 

<body> 
</body> 
</html> 

поведение я получаю, что иногда страница отображается «ОК ", и иногда ничего не отображает. Я узнал, что это зависит от того, насколько быстро компьютер. Если вы находитесь на быстром компьютере, он обычно работает, но на медленных компьютерах он выходит из строя примерно в 2 раза из трех раз.

Когда я смотрю в консоли отладки, симптом заключается в том, что jQuery получает разрешение, отклоненное при попытке доступа к navigator.userAgent.

Браузер записывает (в журнале), что он переключается с quirks на режим IE9. Моя гипотеза заключается в том, что jQuery загружается до того, как браузер переключится на режим IE9, в результате чего jQuery будет пойман в режиме quirks и оттуда не сможет получить доступ к каким-либо атрибутам браузера.

Я попытался вставить <!doctype html> и вставил X-UA-Compatible мета-тег, чтобы сделать переключатель IE9 в режиме IE9 сразу, но это не решает проблему.

мне удалось выйти из JQuery и воспроизвести проблему с помощью этого простого фрагмента кода: (. Доступно в http://test.m.e17.dk/ie9-navigator/)

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8" /> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/> 
</head> 

<body> 
    <script type="text/javascript"> 
     document.write('<h1>testing</h1>'); 
     try { 
      document.write('<h1>' + navigator.userAgent + '</h1>'); 
      document.write('<h1>ok</h1>'); 
     } catch(e) { 
      document.write('<h1>not ok</h1>'); 
     } 
    </script> 
</body> 
</html> 

Воспроизведите его:

  1. Откройте страницу ,
  2. Пресс F5.
  3. Поместите курсор в адресную строку.
  4. Нажмите enter.

Повторите шаги 2-4, как это часто бывает. Может возникнуть проблема, не дожидаясь загрузки DOM (как указано в http://bugs.jquery.com/ticket/12282).

+0

Удалите '' Сверху. –

+0

... но страница должна начинаться с '' '' (пробовала безрезультатно) или объявления XML, подобного этому ...? – mzedeler

+0

У вас есть '' ** вместо ** тега XML? –

ответ

2

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

Спасибо всем, кто помогает.

Политика, о которой идет речь, приведена на прилагаемом рисунке ниже.

enter image description here

1

просто предложение, вы пытались загрузить оба сценария из одной и той же сети доставки контента ?, и просто убедитесь, что заказ верен (кажется, кажется, правильно), но это также может быть связано с задержкой от одного источника или другой. Sidenote: попробуйте помещать теги скриптов в нижней части ваших документов, а не в заголовок, это связано с проблемами производительности.

+0

Да. Исходный код, в котором началась регрессия, используется jQuery CDN. – mzedeler

+0

Я просто попробую пример с CDN. – mzedeler

2

Я не знаю об 1,9, но у меня была аналогичная регрессия с 1,8 на IE9 (регрессия более 1,7). Ошибка подробно описана здесь:

http://bugs.jquery.com/ticket/12282

В основном DOM не может быть готов, когда document.ready обжигают в IE9, потому что ваш Javascript сценарий может начаться до того, как вся страница читается.

По-видимому, на самом деле есть дискуссия о том, как это ошибка или нет.

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

Альтернативное решение состоит в том, чтобы просто перенести документ как можно дальше в конце страницы, после всего, что вам нужно из html (конечно, в упрощенном примере это не сработает, потому что вы используете <body> , но, надеюсь, в вашем реальном коде вам это не нужно).

В качестве альтернативы, если вы хотите, чтобы ваши руки грязные, и это не было зафиксировано в 1,9, вот где исправление было реализовано на 1,8:

https://github.com/jquery/jquery/commit/0f553ed0ca0c50c5f66377e9f2c6314f822e8f25

Как вы можете видеть, это просто одна строка кода, поэтому, возможно, вы можете сохранить свою собственную фиксированную версию версии 1.9 до тех пор, пока не появится стабильная версия, или, может быть, вы можете реализовать эту же защиту в своем собственном сценарии jquery.

+0

Спасибо за обмен. Я изучаю это. – mzedeler

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