IE9 не работает на JavaScript

По какой-то причине IE9 не запускает мою загрузку кода JavaScript, когда браузер запускается впервые в этом сеансе. Кажется, он запускается только после загрузки страницы. Он также будет запускать JavaScript, когда откроется консоль отладки.

Как мне сделать так, чтобы JavaScript запускался при загрузке после открытия браузера? Это просто ошибка IE9?

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

Вот функция, которую я использую для запуска сценария onload (которая отлично работает в браузерах NORMAL):

(function (i) {
  var u = navigator.userAgent;
  var e = /*@cc_on!@*/
  false;
  var st = setTimeout;
  if (/webkit/i.test(u)) {
    st(function () {
      var dr = document.readyState;
      if (dr == "loaded" || dr == "complete") {
        i()
      } else {
        st(arguments.callee, 10);
      }
    }, 10);
  } else if ((/mozilla/i.test(u) && !/(compati)/.test(u)) || (/opera/i.test(u))) {
    document.addEventListener("DOMContentLoaded", i, false);
  } else if (e) {
    (function () {
      var t = document.createElement('doc:rdy');
      try {
        t.doScroll('left');
        i();
        t = null;
      } catch (e) {
        st(arguments.callee, 0);
      }
    })();
  } else {
    window.onload = i;
  }
})(init); //init is the function to call onload

4 ответа

Решение

Хорошо, я понял это. Это связано с каким-то странным способом, которым IE обрабатывает операторы IF.

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

После удаления первого оператора IF все работает нормально. Я также решил использовать другую функцию загрузки, которую можно увидеть ниже:

if (document.addEventListener) {
    document.addEventListener('DOMContentLoaded', init, true);
} else if (document.all && !window.opera){ //Crude test for IE
//Define a "blank" external JavaScript tag
    document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="javascript:void(0)"><\/script>');
    var contentloadtag=document.getElementById("contentloadtag");
    contentloadtag.onreadystatechange=function(){
        if (this.readyState=="complete") {
            init();
            //ie('open');
        }
    }
}

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

$(window).load(function(){
    //All my code
});

И это именно то, с чем я столкнулся.

  • Когда я скопировал и вставил URL в IE, событие onload, похоже, не сработало.
  • Если я открою консоль с помощью F12, а затем пропущу URL-адрес в браузере и нажму enter, все, похоже, работает.
  • Теперь, когда я открыл консоль хотя бы один раз,
    • Если я закрыл консоль, а затем перезагрузил страницу, загрузка началась.
    • Если я набрал URL, а затем нажал Enter, загрузка началась.

Мне потребовалось несколько дней, чтобы понять, что я делаю неправильно.

Проблема была с заявлениями console.log. Во многих местах моего кода я много занимался консольной регистрацией. Даже у одного из плагинов, которые я использовал - у jplayer есть некомментированное консольное сообщение где-то в коде.

Проблема заключалась в том, что, если вы не откроете консоль хотя бы один раз в IE, объект консоли будет недоступен. Это означает, что код потерпит неудачу в первом обнаруженном файле console.log.

Теперь я не собирался комментировать все мои заявления console.log просто для того, чтобы протестировать его в IE. Итак, это то, что я сделал вместо этого. Прямо в верхней части моей функции document.ready jquery я написал этот небольшой фрагмент кода.

if(!window.console){
    console={};
    console.log = function(){};
}

По сути, он создает фиктивный заполнитель функции console.log, чтобы код мог работать в IE, но он будет работать только до тех пор, пока console.log является единственной консольной функцией, которую вы используете в своем коде или в своих плагинах.,

Просто мои 2 цента. Я тянул волосы за эту проблему дольше, чем мне хотелось бы признать. Надеюсь это пригодится хотя бы кому-то.

Просто небольшая заметка; Когда вы используете какие-либо ключевые слова отладки (например, console.log) или что-нибудь связанное, IE9 выйдет из этой функции JS, если и только если отладчик не включен (с F12)

На самом деле я не знаю, что еще вызывает проблемы, но для меня моей проблемой было слово "console.log", пока отладчик не включен в IE9 ... Я знаю, что это уже ответ на вопрос, но я чувствовал, что это нужно быть известным.

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

Самое простое, что можно сделать, это вставить в код кучу операторов alert(), чтобы увидеть, где он остановился, и сузить до этой строки.

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

Другие вопросы по тегам