Question

Lorsque vous exécutez l'exemple suivant avec Firefox 3 :

<html>
 <head>
  <script language="javascript" type="text/javascript">
   <!--
   function openWindow(){
    var w = window.open('', 'otherWin', 'width=600,height=600');
    w.document.write(document.getElementsByTagName("html")[0].innerHTML);
    w.document.close();
    reportLinks(w.document.links);
   }

   function reportLinks(links){
    var report = 'links: '+links.length;
    for (var i=0;i<links.length;i++){
     report += '\n (link='+links[i].href+')';
    }
    alert(report);
   }
  //-->
  </script>
 </head>
 <body>
  <p><a href="javascript: openWindow()">Open Same Content and Show Links Report</a></p>
  <p><a href="javascript: reportLinks(document.links)">Show Links Report</a></p>
 </body>
</html>

Vous verrez que le nombre de liens affichés en cliquant sur « Afficher le rapport sur les liens » et en cliquant sur « Ouvrir le même contenu et afficher le rapport sur les liens » sera de 2.Cependant, lorsque vous avez une référence de fichier JavaScript externe à partir de cette page, le comportement semble différent (créez simplement un fichier vide some.js si vous le souhaitez).Lorsque vous cliquez sur « Ouvrir le même contenu et afficher le rapport sur les liens », le nombre de liens sera de 0.

<html>
 <head>
  <script language="javascript" type="text/javascript" src="some.js"></script>
  <script language="javascript" type="text/javascript">
   <!--
   function openWindow(){
    var w = window.open('', 'otherWin', 'width=600,height=600');
    w.document.write(document.getElementsByTagName("html")[0].innerHTML);
    w.document.close();
    reportLinks(w.document.links);
   }

   function reportLinks(links){
    var report = 'links: '+links.length;
    for (var i=0;i<links.length;i++){
     report += '\n (link='+links[i].href+')';
    }
    alert(report);
   }
  //-->
  </script>
 </head>
 <body>
  <p><a href="javascript: openWindow()">Open Same Content and Show Links Report</a></p>
  <p><a href="javascript: reportLinks(document.links)">Show Links Report</a></p>
 </body>
</html>

Il s'agit probablement du chargement de la page et du moment précis où reportLinks s'est exécuté.Je suppose que le some.js externe est ajouté et que le document n'est pas complètement construit.Existe-t-il un moyen d'enregistrer cet appel reportLinks pour l'événement onload afin de pouvoir être sûr que document.links est complet ?

D'ailleurs, l'exemple fonctionne bien dans les deux cas avec Google Chrome.

(ajouté après la réponse 1)

Comme le suggère Marcel K.J'ai réécrit l'exemple, ajouté également le code comme j'aimerais vraiment que les choses se déroulent.Et maintenant, testez-le, et cet exemple simple semble fonctionner avec Firefox et Chrome.

<html>

 <head>

  <script type="text/javascript" src="some.js"></script>
  <script type="text/javascript">
   <!--
   function openWindow(){
    var w = window.open('', 'otherWin', 'width=600,height=600');
    w.document.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n<html>\n'+
       document.getElementsByTagName("html")[0].innerHTML+'\n</html>');
w.onload=function(){
     reportLinks(w.document.links);
    };
    w.document.close();
   }

   function reportLinks(links){
    var report = 'links: '+links.length;
    for (var i=0;i<links.length;i++){
     report += '\n (link='+links[i].href+')';
    }
    alert(report);
   }
  //-->
  </script>
 </head>
 <body>
  <p><a href="javascript: openWindow()">Open Same Content and Show Links Report</a></p>
  <p><a href="javascript: reportLinks(document.links)">Show Links Report</a></p>
 </body>
</html>

J'avais espéré avec cet exemple simple montrer un cas simple du code réel que j'écris.Un écran d'aperçu avant impression de code HTML compliqué dans lequel je souhaite désactiver tous les hrefs une fois ouverts.Mais dans celui-ci, le gestionnaire onload n'est jamais appelé...Comment puis-je enregistrer un gestionnaire de chargement dans ce cas de la manière la plus robuste ?

