Domanda

Quando si esegue la seguente esempio di utilizzo di 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>

Vedrete che sia il numero dei link visualizzati quando si fa clic su "Vedi i Link Report' come quando si fa clic su "Apri Stesso Contenuto e Vedi Link il Report" sarà 2.Tuttavia, quando si dispone di un file JavaScript esterno di riferimento da questa pagina il comportamento sembra diverso (basta fare un file vuoto some.js se si desidera).Cliccando su "Apri Stesso Contenuto e Mostra Collegamenti Relazione:" il numero di link sarà 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>

Probabilmente è una questione di caricamento della pagina e il momento che reportLinks eseguito esattamente.Presumo che l'esterno some.js viene aggiunto che il documento non è completamente costruire.C'è un modo che posso registrare questo reportLinks chiamata per l'evento onload in modo che io possa essere sicuro di quel documento.link è completa?

Dal modo in cui l'esempio funziona bene in entrambi i casi con Google Chrome.

(aggiunto dopo answer1)

Come suggerito da Marcel K.Ho riscritto esempio, si aggiunge anche il codice che il modo in cui mi piacerebbe davvero avere la cosa di andare.E ora il collaudo, e questo semplice esempio sembra funzionare con Firefox e con 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>

Avevo sperato con questo semplice esempio per mostrare un semplice caso il codice sto scrivendo.Un anteprima di stampa dello schermo di complicato html in cui voglio disabilitare tutti href una volta aperto.Ma quello è un gestore onload non viene mai chiamato...Come posso registrare un gestore onload in questo caso in più robusta?

Molte grazie, Marcel

È stato utile?

Soluzione 2

L'unico modo che ho potuto fare l'esempio di cui sopra il lavoro portatile su Firefox, Chrome e IE è da registrare l'onload ascoltatore attraverso inline JavaScript nel codice HTML caricato nella finestra a comparsa.Esempio di codice seguente mostra come.

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

Questa pagina utilizza uno script in script.js file.Seguente mostra il contenuto del file.

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

Quando mettere la funzione addOnloadListener direttamente nel file JavaScript (non allineate nella pagina) non funziona in IE6 perché, credo, non è possibile gestire l'ordine delle voci di script correttamente.Quando addOnloadListener non allineate l'inline chiamata a addOnloadListener non funziona, semplicemente non riusciva a trovare la funzione in precedenza:

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

Il codice è solo un semplice esempio che in realtà non molto.L'ho utilizzato per la disattivazione di tutti i link in un anteprima di stampa pagina popup.

Un modo più semplice per registrare un onload ascoltatore per una finestra di popup portatile tramite browser è sempre il benvenuto.

Grazie, Marcel

Altri suggerimenti

Come ho detto in un commento, questo è molto strano problema.Ma penso che questo accade perché l'inserimento di uno script esterno che causa un ritardo nel rendering della pagina (la pagina) e la sua DOM potrebbe non essere pronto a ispezionare.

Il mio sospetto è supportata dal fatto che l'aggiunta del (nuovo) defer attributo sembra risolvere questo problema:

Questo attributo Booleano che indica al browser che lo script è pensato per essere eseguito dopo che il documento è stato analizzato.

Il defer attributo può essere impostato sulla pagina originale, come si desidera una copia esatta.È possibile impostare se non importa dove uno script è incluso (per esempio, quando si utilizza document.write nel file incluso si non importa in quale luogo si include).

Come defer è un attributo Booleano, è attivato quando è semplicemente presente (defer) o (quando l'uso di XHTML) insieme a se stesso (defer="defer").Nel vostro caso, l'inclusione di script voglia di leggere:

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

Aggiornamento per quanto riguarda l'aggiornamento:si deve ancora inserire un Doctype nella pagina principale (si consideri che utilizza il HTML 5).

E penso che il modo in cui è collegato il onload l'evento è il migliore che si può fare.

Ma considerando l'obiettivo che si vuole raggiungere (un anteprima di stampa senza collegamenti ipertestuali):è inoltre possibile utilizzare la funzione "stampa" media attributo e i collegamenti ipertestuali stile di testo;che modo più facile che la cosa si sta facendo e funziona quando JavaScript è disabilitato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top