14 votes

La date n'est pas définie dans IE9 dans le javascript chargé par FacePile.

J'obtiens actuellement une erreur dans le code FacePile de Facebook, et je suis perplexe quant à sa cause.

facepile.php charge un script qui, entre autres choses, a ces lignes (lorsqu'elles sont joliment imprimées) :

...
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);
...

(a == document.body, d++ n'est pas pertinent ici)

Ce code charge un script avec src = http://static.ak.fbcdn.net/rsrc.php/v1/yW/r/pmR8u_Z_9_0.js ou quelque chose d'aussi cryptique (le nom du fichier change de temps en temps).

Dans ce script, il y a ces lignes tout en haut (également lorsqu'elles sont joliment imprimées) :

 /*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]';
  };
...

Et je reçois une erreur qui dit "SCRIPT5009 : 'Date' is undefined", juste à l'endroit où se trouve l'erreur. if (!Date.now) portion. Le débogage près de ce point révèle que Date , Array , Object , Function etc. sont tous indéfinis.

Euh... comment ? window existe, tout comme document (bien que document.body est nulle) et une poignée d'autres, mais beaucoup d'objets prédéfinis ne le sont pas. Les versions antérieures d'IE ne semblent pas avoir ce problème, ni aucun autre navigateur, mais plusieurs machines exécutant IE9 (y compris une VM propre) ont toutes le même problème.

Je doute de pouvoir y faire quelque chose, mais je suis très Je suis curieux de savoir comment cela se produit / quel est le problème sous-jacent. Quelqu'un le sait-il, ou peut-il m'indiquer quelque chose qui pourrait m'aider ?

-- modifier :

Avant de poster cette question, j'avais trouvé ce site : http://www.guypo.com/technical/ies-premature-execution-problem/

Alors qu'il semblait (et il semble toujours) que ce soit la source du problème, je ne peux pas le reproduire dans de plus petites circonstances. Toutes les combinaisons que j'ai essayées ont toujours Date, etc. définis ; ce qui n'est pas trop surprenant, car sinon, je suis sûr que d'autres personnes verraient beaucoup plus de problèmes avec IE.

1voto

Lee Taylor Points 3732

Si vous passez à travers avec un débogueur javascript au premier point où tout JS est exécuté. En même temps, ajoutez une montre pour Date/Array etc. et notez quand elle devient nulle. Cela peut être lent et laborieux mais je ne vois pas pourquoi cela ne fonctionnerait pas.

1voto

Joe Johnson Points 1025

Vous pouvez essayer d'ajouter le script dans une fonction document.ready. En d'autres termes, faites en sorte que le FB script ne soit traité qu'une fois le DOM prêt. Mais, d'après le lien que vous donnez à Guy's Pod (excellent article, d'ailleurs), il semble que vous ayez raison d'affirmer qu'IE télécharge et exécute le script prématurément (d'où ma suggestion d'ajouter un wrapper pour qu'il ne s'exécute qu'après l'événement DOM ready). IE9 est probablement en train de mettre en sandbox l'exécution du script (en dehors de la portée du document/de la fenêtre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X