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 :

Ajout dynamique de lien sur balise <img>


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 30
    Points : 14
    Points
    14
    Par défaut Ajout dynamique de lien sur balise <img>
    Bonjour à tous,

    Je suis confronté à un problème que je n'ai réussi que partiellement à résoudre, n'étant pas expert en la matière je m'en remets à vous !

    Je vous présente la situation :

    Site intranet Sharepoint
    IE8
    WebPart des annonces

    Pour ceux qui ne s'y connaissent pas, vous n'avez qu'à voir la chose comme un CMS, l'objectif étant de redimensionner automatiquement les images à l'intérieur des posts, et d'ajouter un lien vers elles-même sur celles-ci quand la résolution de l'écran de l'utilisateur est faible et qu'elles sont trop grandes, tout ceci sans intervention des rédacteurs.

    Exemple simplifié :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <div class="post" id="1">
    ...
    <img src="SRC1" width="800"/>
    ...
    </div>
    <div class="post" id="2">
    ...
    <img src="SRC2" width="500"/>
    ...
    </div>

    Devient si on ne veut pas d'image plus large que 700px :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <div class="post" id="1">
    ...
    <a href="SRC1"><img src="SRC1" width="700"/></a>
    ...
    </div>
    <div class="post" id="2">
    ...
    <a href="SRC2"><img src="SRC2" width="500"/></a>
    ...
    </div>

    N'ayant pas trouvé comment rajouter une balise parent à une balise (ajouter <a> .. </a> en l'occurence), j'ai décidé de simplement rajouter un 'onclick',
    Voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var imgs=document.getElementsByTagName('img');
    for (var i = 0; i < imgs.length; ++i) {
    	var img = imgs[i];
      	if(img.width > 470 && screen.width < 1280){
      		imgsrc = img.src;
      		img.style.cssText = 'width: 470px !important; height: auto !important; cursor:pointer;';
                    img.attachEvent("onclick", function(){window.open(imgsrc);});
      	}	
      	else if(img.width > 700) {
      		img.style.cssText = 'width: 700px !important; height:auto !important;';
      	}
    }
    Pourquoi attachEvent ? Parcequ'IE ne gère pas ou mal setAttribute (en l'occurence ça ne fonctionne pas du tout pour onclick).

    Pas de souci au niveau du redimensionnement des images, le code fait exactement ce que je veux en fonction de la taille des images et/ou de la résolution de l'écran.

    Le problème se trouve au niveau des liens des images : le code ajoute bien un 'onclick' à toutes les images, mais rajoute la même adresse pour toutes les images (adresse d'une image de la page, je ne sais pas pourquoi c'est l'adresse de telle image et pas d'une autre).
    D'après moi cela devrait marcher puisque le code en question se trouve bien dans la boucle avec une variable ..

    Précision : le code n'est destiné qu'à IE8, l'entreprise n'utilisant que ce navigateur.

    Une idée ?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    a quel moment est lancé ce script ?
    ou est il placé sur la page ?

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Bonjour SpaceFrog, merci de ta contribution.

    Le script est placé dans <head>, j'aurais voulut l'écrire en tant que fonction sur body.onload, mais ceci impliquerait de modifier une masterpage et donc de le lancer pour toutes les pages, or ce script n'est destiné qu'à une seule page du site Sharepoint.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    placé dasn le head sans etre lancé dans le onload implique que tu essaye d'atteindre des objets non encore créés !

    place le dans une balise script en bas de page juste avant la balise de fermeture du body.

  5. #5
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    img.onclick = function(){window.open(this.src);};
    ne fonctionnerait pas mieux ?

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Pardon, je dis n'importe quoi.

    La balise script contenant le code est placée en bas de page, bien après le contenu.

    Ma page .aspx est un peu en foutoir et j'ai mal lu mon PlaceHolder.

    Donc pas de souci à ce niveau, le code n'aurait pas du tout marché sinon !

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Bonjour Bovino,

    Malheureusement dans ce cas là this ne renvoie pas à l'image actuelle (j'ai essayé, this.src renvoie 'undefined').

    Merci de ton aide.

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    ton souci provient des tests sur les width ...

    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
     
    <body>
    <div class="post" id="1">
    ...
    <img src="SRC1" width="800"/>
    ...
    </div>
    <div class="post" id="2">
    ...
    <img src="SRC2" width="500"/>
    ...
    </div>
    <script type="text/javascript">
    var imgs=document.getElementsByTagName('img');
    for (var i = 0; i < imgs.length; ++i) {
    	var img = imgs[i];
      		imgsrc = img.src;
      		img.style.cssText = 'width: 470px !important; height: auto !important; cursor:pointer;';
             img.onclick= function(){alert(this.src)};
     
    }
     
    </script> 
    </body>
     
    </html>

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 102
    Points : 44 885
    Points
    44 885
    Par défaut
    Bonjour,
    Citation Envoyé par micmackill
    N'ayant pas trouvé comment rajouter une balise parent à une balise (ajouter <a> .. </a> en l'occurence), j'ai décidé de simplement rajouter un 'onclick',
    il existe des méthodes bien faite, createElement, inserBefore, removeChild et appendChild avec la particularité pour appendChild de déplacer l'élément si existe, mais il semblerait que cela soit dorénavant déconseillé.

    Un exemple de code pour mettre une balise A autour d'une balise IMG
    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
    var oParent,
        oLien,
        oTmp,
        oImg = document.images;
     
    var i = 0,
        nb = oImg.length;
     
    for( ; i <nb; i++){
      // get le parent
      oParent = oImg[i].parentNode;
      // creation d'un lien
      oLien = document.createElement('A');
      // insertion du lien devant l'image
      oParent.insertBefore( oLien, oImg[i]);
      // retire l'element, pratique conseillee
      oTmp = oParent.removeChild(oImg[i]);
      // ajout de l'element image supprime au lien
      oLien.appendChild( oTmp);
      // affectation source via un getAttribute et non image.src
      oLien.href = oImg[i].getAttribute('SRC');
    }
    concernant les affectations de largeur je jouerai plutôt avec le CSS et des classes particulières.

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Bonjour NoSmoking,

    J'avais déjà trouvé ce genre de fonction mais il ne me semblait pas qu'on pouvait faire ce que je désirais, ou peut-être que je n'ai pas assez réfléchi.

    En tout cas merci pour cet exemple de code je vais essayer dès demain matin.

  11. #11
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Juste une petite erreur (d'inattention apparemment) : c'est bien de déclarer les variables hors de la boucle, mais du coup, il ne faut pas les re-déclarer dans la boucle (et de façon générale, déclarer une variable dans une boucle est une mauvaise pratique).

    Et l'astuce du jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oTmp = oParent.removeChild(oImg[i]);
    Cette ligne utilise le fait que la méthode removeChild() renvoie le noeud supprimé, ce qui permet d'affecter cette valeur de retour à une variable

    Sinon, en première intention, j'aurais plutôt utilisé cloneNode() pour remplir le lien créé et replaceChild() pour l'intégrer dans la page qui me semble (et de façon très subjective) plus "philosophiquement" adapté...

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 102
    Points : 44 885
    Points
    44 885
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Juste une petite erreur (d'inattention apparemment) : c'est bien de déclarer les variables hors de la boucle, mais du coup, il ne faut pas les re-déclarer dans la boucle (et de façon générale, déclarer une variable dans une boucle est une mauvaise pratique).
    comme tu as raison je m'en vais dans la foulée éditer le message, tel le pianiste fou j'ai tapé le code sans même me rendre compte de l'absurdité de la chose.

    Citation Envoyé par Bovino Voir le message
    Et l'astuce du jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oTmp = oParent.removeChild(oImg[i]);
    Cette ligne utilise le fait que la méthode removeChild() renvoie le noeud supprimé, ce qui permet d'affecter cette valeur de retour à une variable

    Sinon, en première intention, j'aurais plutôt utilisé cloneNode() pour remplir le lien créé et replaceChild() pour l'intégrer dans la page qui me semble (et de façon très subjective) plus "philosophiquement" adapté...
    tout à fait pour l'astuce sur le removeChild, je préfère cette méthode au cloneNode, dans ce cas au moins, car on ne crée rien de plus.

  13. #13
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    img.onclick = function(){window.open(this.src);};
    ne fonctionnerait pas mieux ?
    Citation Envoyé par micmackill Voir le message
    Bonjour Bovino,

    Malheureusement dans ce cas là this ne renvoie pas à l'image actuelle (j'ai essayé, this.src renvoie 'undefined').

    Merci de ton aide.
    la solution de bovino est pourtant la bonne et de loin la plus simple :

    voici ton code en ligne avec cette fonction et ça fonctionne :

    http://ulb.comli.com/onclick.html

    (testé sous IE 8)


    autrement, (si tu n'as pas confiance dans le this) ta solution deviendrait simplement :
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		img.onclick = (function(src){return function(){window.open(src);};})(imgsrc);

    ou pour garder ton style d'écriture (attachEvent):
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		img.attachEvent("onclick", (function(src){return function(){window.open(src);};})(imgsrc));

    bien que la première écriture est plus simple (et compatible à tous les navigateurs) donc même pour un usage unique à IE8, je l'utiliserai.

  14. #14
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Bovino Voir le message
    (et de façon générale, déclarer une variable dans une boucle est une mauvaise pratique).
    j'ai toujours ce (mauvais) reflexe aussi de définir une variable à l'intérieur d'une boucle, pensant que ça va limiter son scope à cette boucle. (sans doute que c'est le cas dans d'autres langages, sinon je ne sais pas d'où j'aurai pu avoir cette fausse idée)

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Bonjour à tous, et avant tout merci de votre aide =)

    Tout d'abord, ça y est j'ai réussi à faire ce que je voulais grâce à l'exemple et aux explications de Bovino et NoSmoking, vous êtes trop forts !

    Pour te répondre Willpower, img.onclick est la première chose à laquelle j'ai pensé en élaborant mon code, sauf que ça n'a pas marché et qu'en faisant des recherches sur le web j'ai cru comprendre que cette solution présentait des incompatibilités avec IE. J'ai donc changé de méthode par la suite.

    Toujours est-il qu'en testant le code de ton lien (qui est pratiquement identique au mien au départ) dans ma page .aspx, cela ne fonctionne pas. Je ne mets pas ta parole en doute puisqu'en cliquant sur ton lien je vois bien que cela fonctionne, peut-être le problème vient-il de chez moi ?

    Encore merci à tous, problème résolu grâce à vous !

  16. #16
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     oTmp = oParent.removeChild(oImg[i]);
      // ajout de l'element image supprime au lien
      oLien.appendChild( oTmp);
    a quoi sert le removeChild ?
    un appendChild dans la balise a créé suffit non ?

  17. #17
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 102
    Points : 44 885
    Points
    44 885
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    a quoi sert le removeChild ?
    un appendChild dans la balise a créé suffit non ?
    oui tout à fait mais il est conseillé pour des problèmes de compatibilte de ne pas sauter l'étape
    Si le noeud existe déjà, Il est recommandé d'utiliser la méthode element.removeNode avant element.appenChild
    (compatibilité : dolphin browser / OS Bada - device samsung s8500)
    le lien d'origine de la lecture

  18. #18
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     oTmp = oParent.removeChild(oImg[i]);
      // ajout de l'element image supprime au lien
      oLien.appendChild( oTmp);
    a quoi sert le removeChild ?
    un appendChild dans la balise a créé suffit non ?

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

Discussions similaires

  1. Liens sur balise <li>
    Par mimagyc dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 16/10/2008, 10h54
  2. Ajout dynamique de label sur un form
    Par katoyi dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/05/2008, 14h58
  3. Ajout dynamique de textbox sur un step Wizard
    Par thierry007 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 31/10/2007, 17h44
  4. Réponses: 7
    Dernier message: 01/03/2006, 18h14

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