14

Actualmente estoy recibiendo un error dentro del código FacePile de Facebook, y estoy desconcertado por la causa.'Fecha' no está definida en IE9 en javascript cargado por FacePile

facepile.php carga un script que, entre otras cosas, tiene estas líneas (cuando se imprime bastante-):

... 
o = document.createElement('script'); 
o.src = l[n]; 
o.async = true; 
o.onload = h; 
o.onreadystatechange = function() { 
    if (o.readyState in c) { 
    h(); 
    o.onreadystatechange = null; 
    } 
}; 
d++; 
a.appendChild(o); 
... 

(un document.body ==, d ++ es irrelevante aquí)

Este código carga un script con src = http://static.ak.fbcdn.net/rsrc.php/v1/yW/r/pmR8u_Z_9_0.js o algo igualmente críptico (el nombre del archivo cambia ocasionalmente).

En ese guión, existen estas líneas en la parte superior (también cuando muy impresos):

/*1331654128,176820664*/ 

if (window.CavalryLogger) { 
    CavalryLogger.start_js(["\/8f24"]); 
} 

window.__DEV__ = window.__DEV__ || 0; 
if (!window.skipDomainLower && document.domain.toLowerCase().match(/(^|\.)facebook\..*/)) 
    document.domain = window.location.hostname.replace(/^.*(facebook\..*)$/i, '$1'); 
function bagofholding() { 
} 
function bagof(a) { 
    return function() { 
    return a; 
    }; 
} 
if (!Date.now) 
    Date.now = function now() { 
    return new Date().getTime(); 
    }; 
if (!Array.isArray) 
    Array.isArray = function(a) { 
    return Object.prototype.toString.call(a) == '[object Array]'; 
    }; 
... 

Y estoy recibiendo un error que dice "SCRIPT5009: 'Date' no está definido", justo en la parte if (!Date.now). La depuración cerca de ese punto revela que Date, Array, Object, Function, etc. no están definidos.

Er ... ¿cómo? window existe, al igual que document (aunque document.body es nulo) y un puñado de otros, pero muchos de los objetos predefinidos no lo son. Las versiones anteriores de IE no parecen tener este problema, ni tampoco otros navegadores, pero varias máquinas que ejecutan IE9 (incluida una VM limpia) tienen el mismo problema.

Dudo que pueda hacer algo al respecto, pero estoy muy curioso cómo está sucediendo esto/cuál es el problema subyacente. ¿Alguien sabe, o pueden señalarme algo que podría ayudar?

- edit:

Antes de la publicación de esta pregunta, que había encontrado en este sitio: http://www.guypo.com/technical/ies-premature-execution-problem/

Aunque parecía (y aún lo hace) que podría ser el origen del problema, no puedo t replicarlo bajo cualquier circunstancia menor. Todas las combinaciones que he intentado todavía tienen definida la fecha, etc. lo que no es demasiado sorprendente, ya que de lo contrario, estoy seguro de que otros verían muchos más problemas con IE.

+0

Objetos incorporados como Fecha, Matriz, etc. siempre deben estar disponibles en el contexto global. ¿Cómo se puede ejecutar una función si no hay un constructor de funciones? Extraño tema de hecho. – RobG

+0

intente sin "o.async = true;" –

+0

No puedo, esto está en el código de Facebook, y no he podido reproducirlo con ninguno de los míos (aunque no he intentado duplicarlo todo, puedo hacerlo más adelante). A menos que IE9 tenga alguna manera de editar el javascript que se está ejecutando actualmente. – Groxx

Respuesta

1

Si avanza con un depurador de javascript en el primer punto, se ejecuta cualquier JS. Al mismo tiempo, agregue un reloj para Date/Array, etc., y tenga en cuenta cuando va a null. Puede ser lento y laborioso, pero no veo por qué no funcionaría.

+0

No están definidos antes de que se ejecute la primera línea, y solo en el script cargado (no en los otros scripts en la página). – Groxx

+0

Si eso está garantizado, entonces suena como un error de análisis de JavaScript o algún tipo de error tipográfico. ¿Cómo sabes que Know js se ha ejecutado? –

+0

Llega al punto de interrupción. Es muy probable que sea un error de navegador, es extraño que solo lo haya visto en ese archivo. – Groxx

1

Es posible que desee intentar agregar el script en una función document.ready. En otras palabras, asegúrese de que la secuencia de comandos FB se procesa solo después de que DOM esté listo. Pero, basado en el enlace que le das a Guy's Pod (gran artículo, por cierto), parece que tienes razón en la afirmación de que IE está descargando y ejecutando el script pre-maduro (de ahí mi sugerencia de agregar un contenedor para que solo se ejecuta después del evento listo para DOM). Es probable que IE9 esté protegiendo el script de ejecución (fuera del alcance del documento/ventana).

Cuestiones relacionadas