2012-01-13 7 views
6

По-видимому, многие люди столкнулись с этой проблемой, но мне еще предстоит найти решение, которое работает.IE JQuery готовность не работает

У меня есть кусок кода, который необходимо запустить после загрузки страницы, и поэтому я воткнул его в следующем блоке:

$(document).ready(function() { 
    alert("Running initialization"); 
    initialize(); 
}); 
function checkDivLoaded() { 
    if ($('#footer').length == 0) $.error('not ready'); 
} 
function initialize() { 
    try{ 
     checkDivLoaded(); 
     ...more code here 
    } catch (err) { 
     setTimeout(initialize, 200); 
    } 
} 

Это прекрасно работает во всех браузерах, за исключением IE. Там код вообще не выполняется.

Этот код находится в самой нижней точке страницы, которую я могу его поместить (с использованием функций Zend Framework и специальных функций, связанных с страницей, означает, что существует ограничение на то, насколько низкая на странице она может идти). Я проверил включает для JS-файлов, которые все время загруженными из локальной версии, и все они имеют вид

<script type="text/javascript" src=""></script> 

Любые идеи?

ПРИМЕЧАНИЕ

Когда я открываю отладчик в IE, это начинает работать правильно.

+0

Что содержит «..более код здесь»? – ShankarSangoli

+1

Не передавайте строку в 'setTimeout'. – SLaks

+0

Является ли ваш 'src' пустым, что вызывает проблемы. Я полагаю, вы дали ему настоящий URL, так? –

ответ

10

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

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

Вместо $(document).ready(function(){}); вы можете просто сделать $(function(){}). однако это не должно меняться.

Кроме того, пожалуйста, не передавайте строки setTimeout (они получают eval 'd в глобальном масштабе), передайте функцию.

setTimeout(initialize, 200); 

Кроме того, вы уверены, что вы объявили $jquery (она не должна быть $.error)?

<script type="text/javascript"> 
    $(function() { 
     initialize(); 
    }); 
    function checkDivLoaded() { 
     if ($('#footer').length == 0){ 
      $jquery.error('not ready'); 
     } 
    } 
    function initialize() { 
     try{ 
      checkDivLoaded(); 
      //...more code here 
     } catch (err) { 
      setTimeout(initialize, 200); 
     } 
    } 
</script> 

EDIT: Если вы используете IE8 или ниже, это не добавляет console, если отладчик не работает (я хочу, кто думал, что это хорошая идея, был уволен). Если один из ваших включений использует console.log, это будет undefined, таким образом останавливая выполнение всего сценария.

Попробуйте добавить это в верхней части страницы:

window.console = window.console || {log:function(){}}; 

Это сделает «фальшивый» console объект, так что будет определяться console.log.

+0

Я обновил setTimeout так, как вы предлагали, и заменил $ jquery на $, но это не сработало. Я добавил предупреждение() перед первым вызовом для инициализации, и он не запускается в IE. – Elie

+0

@Elie: Проверьте консоль, возможно, более ранний скрипт умирает.В этом скрипте нет ничего, что вызывало бы событие 'ready', которое не запускалось бы. –

+0

Нечетный - когда я включаю отладчик, он работает просто отлично! – Elie

-1

Я всегда делаю

<script type="text/javascript" language="Javascript" src=""></script> 

и работает

также обернуть ваш готовый в тегах сценария, как этот

<script> 

$(document).ready(function() { 
    // do stuff 
}); 

</script> 
+0

'language =" Javascript "' устарел и не должен использоваться, также я не думаю, что у вас должен быть пустой 'src'. –

+0

Это то, что у меня есть (без языкового тега), и оно не работает в IE. Готовая функция также заключена в теги скриптов. – Elie

+0

@Rocket Я не помещал источник, чтобы он мог разместить любой источник, который он хочет, это логично ... – Grigor

0

Попробуйте положить ваши

$(document).ready(function... 

в нижней части кода. Возможно, IE не разобрал код initialize() до вызова вызываемой функции.

+0

Объявление функций [поднято] (http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript -hoisting-explain /) в верхней части их области охвата. –

+0

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

4

Просто у той же проблемы. Почти сломал мой мозг, пытаясь понять, что случилось.

Оказалось, что это очень простой код, который ранее использовался console.log (...), но он не определен в IE, если только инструменты dev не включены.

Исправления просто - либо удалить/комментарий console.log или добавить этот код в один из ваших файлов перед первым console.log используется:

if (typeof console === "undefined"){ 
    console={}; 
    console.log = function(){}; 
} 
+0

это самый простой ответ – mzonerz

0

Написать ниже две линии в верхней части страница.

window.console = window.console || {log:function(){}}; 
    if (typeof console === "undefined"){ 
     console={}; 
     console.log = function(){}; 
    } 

Это решило мою проблему

0

не знает, где я нашел это решение, но это делает работу для моего IE10.

Пример из моего проекта:

var windowOnload = window.onload || function() { 
       $('.toInitiate')[0].click(); 
       $('a').click(function() { 

         if(this.className.indexOf("collapse") == -1) 
         { 
          $('.active').removeClass('active'); 
          $(this).parent().addClass('active'); 
          var className = $(this).parent().attr('class'); 
         } 
        }); 

      }; 

      window.onload = function() { 
       windowOnload(); 
      }; 

Эти коды выполняются после загрузки все содержимое HTML.

-1

Это сработало для меня. Я Заменено

$(document).ready(function... 

с

jQuery(document).ready(function... 
0

Использование (function($) {})(jQuery); исправили проблему для меня.

(function($) { 
    // body code 
})(jQuery);