IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Fonction ratioImage (resize d'image propotionnel) incompatible IE9


Sujet :

JavaScript

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut Fonction ratioImage (resize d'image propotionnel) incompatible IE9
    Bonjour,

    La fonction ratioImage (ci-dessous) n'est pas compatible avec IE9 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <script language="javascript">
    function ratioImage(urlImage,largeurImg){
    photo=new Image();
    photo.src=urlImage;
    var photoWidth=photo.width;
    var photoHeight=photo.height;
    var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
    var newPhotoWidth=photoWidth*ratio;
    var newPhotoHeight=photoHeight*ratio;
    document.write("<img class=\"image_presentation\"  src=\"" + urlImage + "\" width=\"" + newPhotoWidth + "\"  height=\"" + newPhotoHeight+ "\" />");
    };
    </script>
    A appeler comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script language="javascript">
    ratioImage("http://www.clickonmylinks.fr/wp-content/images/singe1.jpg",100)
    </script>
    Auriez-vous une solution de remplacement pour cette fonction ?

    D'avance merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    <script language="javascript">
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script type="text/javascript">
    Utilise appendChild à la place de document.write
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ratioImage(urlImage,largeurImg){
    	photo=new Image();
    	photo.src=urlImage;
    	var photoWidth=photo.width;
    	var photoHeight=photo.height;
    	var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
    	photo.width = photoWidth*ratio;
    	photo.height=photoHeight*ratio;
    	document.body.appendChild(photo);
    };
    A+.
    A+.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    Bonjour,

    J'ai repris la fonction telle que vous l'aviez modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <html>
    <head>
    <script type="text/javascript">
    function ratioImage(urlImage,largeurImg){
    	photo=new Image();
    	photo.src=urlImage;
    	var photoWidth=photo.width;
    	var photoHeight=photo.height;
    	var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
    	photo.width = photoWidth*ratio;
    	photo.height=photoHeight*ratio;
    	document.body.appendChild(photo);
    };
    </script>
    </head>
    <body>
    <script type="text/javascript">
    ratioImage("http://www.clickonmylinks.fr/wp-content/images/singe1.jpg",100)
    </script>
    </body>
    </html>
    Et cette fois-ci, ça ne fonctionne ni sous IE9 ni sur les autres

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <body onload="ratioImage("http://www.clickonmylinks.fr/wp-content/images/singe1.jpg",100)">
    </body>
    devyan

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    C'est que l'image n'est pas encore chargé, donc il ajoute l'image avec une hauteur et largeur de 0 px.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <body onload="ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100)">

    A+.

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Non, c'est juste que quand tu ouvres un attribut avec le caractère ", le caractère " suivant fermera l'attribut !
    La coloration syntaxique montre clairement que tu as une imbrication de quotes problématique !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <html>
    <head>
    <script type="text/javascript">
    function ratioImage(urlImage,largeurImg){
    	photo=new Image();
    	photo.src=urlImage;
    	var photoWidth=photo.width;
    	var photoHeight=photo.height;
    	var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
    	photo.width = photoWidth*ratio;
    	photo.height=photoHeight*ratio;
    	document.body.appendChild(photo);
    };
    </script>
    </head>
    <body onload="ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100)">
    </body>
    </html>
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img width="99" height="73" src="http://www.clickonmylinks.fr/wp-content/images/singe1.jpg">
    Par contre ce n'est pas tout à fait ce que je recherche parce que je voudrais pouvoir placer mon image n'importe où dans la page...

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Citation Envoyé par bartman44 Voir le message
    Par contre ce n'est pas tout à fait ce que je recherche parce que je voudrais pouvoir placer mon image n'importe où dans la page...
    Il suffit d'ajouter l'image dans un conteneur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ratioImage(urlImage,largeurImg, conteneur){
    	photo=new Image();
    	photo.src=urlImage;
    	var photoWidth=photo.width;
    	var photoHeight=photo.height;
    	var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
    	photo.width = photoWidth*ratio;
    	photo.height=photoHeight*ratio;
    	document.getElementById(conteneur).appendChild(photo);
    };
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <body onload="ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'im')">
    blablabla
    <div id="im"></div>
    blablabla
    </body>

    A+.

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    Etrange car en vidant mon cache, j'ai toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img width="0" height="0" src="http://www.clickonmylinks.fr/wp-content/images/singe1.jpg">
    En rafraichissant, ça passe...

    Il doit pas manquer grand chose...

  10. #10
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Bonjour,
    il te faut attendre que l'image soit chargée avant de faire une quelconque initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function ratioImage(urlImage,largeurImg, conteneur){
      photo=new Image();
      photo.src=urlImage;
      photo.onload=function(){
        var photoWidth=photo.width;
        var photoHeight=photo.height;
        var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
        this.width = photoWidth*ratio;
        this.height= photoHeight*ratio;
        document.getElementById(conteneur).appendChild(photo);
      };
    }

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    Pas mal la dernière solution mais le coup du conteneur et du onload dans le body c'est pas super propre...
    Surtout si je souhaite utiliser plusieurs fois ma fonction dans la page...

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    En gros, rien n'existe de "tout fait" sur une fonction de resize ?

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Citation Envoyé par bartman44 Voir le message
    Pas mal la dernière solution mais le coup du conteneur et du onload dans le body c'est pas super propre...
    Surtout si je souhaite utiliser plusieurs fois ma fonction dans la page...
    pas bien compliqué quand même d'utiliser un addEventListener!

    Citation Envoyé par bartman44 Voir le message
    En gros, rien n'existe de "tout fait" sur une fonction de resize ?
    en regroupant tout ce qui est ci dessus c'est tout comme non?

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    Je ne suis pas du tout développeur et à vrai dire je ne connaissait pas addeventlistener avant aujourd'hui.
    Le problème, c'est que j'ai l'impression qu'on a fait que compliquer la 1ere fonction alors que je voulais une simple adaptation pour IE9 car le script de départ fonctionne sur tout le reste des navigateurs.

  15. #15
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Le problème, c'est que j'ai l'impression qu'on a fait que compliquer la 1ere fonction...
    Regardes de plus près et tu verras que non, il y a simplement une meilleur prise en compte des aléas des navigateurs et de leur gestion interne.
    ...alors que je voulais une simple adaptation pour IE9...
    c'est chose faite
    ...car le script de départ fonctionne sur tout le reste des navigateurs.
    certes mais c'était insuffisant car maintenant cela marchera même avec FICHROPERIE version 2045.12.78, pas testé les version supérieures

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    OK, ce que je voulais dire c'est surtout que ça va être plutôt difficile à implémenter... mais bon puisque c'est mieux au final on va faire l'effort

    Donc je résume :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <html>
    <head>
    <script type="text/javascript">
    function ratioImage(urlImage,largeurImg, conteneur){
      photo=new Image();
      photo.src=urlImage;
      photo.onload=function(){
        var photoWidth=photo.width;
        var photoHeight=photo.height;
        var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
        this.width = photoWidth*ratio;
        this.height= photoHeight*ratio;
        document.getElementById(conteneur).appendChild(photo);
      };
    }
    </script>
    </head>
    <body>
    <script>
    window.addEventListener("load",ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plip'),false);
    window.addEventListener("load",ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plop'),false);
    </script>
    blablabla
    <div id="plip"></div>
    bliblibli
    <div id="plop"></div>
    </body>
    </html>
    Par contre je n'ai rien dans ma div "plip"...

  17. #17
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Tout d'abord on va rétablir une bonne pratique en javascript qui consiste à déclarer les variables via le mot clé var, ceci à une importance capitale dans ton cas car comme tu utilises deux fois la fonction ta variable photo, sans var, est globale donc écrasée au deuxième appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function ratioImage(urlImage,largeurImg, conteneur){
      var photo=new Image();
      photo.src=urlImage;
      photo.onload=function(){
        var photoWidth=photo.width;
        var photoHeight=photo.height;
        var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
        this.width = photoWidth*ratio;
        this.height= photoHeight*ratio;
        document.getElementById(conteneur).appendChild(photo);
      };
    }
    La deuxième chose est que tu peux grouper tes fonctions appelées dans une fonction anonyme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    window.addEventListener("load", function(){
        ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plip');
        ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plop');
      }, false);
    la troisième chose à également prendre en considération et la compatibilité avec les "anciens navigateurs" qui ne reconnaissent pas addEventListener, mais attachEvent, IE <9.
    Dans ce cas tu peux créer une fonction minimale addEvent qui prend en compte les deux méthodes, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      function addEvent( obj_, event_, func_, mode_){
        if( obj_.addEventListener){
          obj_.addEventListener( event_, func_, mode_? mode_:false);
        }
        else{
          obj_.attachEvent( 'on'+event_, func_);
        }
      }
    de la sorte ton appel ce fait de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    addEvent( window, "load", function(){
        ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plip');
        ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plop');
      }, false);
    de la sorte tu restera encore plus compatible.

    Au final ton exemple ressemblera à cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <!DOCTYPE html>
    <html>
    <head>
    <script type="text/javascript">
    function addEvent( obj_, event_, func_, mode_){
      if( obj_.addEventListener){
        obj_.addEventListener( event_, func_, mode_? mode_:false);
      }
      else{
        obj_.attachEvent( 'on'+event_, func_);
      }
    }
     
    function ratioImage(urlImage,largeurImg, conteneur){
      var photo = new Image();
      photo.src = urlImage;
      photo.onload = function(){
        var photoWidth=photo.width;
        var photoHeight=photo.height;
        var ratio=(Math.round((largeurImg/photoWidth)*100))/100;
        this.width = photoWidth*ratio;
        this.height= photoHeight*ratio;
        document.getElementById(conteneur).appendChild(photo);
      };
    }
     
    addEvent( window, "load", function(){
        ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plip');
        ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plop');
      }, false);
    </script>
    </head>
    <body>
    blablabla
    <div id="plip"></div>
    bliblibli
    <div id="plop"></div>
    </body>
    </html>
    j'ai également ajouté un doctype à l'exemple, un bon réflexe à prendre également.

    Enfin il existe aussi l'appel en fin de fichier de tes fonctions
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <body>
      blablabla
      <div id="plip"></div>
      bliblibli
      <div id="plop"></div>
    <script type="text/javascript">
    ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plip');
    ratioImage('http://www.clickonmylinks.fr/wp-content/images/singe1.jpg',100,'plop');
    </script>
    </body>
    au quel cas tu te passes de addEvent et consort.

  18. #18
    Membre du Club
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Par défaut
    Merci beaucoup pour ce dernier retour qui fonctionne parfaitement !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. resizer une image de fond en fonction de la resolution
    Par the_edge dans le forum Général JavaScript
    Réponses: 30
    Dernier message: 02/11/2006, 14h47
  2. resizer une image de fond en fonction de la resolution
    Par kitten13 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/09/2006, 14h21
  3. appel de fonction à partir d'une image activer/desactiver
    Par philippe123 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/08/2005, 16h26
  4. Réponses: 12
    Dernier message: 22/02/2005, 17h45
  5. Des fonctions OGL pour les images de format usuel ?
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/05/2003, 21h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo