121 votes

Quel est le meilleur code JavaScript pour créer un élément img ?

Je veux créer un simple bout de code JS qui crée un élément image en arrière-plan et n'affiche rien. L'élément image appellera une URL de suivi (comme Omniture) et doit être simple et robuste et fonctionner dans IE 6 =< seulement. Voici le code que j'ai :

var oImg=document.createElement("img");
oImg.setAttribute('src', 'http://www.testtrackinglink.com');
oImg.setAttribute('alt', 'na');
oImg.setAttribute('height', '1px');
oImg.setAttribute('width', '1px');
document.body.appendChild(oImg);

Est-ce la façon la plus simple mais la plus robuste (sans erreur) de procéder ?

Je ne peux pas utiliser un framework comme jQuery. Il faut que ce soit en JavaScript pur.

94voto

bobince Points 270740
oImg.setAttribute('width', '1px');

px est pour CSS seulement. Utilisez l'un ou l'autre :

oImg.width= '1';

pour définir une largeur par le biais du HTML, ou :

oImg.style.width= '1px';

pour le définir par le biais de CSS.

Notez que les anciennes versions d'IE ne créent pas une image correcte avec document.createElement() et les anciennes versions de KHTML ne créent pas un nœud DOM correct avec la fonction new Image() Donc, si vous voulez être entièrement compatible avec le passé, utilisez quelque chose comme.. :

// IEWIN boolean previously sniffed through eg. conditional comments

function img_create(src, alt, title) {
    var img= IEWIN? new Image() : document.createElement('img');
    img.src= src;
    if (alt!=null) img.alt= alt;
    if (title!=null) img.title= title;
    return img;
}

Méfiez-vous aussi un peu de document.body.appendChild si le script peut s'exécuter alors que la page est en cours de chargement. Vous pouvez vous retrouver avec l'image à un endroit inattendu, ou une erreur JavaScript bizarre sur IE. Si vous devez être en mesure de l'ajouter au moment du chargement (mais après l'exécution de la commande <body> a commencé), vous pourriez essayer de l'insérer au début du corps en utilisant body.insertBefore(body.firstChild) .

Pour réaliser cette opération de manière invisible tout en permettant à l'image de se charger dans tous les navigateurs, vous pouvez insérer un fichier de type "absolument positionné hors de la page". <div> comme premier enfant du corps et placez-y toutes les images de suivi/préchargement que vous ne voulez pas voir.

55voto

Tad Points 304
var img = new Image(1,1); // width, height values are optional params 
img.src = 'http://www.testtrackinglink.com';

10voto

Darryl Hein Points 33819

JQuery :

$('#container').append('<img src="/path/to/image.jpg" width="16" height="16" alt="Test Image" title="Test Image" />');

J'ai trouvé que cela fonctionne encore mieux car vous n'avez pas à vous soucier de l'échappement HTML (ce qui devrait être fait dans le code ci-dessus, si les valeurs n'étaient pas codées en dur). C'est également plus facile à lire (du point de vue de JS) :

$('#container').append($('<img>', { 
    src : "/path/to/image.jpg", 
    width : 16, 
    height : 16, 
    alt : "Test Image", 
    title : "Test Image"
}));

9voto

Binny V A Points 683

Par souci d'exhaustivité, je suggère d'utiliser également la méthode InnerHTML, même si je ne la considère pas comme la meilleure...

document.getElementById("image-holder").innerHTML = "<img src='image.png' alt='The Image' />";

Au fait, innerHTML n'est pas si mauvais

3voto

swilliams Points 19415

Êtes-vous autorisé à utiliser un cadre ? jQuery y Prototype rendent ce genre de chose assez facile. Voici un exemple en Prototype :

var elem = new Element('img', { 'class': 'foo', src: 'pic.jpg', alt: 'alternate text' });
$(document).insert(elem);

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