Internet Explorer пытается запустить jQuery перед загрузкой библиотеки - PullRequest
3 голосов
/ 10 февраля 2011

У меня есть маленький скрипт

document.write("<html><head><script src='/js/jquery-1.4.2.min.js' type='text/javascript'></scr"
         + "ipt><script>alert($"+"().jquery);</scri" + "pt></head></html>");

Но я получаю $ is undefined в Internet Explorer. Я думаю, что он пытается запустить скрипт перед загрузкой библиотеки.

Однако это работает в Firefox. Пожалуйста, помогите.

Редактировать: я открываю новое окно и пишу в документ этого окна.

Ответы [ 11 ]

8 голосов
/ 11 февраля 2011

Что не так с правильным созданием тега <script>?document.write это зло, конец дискуссии.

Попробуйте с этим:

var load_script = function(options) {
  options.owner_document = options.owner_document || document;

  var script_tag = options.owner_document.createElement('script');
  script_tag.setAttribute('type', 'text/javascript');
  script_tag.setAttribute('src', options.src);
  script_tag.onload = function() {
    script_tag.onreadystatechange = null;
    options.callback && options.callback();
  };
  script_tag.onreadystatechange = function() {
    if (script_tag.readyState == 'loaded' || script_tag.readyState == 'complete') {
      script_tag.onload = null;
      options.callback && options.callback();
    }
  };
  options.owner_document.getElementsByTagName('head')[0].appendChild(script_tag);
};

, как видите, в этом фрагменте есть простой API:
src - источник скрипта
owner_document - документ, в который будет вставлен скрипт, по умолчанию используется текущий документ, в котором скрипт запускается из
callback - функция, запускаемая после загрузки скрипта, все, что требуетСкрипт src можно безопасно запускать внутри этого замыкания.

пример использования:

// sample loading of jQuery
load_script({
  src: '/js/jquery-1.4.2.min.js',
  callback: function() {
    // jQuery is available at this point, run your code.

  }
});

альтернативно, вы можете использовать такие загрузчики, как Requiere.js и LABjs

4 голосов
/ 17 февраля 2011

Дело в том, что вы непреднамеренно запустили IE для загрузки ваших сценариев неблокирующим способом. Прочитайте это для получения дополнительной информации: Загрузка JavaScript без блокировки .

На странице предлагается использовать этот код для получения уведомлений о завершении загрузки скрипта:

//Internet Explorer only
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "/js/jquery-1.4.2.min.js";
script.onreadystatechange = function(){
    if (script.readyState == "loaded" ||
            script.readyState == "complete"){
        script.onreadystatechange = null;
        // Your code goes here.
        alert("Script is ready!");
    }
};
document.body.appendChild(script);
1 голос
/ 19 февраля 2011

См. Это решение: JavaScript document.write Порядок выполнения встроенных скриптов

(также обратите внимание на комментарий, это важно)

1 голос
/ 10 февраля 2011

попробуйте запустить второй скрипт при загрузке страницы (window.onload) или попробуйте вставить скрипт в тело, а не в раздел head.
try:

document.write("<html><head><script src='/js/jquery-1.4.2.min.js' type='text/javascript'></scr"
     + "ipt><script>window.onload = function(){alert($"+"().jquery);};</scri" + "pt></head></html>");

браузер победил 't загрузить библиотеку мгновенно (если только она не находится в кеше), поэтому ваш скрипт может быть вызван до загрузки библиотеки.

0 голосов
/ 20 февраля 2011

вы просто создаете тег для ссылки на jQuery, и как только его созданный следующий оператор будет предупреждением.Вы не указали способ, которым оператор оповещения должен запускаться после загрузки файла.

0 голосов
/ 18 февраля 2011

Если вы хотите упростить условную загрузку jQuery, уже есть много вариантов; Не нужно изобретать велосипед. Уже упоминались RequireJS и LabJS . Я использую Head.js , и было бы проще достичь цели неблокируемой загрузки при соблюдении порядка выполнения.

0 голосов
/ 16 февраля 2011

Простой таймер должен это сделать.

(function(){
  function wait() {
    if (typeof jQuery == 'undefined') {
        setTimeout(wait, 50);            
    } else {
        run(); // your code to execute
    }
  }

  wait();
})();

Пример для jsfiddle: http://jsfiddle.net/madr/Gtafq/

0 голосов
/ 16 февраля 2011

Попробуйте?

http://jsfiddle.net/MP75r/

0 голосов
/ 13 февраля 2011

Вы пытались переместить тег script, выполняющий ваш код, в конец тега body? Согласно рекомендациям Yahoo (создатели YSlow):

Проблема, вызванная скриптами, заключается в том, что они блокируют параллельные загрузки. Спецификация HTTP / 1.1 предполагает, что Браузеры скачивают не более двух компоненты параллельно на имя хоста. Если вы обслуживаете ваши изображения из нескольких Имена хостов, вы можете получить более двух загрузка должна происходить параллельно. В то время как скрипт загружается, однако браузер не запускается загрузки, даже на разных имена хостов.

Таким образом, результат будет выглядеть как ...

document.write("<html><head><script src='/js/jquery-1.4.2.min.js' type='text/javascript'></scr"
     + "ipt></head><body><script>alert($"+"().jquery);</scri" + "pt></body></html>");

Хотя я бы также рекомендовал не использовать document.write ().

0 голосов
/ 11 февраля 2011

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

 document.write("<html><head><script src='/js/jquery-1.4.2.min.js' type='text/javascript'></scr"+ "ipt><script type='text/javascript'>var wait_for_jQuery = function() {if (typeof $ === 'undefined') {setTimeout('wait_for_jQuery()', 1000);} else {alert($"+"().jquery);}};  wait_for_jQuery(); </scri" + "pt></head></html>");

Рабочий пример здесь: http://www.jsfiddle.net/YqTgM/36/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...