Merci beaucoup, Marcel

Était-ce utile?

La solution 2

La seule façon de rendre l'exemple ci-dessus portable sur Firefox, Chrome et IE est d'enregistrer l'écouteur onload via JavaScript intégré dans le HTML chargé dans la fenêtre contextuelle.L'exemple de code suivant montre comment procéder.

<html>
 <head>
  <script type="text/javascript" src="script.js"></script>
 </head>
 <body>
  <p><a href="javascript: openWindow()">Open Same Content and Show Links Report</a></p>
  <p><a href="javascript: reportLinks(document.links)">Show Links Report</a></p>
 </body>
</html>

Cette page utilise un script dans le fichier script.js.Ce qui suit montre le contenu de ce fichier.

function openWindow(){
  var w = window.open('', 'otherWin', 'width=600,height=600');
  w.document.write(
    '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n<html>\n'+
    document.getElementsByTagName("html")[0].innerHTML+
    '\n <script type="text/javascript">\n'+
    '  function addOnloadListener(listener){\n'+
    '    if (window.addEventListener) {\n'+
    '      window.addEventListener("load", listener, false);\n'+
    '    } else {\n'+
    '      window.attachEvent("onload",listener);\n'+
    '    }\n'+
    '  }\n'+
    '  addOnloadListener(function(){reportLinks(document.links);});\n'+
    ' </script>\n'+
    '</html>');
  w.document.close();
}

function reportLinks(links){
  var report = 'links: '+links.length;
  for (var i=0;i<links.length;i++){
    report += '\n (link='+links[i].href+')';
  }
  alert(report);
}

Lorsque vous placez la fonction addOnloadListener directement dans le fichier JavaScript (non intégré dans la page), cela ne fonctionne pas dans IE6 car, je crois, il ne peut pas gérer correctement l'ordre des entrées de script.Lorsque addOnloadListener n'était pas intégré, l'appel intégré à addOnloadListener ne fonctionnait pas, il ne pouvait tout simplement pas trouver la fonction dans la version précédente :

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

Le code n’est qu’un exemple simple qui ne fait pas grand-chose.Je l'ai utilisé pour désactiver tous les liens dans une page contextuelle d'aperçu avant impression.

Un moyen plus simple d'enregistrer un écouteur onload pour une fenêtre contextuelle portable sur un navigateur est toujours la bienvenue.

Merci, Marcel

Autres conseils

Comme je l'ai dit dans un commentaire, c'est un problème très étrange.Mais je pense que cela se produit parce que l'inclusion d'un script externe entraîne un retard dans le rendu de la page (de la nouvelle page) et que son DOM n'est peut-être pas prêt à être inspecté.

Mes soupçons sont étayés par le fait que l'ajout du (nouveau) defer l'attribut semble résoudre ce problème :

Cet attribut booléen est défini pour indiquer à un navigateur que le script est destiné à être exécuté une fois le document analysé.

Le defer L'attribut peut être défini sur la page d'origine, car vous souhaitez en obtenir une copie exacte.Vous pouvez le définir si l'endroit où un script est inclus n'a pas d'importance (par exemple, lors de l'utilisation de document.write dans votre fichier inclus, il fait peu importe l'endroit où vous l'incluez).

Comme defer est un attribut booléen, il est activé quand il est simplement présent (defer) ou (lors de l'utilisation de XHTML) défini sur lui-même (defer="defer").Dans votre cas, l'inclusion du script se lirait :

<script type="text/javascript" src="some.js" defer></script>

Mise à jour concernant votre mise à jour :vous devez toujours insérer un Doctype dans la page principale (pensez à utiliser le HTML 5 un).

Et je pense que la façon dont tu as attaché ton onload l'événement est le mieux que vous puissiez faire.

Mais compte tenu de l’objectif que vous souhaitez atteindre (un aperçu avant impression sans hyperliens) :vous pouvez également utiliser le "print" media attribut et stylisez les hyperliens comme le texte ;c'est chemin plus simple que ce que vous faites et cela fonctionne lorsque JavaScript est désactivé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top