Pregunta

Al ejecutar siguiente ejemplo usando 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>

Se verá que tanto el número de enlaces que aparecen al hacer clic en 'Mostrar vínculos Report' como cuando se hace clic en 'Abrir mismo contenido y Mostrar vínculos Informe' será 2. Sin embargo al tener una referencia de archivo JavaScript externo de esta página de la comportamiento parece diferente (acaba de hacer un archivo vacío some.js si lo desea). Cuando haciendo clic en 'Abrir mismo contenido y Mostrar vínculos Informe' el número de enlaces serán 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>

Es probablemente una cuestión de carga de la página y el momento en que reportLinks ejecutados exactamente. Asumo que el some.js externa se añade que el documento no se construye por completo. ¿Hay alguna manera de que puedo registrar este reportLinks piden proceso de carga de modo que pueda estar seguro de que document.links es completa?

Por cierto, el ejemplo funciona bien en ambos casos con Google Chrome.

(añadido después de answer1)

Como sugerido por Marcel K. me volvió a escribir el ejemplo, añadido también el código de la forma en que realmente me gustaría tener la cosa va. Y ahora probándola, y este sencillo ejemplo, parece que funciona con Firefox y 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>

Me había esperado con este sencillo ejemplo para mostrar un simple caso del código real que estoy escribiendo. Una pantalla de presentación preliminar de HTML complicado en el que yo quiero para desactivar todas las hrefs una vez abierto. Pero en la que un controlador onload no se llama ... ¿Cómo puedo registrar un manejador onload en este caso, de la manera más robusta?

Muchas gracias, Marcel

¿Fue útil?

Solución 2

La única manera de que pudiera hacer que el ejemplo anterior de trabajo portátil sobre Firefox, Chrome y IE es mediante el registro del oyente proceso de carga a través de JavaScript inline en el HTML cargado en la ventana emergente. Muestra el código siguiente ejemplo cómo.

<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>

Esta página utiliza una secuencia de comandos en el archivo script.js. Continuación se muestra el contenido de ese archivo.

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

Al poner el addOnloadListener función directamente en el archivo JavaScript (no inline en la página) no funciona en IE6 porque, creo, no puede manejar el orden de las entradas de secuencia de comandos correctamente. Cuando addOnloadListener no se inlined la llamada inline a addOnloadListener no funcionó, simplemente no pudo encontrar la función en el anterior:

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

El código sólo es un ejemplo sencillo que en realidad no hace mucho. Lo utilicé para desactivar todos los enlaces en una página de vista previa de impresión emergente.

Una forma más sencilla para registrar un detector proceso de carga de un navegador portátil sobre ventana emergente es siempre bienvenido.

Gracias, Marcel

Otros consejos

Como dije en un comentario, este es un tema muy extraño. Pero creo que se debe a la inclusión de un script externo provoca un retraso en la renderización de páginas (de la nueva página) y su DOM podría no estar listo para inspeccionar.

Mi sospecha es apoyada por el hecho de que la adición de la (nueva) defer atributo parece resolver este problema:

  

Este atributo booleano se establece para indicar a un navegador que el guión está destinado a ser ejecutado después de que el documento ha sido analizada.

El atributo defer se puede configurar en la página original, como desea una copia exacta de la misma. Se puede establecer que si no lo hace independientemente de dónde se está incluyendo un guión (por ejemplo, cuando se utiliza document.write en su archivo incluido que hace asunto en el que el lugar de incluirlo).

Como defer es un atributo booleano, se activa cuando está simplemente presente (defer) o (cuando se utiliza XHTML) conjunto a sí mismo (defer="defer"). En su caso, la inclusión de la escritura sería el siguiente:

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

Actualizar con respecto a su actualización aún debe insertar un tipo de documento en la página principal (considerar el uso de la HTML 5 uno).

Y creo que la forma en que une su evento onload es lo mejor que puede hacer.

Pero teniendo en cuenta el objetivo que quiere lograr (una vista previa de impresión sin hipervínculos): también puede utilizar la opción "Imprimir" atributo media y estilo hipervínculos como texto; que de manera más fácil de lo que están haciendo y funciona cuando JavaScript no está habilitado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top