2012-01-13 47 views
6

Podobno wiele osób napotkało ten problem, ale muszę jeszcze znaleźć rozwiązanie, które działa.Funkcja IE JQuery nie działa

Mam kawałek kodu, który potrzebuje do uruchomienia po załadowaniu strony, a więc Wsadziłem go wewnątrz następnego bloku:

$(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); 
    } 
} 

To działa prawidłowo we wszystkich przeglądarkach z wyjątkiem IE. Tam kod w ogóle się nie uruchamia.

Ten kod znajduje się w najniższym punkcie strony, na której mogę go umieścić (za pomocą Zend Framework i funkcji ready() specyficznych dla strony oznacza, że ​​istnieje limit, jak niski może być na stronie). Sprawdziłem includes dla plików js, które są ładowane z lokalnej wersji, a wszystkie one mają formę

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

Jakieś pomysły?

UWAGA

Gdy otwieram debuggera w IE, to zaczyna działać poprawnie.

+0

Co zawiera "..więcej kod tutaj"? – ShankarSangoli

+1

Nie należy przekazywać ciągu znaków do 'setTimeout'. – SLaks

+0

Czy twój 'src' jest pusty, to powoduje problemy. Zakładam, że podałeś prawdziwy URL, prawda? –

Odpowiedz

10

nie widzę nic złego tutaj, ale są po prostu kilka rzeczy, które chciałbym wskazać.

Zanim to zrobię, sprawdź konsolę JavaScript IE, domyślam się, że wcześniejszy skrypt zawiera błąd i dlatego ten nigdy się nie uruchamia.

Zamiast $(document).ready(function(){});, można po prostu zrobić $(function(){}). jednak nie powinno to mieć znaczenia.

Ponadto, proszę nie przekazywać ciągów do setTimeout (otrzymują eval 'd w zasięgu globalnym), przekazać funkcję.

setTimeout(initialize, 200); 

Ponadto, jesteś pewna, że ​​zadeklarowane $jquery (nie powinno być $.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: Jeśli używasz IE8 lub niższy, nie dodawać console chyba debugger jest otwarty (Żałuję, kto myślał, że to dobry pomysł został zwolniony). Jeśli jeden z twoich włączeń używa console.log, będzie to undefined, zatrzymując w ten sposób wykonywanie wszystkich skryptów.

warto dodać to do góry strony:

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

To sprawi, że „fałszywy” console obiektu, tak że console.log zostaną zdefiniowane.

+0

Zaktualizowałem setTimeout tak, jak sugerowałeś, i zastąpiłeś $ jquery przez $, ale to nie zadziałało. Dodałem alert() przed pierwszym wywołaniem, aby zainicjować, i nie jest on wyzwalany w IE. – Elie

+0

@Elie: Sprawdź konsolę, może wcześniejszy skrypt umiera.W tym skrypcie nie ma nic, co powodowałoby, że zdarzenie "ready" nie powodowało wyzwalania. –

+0

Nieparzyste - po włączeniu debuggera działa dobrze! – Elie

-1

zawsze robię

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

i działa

również owinąć gotowy w tagach skryptu jak ten

<script> 

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

</script> 
+0

'language =" Javascript "' jest przestarzałe i nie powinno być używane, także nie sądzę, że powinieneś mieć puste 'src'. –

+0

To jest to, co mam (bez tagu języka) i nie działa w IE. Gotowa funkcja jest również zawijana wewnątrz znaczników skryptu. – Elie

+0

@Rocket Nie umieściłem źródła, aby mógł umieścić dowolne źródło, które chce, jest logiczne ... – Grigor

0

Spróbuj oddanie

$(document).ready(function... 

w dolnej części kodu. Możliwe, że IE nie przeanalizował kodu initialize() przed wywołaniem funkcji gotowości.

+0

Deklaracje funkcji są [wciągane] (http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript -wyżej objaśniony /) na czele ich obejmującego zakresu –

+0

Jak już wspomniałem w pytaniu - skrypty są tak daleko w pliku, jak tylko mogę je umieścić, ale z powodu ram, nie mogą one być w rzeczywistości u dołu, ale skrypty znajdują się w dalszej części pliku z dowolnego elementu, na który wpływają. – Elie

4

Po prostu miał ten sam problem. Prawie złamałem mój mózg, próbując dowiedzieć się, co jest nie tak.

Okazuje się, że jest bardzo prosty - kod, który jest wykonywany wcześniej użyty console.log (...), ale nie jest zdefiniowany w IE, chyba że włączone są narzędzia deweloperskie.

Rozwiązaniem jest prosty - albo usunąć/komentarz console.log lub dodać ten kod do jednego ze swoich plików przed pierwszym console.log jest używany:

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

to jest najprostsza odpowiedź – mzonerz

0

wpisz poniżej dwóch linii na górze Strona.

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

to rozwiązać mój problem

0

nie wiem, gdzie znalazłem to rozwiązanie, ale to działa na moim IE10.

Przykład z mojego projektu:

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(); 
      }; 

Kody te są wykonywane po załadowaniu całej zawartości HTML.

-1

To zadziałało dla mnie. Wymieniłem

$(document).ready(function... 

z

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

Korzystanie (function($) {})(jQuery); naprawił problem dla mnie.

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