web-dev-qa-db-fra.com

window.onload () ne déclenche pas avec IE 8 au premier coup

J'essaie de faire fonctionner mes pages correctement avec IE 8, j'ai découvert d'ici: http://www.masykur.web.id/post/How-to-Make-Our-Website-to -be-Ready-for-IE8.aspx , ma page doit être conforme à XHTML 1.0 et conforme à CSS 2.1, j'ai rendu ma page et CSS compatibles avec seulement quelques avertissements, mais toujours window.onload () ne tire pas. Est-ce que quelqu'un a rencontré ce problème?

voici l'extrait de code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=8"/>
        <title>Testing</title>
        <link rel="stylesheet" href="test.css" type="text/css"></link>
        <script type="text/javascript" src="login.js"></script>
        <script type="text/javascript" src="common.js"></script>
        <script type="text/javascript">
            window.onload = function()
            {
                          // Not coming here at all on first shot   
            }
        </script>
    </head>
    <body>
     .
     .
     .

Cependant, rafraîchir la page semble le faire fonctionner.

Est-ce que j'ai râté quelque chose?

METTRE À JOUR:

Un des addons IE a créé ce problème, après l'avoir désactivé. Merci pour votre temps et vos réponses :)

26
Manohar

Pour IE, essayez:

window.onload = new function() { alert('hello');};
27
George

C'est un très vieux fil, mais j'ai trouvé une solution qui pourrait aider les autres.

J'ajoutais une fonction à window.onload via un script injecté dynamiquement (vraiment pour imiter une charge de script externe pour des raisons qui ne sont pas importantes dans ce contexte). Comme indiqué dans ce post, lors du premier chargement dans IE8, le window.onload ne se déclencherait pas, mais tous les appels suivants le seraient.

J'ai découvert que si je mettais cela dans le fichier HTML en tant que script interne, cela fonctionnerait à chaque fois:

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

Tout le code ci-dessus est "initialise" le window.onload d'IE8 de manière discrète. Je suppose que IE8 ne parvient pas à déclencher window.onload la première fois s'il est appelé à partir d'un script externe car l'événement onload n'est pas encore lié à window (ou en termes techniques, son typeof n'est pas défini). Il semble que ce soit la première fois que IE8 fasse cela: attacher onload à window sans l'exécuter correctement.

Le code ci-dessus devient alors assez évident: nous forçons simplement IE8 à reconnaître l'événement onload. Nous ne nous soucions pas de ce qui est exécuté ou de ce qui ne l’est pas, nous nous assurons donc simplement de passer à travers tout code window.onload existant qui est déjà défini (juste par précaution).

Il est important que ce soit un script interne au HTML (du moins d'après mes tests).

Votre HTML ressemblerait donc à quelque chose comme ceci (les parties pertinentes):

 <script type="text/javascript">
  var windowOnload=window.onload||function(){};window.onload=function(){windowOnload();};
 </script>
 <script type="text/javascript" src="script.js">
 </script>

À partir de mes tests, après avoir vidé le cache et rechargé la page, j'ai obtenu que window.onload se déclenche correctement à chaque fois. 

J'espère que ça aide.

9
Milan Adamovsky

Vous pourriez avoir une erreur dans votre JavaScript, si cela se produit, tout JavaScript après cela ne fonctionnera pas correctement.

Essayez de supprimer la référence à login.js et common.js et essayez une alerte dans le cadre de votre fonction problématique.

3
Ólafur Waage

Je n'ai pas d'IE8 à tester personnellement, mais à quoi sert ce test?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test IE 8</title>
<script type="text/javascript">
/* <![CDATA[ */
window.onload = function(){alert('Good morning!');}
/* ]]> */
</script>
</head>
<body>
<h1>Hello</h1>
<body>
</html>

Si ce test fonctionne comme prévu, essayez le bit CDATA autour de votre bloc JavaScript interne. 

Et puis, si cela ne fonctionne pas comme prévu, il y a probablement quelque chose dans le code JavaScript externe au-dessus qui empêche votre charge de se décharger. L’affiche précédente a mentionné cela. À ce stade, essayez votre console d’erreur ou votre débogueur pour indiquer le chemin.

3
Fran Corpier

onload se déclenche après que TOUT votre contenu ait été chargé (y compris les images externes, etc.). Il est possible que le chargement de ces ressources prenne beaucoup de temps dès le premier essai (avant leur mise en cache). Une autre possibilité est une erreur dans votre code qui affecte uniquement IE, tout comme l’arrêt de vos scripts (mais la première fois seulement est étrange).

1
SpliFF

Le code suivant fonctionne pour moi. Lorsque je charge la page dans Firefox, je vois l'alerte instantanément. La première fois que je charge la page dans IE 8, cela me met en garde contre le contenu actif. Si j'autorise le contenu bloqué, il me demande de confirmer, ce que je fais. Ensuite, l'alerte apparaît comme prévu. Si cela ne fonctionne pas pour vous, essayez IE 8 sur un autre ordinateur ou commencez à éliminer le code de votre page pour vérifier la présence d'erreurs. Vous pouvez faire une recherche binaire: commentez la première moitié de la page et voyez si l'alerte apparaît; si ce n'est toujours pas le cas, décommentez la première moitié et commentez la seconde moitié. Répétez au besoin jusqu'à ce que vous ayez réduit le code incriminé. Incidemment, vous n'avez pas besoin de XHTML pour la conformité à IE8. Le langage HTML fonctionne bien et présente certains avantages.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=8"/>
    <title></title>
    <style type="text/css">
    </style>
    <script type="text/javascript">
    window.onload=function() { alert('hello');};
    </script>
  </head>
  <body>
  </body>
</html>

Vieille question mais j'avais le même problème, mais il s'est avéré que c'était un autre problème. Mon problème était que j'ai <script type="application/javascript"> lequel <IE9 ne comprend pas ou n'essaie pas de courir même. Pour que cela fonctionne avec les navigateurs plus anciens, vous devez toujours utiliser text/javascript même si techniquement ce n'est pas le bon type ...

0
OZZIE

Si vous obtenez des résultats différents en utilisant Apache par rapport à un autre serveur Web (IIS?) Et en comparant le résultat final à l'aide de IE8, la différence doit figurer dans l'en-tête de type de contenu envoyé. Obtenez l'utilitaire wget pour votre plate-forme et consultez les en-têtes produits. Si vous êtes sous Windows, la version de la version pour applications portables de l'interface graphique wget est plutôt jolie.

0
Tony Miller

Je sais que c'est une question un peu ancienne, mais je viens de faire face à la même chose. 

 window.onload=function() { alert('hello');};

est traité différemment de 

 window.onload= new function() { alert('hello');};

Le mot clé ici est new

Mon JS se terminait chaque fois qu'il atteignait (onload =) jusqu'à ce que j'ajoute le mot «nouveau» avant «fonction». Même si cela a bien fonctionné sans «nouveau» dans mon hôte local, mais une fois que je l'ai mis en ligne, cela ne fonctionne pas tant que je n'ai pas ajouté «nouveau». 

0
Mohammed Joraid