2 votes

Internet Explorer : Comment modifier le CSS au moment de l'exécution pour l'impression ?

Imaginez une page web qui permet aux utilisateurs d'afficher un élément caché, en utilisant la méthode suivante javascript pour modifier les css un style CSS au moment de l'exécution.

Après sa décision (qui inclut la modification de la feuille de stlyes), l'utilisateur utilise la fonctionnalité d'impression de son navigateur.

Il semble que Internet Explorer ne respecte pas les changements effectués dans la feuille de style avant pendant impression si la définition css originale est située dans un fichier externe. Dans les autres navigateurs, tout fonctionne comme prévu.

Veuillez consulter l'exemple ci-dessous, qui modifie une classe de style par rapport à sa définition initiale display:none a display:inline au moment de l'exécution, d'où l'affichage de l'élément. Mais lors de l'impression de cette page, l'élément reste caché dans internet explorer (testé avec IE 6,7,8).

Avez-vous une solution ou une solution de contournement ?

Exemple minimaliste (fichier html) :

<html><head>
<LINK rel="stylesheet" type="text/css" href="minimal.css">
</head><body onload="displayCol();">
<script>
function displayCol()
{
     var myrules;
     if( document.styleSheets[0].cssRules ) {
              myrules = document.styleSheets[0].cssRules;

     } else {
        if ( document.styleSheets[0].rules ) {
            myrules = document.styleSheets[0].rules;
            }
        }
      myrules[0].style.display = "inline";  
}
</script>

<div class="col0" id="test">This is hidden by default.</div></body></html>

minimal.css

.col0 {
  display:none;
}

UPDATE :

Veuillez noter que la décision d'afficher ou non l'objet est prise par l'utilisateur - elle n'est pas connue au moment de l'exécution !

3voto

Avez-vous envisagé d'utiliser la méthode media=print pour que le navigateur utilise une feuille de style spécifique à l'impression ?

<link rel="stylesheet" href="print.css" media="print" />

Si les modifications css que vous effectuez sont toujours les mêmes, c'est-à-dire que vous pouvez techniquement les stocker dans un fichier css distinct, alors vous pouvez utiliser cette méthode.

Pour les CSS non statiques, dans IE (je ne suis pas sûr pour les autres navigateurs ou les versions ultérieures d'IE), vous pouvez envisager d'utiliser l'événement onbeforeprint.

Voir ici : http://www.javascriptkit.com/javatutors/ie5print.shtml

1voto

David Kolar Points 2727

Au lieu d'utiliser le javascript pour modifier les règles de la feuille de style, utilisez le script pour appliquer et supprimer les classes aux éléments qui doivent être affichés. N'oubliez pas qu'un élément peut se voir appliquer plus d'une classe.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Demo</title>
    <style type="text/css">
        .col0 {display:none;}
        div.showCol {display: inline;}
    </style>
    <script type="text/javascript">
        function displayCol() {
            document.getElementById("test").className += " showCol";
        }
    </script>
</head>
<body onload="displayCol();">
    <div class="col0" id="test">This is hidden by default.</div>
</body>
</html>

Cette réponse à une autre question explique très bien les différentes façons de procéder avec des scripts : Modifier la classe d'un élément avec JavaScript

0voto

ihamlin Points 160

Vous pouvez essayer d'utiliser une feuille de style spécifique pour l'impression, par exemple :

<link rel="stylesheet" type="text/css" href="print.css" media="print" />

EDIT - trop lent :)

0voto

DanMan Points 3499

Javascript n'est pas évalué lors de l'impression. L'impression sera identique à celle obtenue lorsque le Javascript est désactivé. Vous devez créer une feuille de style media=print supplémentaire et y apporter les modifications nécessaires.

Si ce n'est pas possible, vous pouvez créer un lien qui générera une page statique qui ressemblera à ce qu'elle est censée être pour cet utilisateur particulier.

0voto

moonsspoon Points 460

Sur la base de votre exemple de scénario - dans votre feuille de style, ajoutez :

.col0 {
    display: none;
}

body.showColumn .col0 {
    display: inline;
}

Il suffit ensuite d'activer la classe .showColumn sur votre corps pour que la visibilité de la colonne soit modifiée en conséquence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X