2012-01-13 33 views
6

Aparentemente muchas personas se han encontrado con este problema, pero todavía no he podido encontrar una solución que funcione.IE La función JQuery ready no funciona

que tienen un poco de código que necesita para funcionar una vez que la página se ha cargado, y así me lo metió dentro del bloque siguiente:

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

Esto funciona bien en todos los navegadores, con la excepción de IE. Allí, el código no se ejecuta en absoluto.

Este código está en el punto más bajo de la página que puedo poner (usar Zend Framework y las funciones de página específica listadas() significa que hay un límite de qué tan bajo puede ir en la página). He comprobado la incluye en los archivos js, todos los cuales están siendo cargados desde una versión local, y todos ellos tienen la forma

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

¿Alguna idea?

NOTA

Al abrir el depurador en el IE, esto empieza a funcionar correctamente.

+0

¿Qué contiene "..más código aquí"? – ShankarSangoli

+1

No pase una cadena a 'setTimeout'. – SLaks

+0

¿Está vacío su 'src', que está causando problemas. Supongo que le diste una URL real, ¿verdad? –

Respuesta

10

No veo nada malo aquí, pero hay sólo algunas cosas que me gustaría señalar

Antes de hacerlo, compruebe la consola JavaScript de IE, supongo que una secuencia de comandos anterior tiene un error, y es por eso que esta nunca se ejecuta.

En lugar de $(document).ready(function(){});, puede simplemente hacer $(function(){}). no debería hacer la diferencia, sin embargo.

Además, no pase cadenas a setTimeout (reciben eval 'd en el ámbito global), pase una función.

setTimeout(initialize, 200); 

Además, ¿está seguro de que declaró $jquery (¿no debería ser $.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: Si está utilizando Internet Explorer 8 o inferior, no se le añade console a menos que el depurador está abierto (deseo Quien pensó que era una buena idea ha sido despedido). Si uno de tus includes usa console.log sería undefined, deteniendo así la ejecución de todos los scripts.

Trate de añadir esto a la parte superior de la página:

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

Se hará una "falsa" console objeto, de manera que se definirá console.log.

+0

Actualicé setTimeout de la manera que sugirió, y reemplacé $ jquery con $, pero no funcionó. Agregué una alerta() antes de la primera llamada para inicializar, y no se desencadena en IE. – Elie

+0

@Elie: compruebe la consola, tal vez un script anterior está muriendo.No hay nada en este script que cause que el evento 'ready' no se active. –

+0

Impar: cuando enciendo el depurador, ¡funciona bien! – Elie

-1

hago siempre

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

y funciona

también envolver su lista de etiquetas de script como este

<script> 

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

</script> 
+0

'language =" Javascript "' está en desuso, y no debe usarse, tampoco creo que deba tener un 'src' vacío. –

+0

Eso es lo que tengo (sin la etiqueta de idioma) y no funciona en IE. La función de listo también se incluye dentro de las etiquetas de script. – Elie

+0

@Rocket No puse la fuente para que pueda poner cualquier fuente que desee, es lógico ... – Grigor

0

trate de poner su

$(document).ready(function... 

en la parte inferior del código. Podría ser que IE no haya analizado el código initialize() antes de llamar a la función preparada.

+0

Las declaraciones de funciones son [hoisted] (http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript -hoisting-explain /) a la parte superior de su ámbito de aplicación –

+0

Como mencioné en la pregunta, los guiones están tan abajo en el archivo como puedo ponerlos, pero debido al marco, en realidad no pueden estar en el Sin embargo, las secuencias de comandos están más abajo en el archivo de cualquier elemento que afecten. – Elie

4

Acabo de tener el mismo problema. Casi rompí mi cerebro tratando de descubrir qué pasaba.

Convertido para ser muy simple - algún código que se ejecutó anteriormente usó console.log (...), pero no está definido en IE a menos que las herramientas de desarrollo estén habilitadas.

La solución es simple - ya sea quitar/comentario console.log o añadir este código a uno de sus archivos antes de la primera console.log se utiliza:

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

esta es la respuesta más simple – mzonerz

0

escriba debajo de dos líneas en la parte superior de la página.

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

Esto resolvió mi problema

0

no saben dónde he encontrado esta solución, pero esto funciona para mi IE10.

Un ejemplo de mi proyecto:

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

Estos códigos son ejecutados después de cargar todo el contenido HTML.

-1

Esto funcionó para mí. He sustituido

$(document).ready(function... 

con

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

Usando (function($) {})(jQuery); ha solucionado el problema para mí.

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