2012-06-09 2 views
4

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

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

Я переформулирую это так, чтобы вы поняли: код НЕ ПРОХОДИТ, если вы заходите на сайт после запуска нового сеанса браузера. Код ДЕЛАЕТ запустить, если открыть сайт в новой вкладке, или перезагрузите страницу или откройте консоль отладки

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

(function (i) { 
    var u = navigator.userAgent; 
    var e = /*@[email protected]*/ 
    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 
+7

Как хороший совет javascript, всегда используйте обнаружение функции, а не обнаружение браузера. Мне больно видеть этот код. Вы можете решить большинство проблем, связанных с перекрестным браузером, с помощью jQuery. http://api.jquery.com/ready/ Работает ли он в ie8? –

+2

Я отказываюсь использовать jQuery. Благодарю вас. Меня интересует использование JavaScript, а не библиотеки. Этот код действительно не является проблемой, также я нашел его где-то, думая, что это решит мою проблему (а это не так). Главное, что он отлично работает, когда вы перезагружаете страницу или открываете консоль отладки, но не при первом запуске браузера и переходе на сайт - что не имеет смысла! –

+0

Можете ли вы прокомментировать свой код? Я не понимаю, что вы делаете. Вы присваиваете false переменной e, а затем используете ее в «else if (e)». В чем смысл этого? – user907860

ответ

2

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

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

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

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'); 
     } 
    } 
} 
+0

Хотя это работает для IE 9, я бы предпочел использовать 'jQuery (contentloadtag) .ready (init);' Это просто читаемость и надежность. –

+2

Но я не использую jQuery. –

3

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

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

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

+0

По-видимому, меня никто не слушает. Код ** НЕ запускается **, если вы заходите на сайт после запуска нового сеанса браузера. Код ** DOES ** запускается, если вы открываете сайт на новой вкладке или перезагружаете страницу или открываете консоль отладки. –

+0

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

+0

нет кода, который вызывает это, это выполняется при загрузке javascript, а затем определяет, когда документ загружается для вызова моей функции init. Это как можно выше. –

14

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

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

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

  • Когда я копировал и вставлял URL-адрес в IE, событие onload не срабатывало.
  • Если я открою консоль с помощью F12, а затем за URL-адресом в браузере и нажал кнопку ввода, все, казалось, работает.
  • Теперь, когда я открывал консоль хотя бы один раз,
    • Если я закрыл консоль, а затем перезагрузил страницу, то нагрузка была запущена.
    • Если я набрал 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 цента. Я тянул свои волосы над этим вопросом дольше, чем я хотел бы признать. Надеюсь, это полезно, по крайней мере, для кого-то.

+0

блестящий, спас мой день! –

+0

спасибо за это, console.log нарушил мой код в IE, комментируя его, исправил его – railsy

+0

Большое спасибо за четкое описание. Очень полезно. – Sudarshan

3

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

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

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