2008-10-28 10 views
3

Je dois définir l'attribut onload pour une fenêtre nouvellement ouverte. Le code suivant fonctionne pour Firefox:Définition de l'événement OnLoad pour une fenêtre récemment ouverte dans IE6

<a onclick="printwindow=window.open('www.google.com');printwindow.document.body.onload=self.print();return false;" href='www.google.com'> 

Cependant, lorsque je tente ce dans IE, je reçois une erreur - « printwindow.document.body nulle ou non définie »

L'objectif est de pop ouvert une nouvelle fenêtre, et appelez le dialogue d'impression pour cette fenêtre une fois qu'il a été ouvert

Il est important de ne pas utiliser javascript ailleurs sur la page cible, car je n'ai pas La fonctionnalité doit être contenue dans le lien que j'ai posté ci-dessus:

Répondre

0

Vous utilisez "printwindow.document.body.onload = self.print();" ligne en cours d'exécution avant la fin du chargement du document enfant. Je ne pense pas que vous puissiez être garanti.

Voici une idée: préparer du HTML ou une page qui n'a rien d'autre que la page dont vous avez besoin dans un iframe. Body.onload = self.print(). Onload est une propriété si les objets de la fenêtre, et non les éléments du corps, en dépit de ce que l'attribut HTML pourrait vous faire croire.

+0

Malheureusement, tout ce que je dois travailler avec ce lien est. Je comprends votre point, cependant. J'ai essayé de faire un "setTimeout ('printwindow.print()', 3000);", cependant, il prétend que printwindow est indéfini quand je fais cela. Des idées? – SocialCensus

0

Ceci est la référence:

printwindow.onload 

Cependant, dans ce contexte, vous ne pouvez pas passer une chaîne JavaScript - vous devez le remettre en fonction. Ainsi, le script complet comme ressemblerait à ceci

printwindow.onload=function(){self.print();} 

Maintenant, mettre tous ensemble

<a href="www.google.com" onclick="var printwindow=window.open(this.href,'printwindow');printwindow.onload=function(){self.print();};return false;" >try it</a> 

CEPENDANT! Cela ne fonctionnera pas pour vous pour l'URL "www.google.com". Le modèle de sécurité du navigateur empêche les fenêtres parents d'accéder aux objets fenêtre des fenêtres enfants, SAUF dans le cas où elles résident toutes les deux dans le même nom de domaine.

+0

Merci pour votre réponse concise. Cela fonctionne pour Firefox, mais malheureusement pas dans IE ou Safari. C'est comme si printwindow.onload n'était pas la bonne façon d'accéder à la fonction onload pour ces navigateurs. Avez-vous d'autres conseils? – SocialCensus

1

Ce n'est pas possible à moins que les deux pages sont sur le même domaine. Votre code ne fonctionne pas dans FF, mais imprime plutôt la page en cours. Si les pages sont sur le même domaine, vous écrivez:

printwindow=window.open('/mypage.html'); 
printwindow.onload = function() { 
    printwindow.focus(); 
    printwindow.print(); 
} 
-1

cette façon, la finale (certes, pauvres) solution qui a fonctionné pour tous les navigateurs était d'utiliser setTimeout et appeler impression() au lieu de modifier la attribut onload:

<a onclick="self.printwindow=window.open('print.html');setTimeout('self.printwindow.print()',3000);return false;" href='print.html'> 
4

Bien que les réponses indiqués ci-dessus correctement la nouvelle fenêtre doit être du même domaine, ils ont répondu à tort pourquoi il a obtenu l'erreur 'printwindow.document.body nulle ou non définie. C'est parce que IE ne renvoie aucun statut de window.open() ce qui signifie que vous pouvez ouvrir une page et essayer d'y accéder AVANT que onload soit disponible.

Pour cette raison, vous devez utiliser quelque chose comme setTimeout pour vérifier.Par exemple:

printwindow = window.open('print.html'); 
var body; 
function ieLoaded(){ 
    body = printwindow.document.getElementsByTagName("body"); 
    if(body[0]==null){ 
     // Page isn't ready yet! 
     setTimeout(ieLoaded, 10); 
    }else{ 
     // Here you can inject javascript if you like 
     var n = printwindow.document.createElement("script"); 
     n.src = "injectableScript.js"; 
     body.appendChild(n); 

     // Or you can just call your script as originally planned 
     printwindow.print(); 
    } 
} 
ieLoaded(); 

Ceci est discuté plus here

Questions connexes