Порядок загрузки IE9 js и JQuery

Кажется, что эту проблему легко решить, но она надирает мне задницу.

Следующий простой пример выдает ошибку в IE9. Я использовал страницу разработчика IE9 для мониторинга загрузки сети, и похоже, что IE загружает и выполняет сценарий тела до загрузки/оценки включенного javascript.

Я пробовал все различные приемы, найденные при поиске ответов, включая добавление <meta charset="UTF-8" /> и <meta http-equiv="x-ua-compatible" content="IE8"/>

<html>
<head>
  <title>Demo of IE suckiness</title>
  <script type='text/javascript' 
      src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js'></script>
  </head>
  <body>
This works in every browser but not IE9. IE gives the error:
<pre>
Line: 9
Error: The value of the property '$' is null or undefined, not a Function object
</pre>

<script type="text/javascript" defer="defer">
$(document).ready(function(){
  alert("Must not be IE");
});
</script>
</body>
</html>

У меня есть обходной путь. Переместите готовый скрипт в <body onload="ready()">, но я не могу поверить, что это не работает для IE9, я, должно быть, делаю что-то не так и просто не вижу этого.


person TrophyGeek    schedule 02.11.2011    source источник
comment
Почему вы используете отсрочку? $(document).ready означает, что он будет выполнен при загрузке документа.   -  person Mārtiņš Briedis    schedule 03.11.2011
comment
Вы можете проверить, загружается ли библиотека jquery? Возможно, ajax.googleapis.com/ajax/libs/jquery /1.6.4/jquery.min.js по какой-то причине заблокирован.   -  person fehays    schedule 03.11.2011
comment
Я проверил, что он загружается. Проблема заключалась в том, что он не загружался до запуска сценария страницы. Отсрочка была безумной попыткой заставить ее НЕ загружаться первой. Я просто не имел смысла. Решение ниже состояло в том, чтобы сбросить все мои настройки IE. Должно быть, я изменил настройки безопасности или что-то в этом роде? Просто не имеет смысла загружать IE, но не загружать JQuery.   -  person TrophyGeek    schedule 03.11.2011


Ответы (4)


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

person Tom N    schedule 02.11.2011
comment
Ух ты. ХОРОШО. Это сработало! Как ты догадался хотя бы попробовать? Я трачу на это часы. Естественно, я запускал его на своем локальном сервере (localhost) и пытался загрузить jquery с локального пути, но ничего не работало. - person TrophyGeek; 03.11.2011

Насколько мне удалось выяснить, IE9 запускает $.load() только тогда, когда весь документ (включая все изображения и сопутствующие материалы) загружен. Ужасно, но факт! Мой обходной путь для этого:

            var docReady = {
                actions:new Array(),
                flag:0,
                time:0,
                period:10,
                trigger:function() {this.flag=1},
                checkHandle:0,
                check:function() {
                    this.time+=this.period;
                    if(this.flag) {
                        clearInterval(this.checkHandle);
                        for(i in this.actions) {this.actions[i]();}
                    }
                },
                watch:function() {
                    this.checkHandle = setInterval(function() {docReady.check();},this.period);
                },
                action:function(f) {
                    this.actions.push(f);
                }

            };

            docReady.watch();

Действительно грязный, но он работает; теперь, когда вы сочтете нужным, вы можете вызвать docReady.trigger(), и вы должны сделать это, по крайней мере, в конце страницы. Кроме того, вы можете назвать это загрузкой тела. Гарантируется, что функции, которые вы добавили с помощью docReady.action(), будут запускаться только один раз: когда произойдет первый триггер().

person dkellner    schedule 10.12.2012

Вы пытались пропустить defer="defer"?

person topek    schedule 02.11.2011
comment
Если это ответ, то почему вопрос? :D - person Mārtiņš Briedis; 03.11.2011
comment
Спасибо за идею. Я попробовал это сочетание. - person TrophyGeek; 03.11.2011

У меня была та же проблема, и я решил ее, НЕ используя размещенный в Google jQuery и размещая его локально.

person James    schedule 04.07.2012
comment
Привет Джеймс. Добро пожаловать в Stackoverflow. Вы можете дать ответы на вопрос, на который уже был дан ответ. Нет проблем с этим. Суть в том, чтобы поделиться разным опытом между членами сообщества. Найдите время, чтобы прочитать FAQ. - person Ahmad Alfy; 10.10.2012