Frage

Wenn Sie folgendes Beispiel ausführen mit 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>

Sie werden sehen, dass sowohl die Anzahl der Links angezeigt, wenn Sie ‚Links Bericht‘ wie das Klicken, wenn sie auf ‚Open Same Inhalt und Termine Links Report‘ klicken 2. Allerdings wird, wenn die auf dieser Seite eine externe JavaScript-Datei Referenz mit dem Verhalten scheint anders (nur eine leere Datei machen some.js wenn Sie möchten). Beim Klicken auf ‚Öffnen Gleicher Inhalt und Termine Links Report‘ werden die Anzahl der Links 0 sein.

<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 ist wohl eine Frage des Ladens die Seite und in dem Moment, dass reportLinks genau ausgeführt. Ich gehe davon aus, dass die externe some.js hinzugefügt wird, dass das Dokument nicht vollständig aufbauen wird. Gibt es eine Möglichkeit, dass ich diese reportLinks ruft für Onload-Ereignis registrieren kann, damit ich sicher sein kann, dass document.links abgeschlossen ist?

Durch die Art und Weise des Beispiel funktioniert in beiden Fällen mit Google Chrome.

(zugegeben nach answer1)

Wie vorgeschlagen von Marcel K. mir das Beispiel neu geschrieben, fügte auch den Code so, wie ich mag wirklich die Sache gehen müssen. Und jetzt testet es, und dieses einfache Beispiel scheint zu funktionieren mit Firefox und mit 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>

hatte ich mit diesem einfachen Beispiel zu hoffen, einen einfachen Fall von dem eigentlichen Code zu zeigen, dass ich schreibe. Ein Druckvorschau-Bildschirm von kompliziertem HTML, in denen möchte ich alle hrefs deaktivieren einmal geöffnet. Aber in dieser eine der onload-Handler nie aufgerufen wird ... Wie kann ich ein onload-Handler in diesem Fall in der robusteste Art und Weise registrieren?

Vielen Dank, Marcel

War es hilfreich?

Lösung 2

Die einzige Art, wie ich das obige Beispiel Arbeit ist tragbar über Firefox, Chrome und IE machen könnte den onload Zuhörer durch inlined JavaScript in HTML durch die Registrierung im Popup-Fenster geladen. Folgende Beispielcode zeigt, wie.

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

Diese Seite verwendet ein Skript in script.js Datei. Nach zeigt den Inhalt dieser Datei.

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

Wenn Sie die Funktion addOnloadListener direkt in der Datei JavaScript setzt (nicht in der Seite inlined) es funktioniert nicht in IE6, weil ich glaube, es kann nicht die Reihenfolge der Skripteinträge richtig handhaben. Wenn addOnloadListener nicht den inlined Anruf inlined wurde addOnloadListener nicht funktioniert hat, es konnte einfach nicht die Funktion in dem früheren finden:

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

Der Code ist nur ein einfaches Beispiel, das nicht wirklich viel zu tun. Ich benutzte es, alle Links in einer Druckvorschau popup zu deaktivieren.

Ein einfacher Weg, um einen onload Listener für einen Popup-Fenster portable über Browser registrieren ist immer willkommen.

Danke, Marcel

Andere Tipps

Wie ich in einem Kommentar sagte, ist dies eine sehr seltsame Frage. Aber ich denke, es geschieht, weil die Einbeziehung eines externen Skript eine Verzögerung bei der Seitendarstellung verursacht (der neuen Seite) und dessen DOM möglicherweise nicht bereit sein, zu überprüfen.

Mein Verdacht wird durch die Tatsache gestützt, dass das Hinzufügen der (neu) defer Attribut scheint dieses Problem zu lösen:

Dieses Boolean Attribut wird auf einen Browser, um anzuzeigen, dass das Skript ausgeführt werden soll ist , nachdem das Dokument analysiert wurde.

Das defer Attribut kann auf der Originalseite eingestellt werden, da Sie eine exakte Kopie davon wollen. Sie können es, wenn es keine Rolle, wo ein Skript enthalten wird (zum Beispiel, wenn in Ihrer Datei enthalten mit document.write es hat Frage an welcher Stelle Sie es enthalten).

Als defer ist ein Boolean-Attribut, es aktiviert ist , wenn es einfach vorhanden ist (defer) ist oder Set selbst (defer="defer") (wenn XHTML verwenden). In Ihrem Fall würde die Skript Aufnahme lesen:

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

Aktualisieren in Bezug auf Ihre Update: Sie sollten noch Einsatz ein Doctype auf der Hauptseite (man denke mit der HTML 5 eine ).

Und ich denke, die Art und Weise Sie Ihre onload Ereignis verbunden ist das Beste, was Sie tun können.

Aber wenn man bedenkt das Ziel, das Sie (eine Druckansicht ohne Hyperlinks) erreichen wollen: Sie können auch den „Druck“ verwenden media Attribut und Stil Hyperlinks wie Text; dass die Weg leichter als das, was Sie tun, und es funktioniert, wenn JavaScript deaktiviert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top