Thématiques :

Traiter les images manquantes en jQuery

Posé ici le mardi 30 juin 2009 à 13:45 par Jay Salvat

Image manquante

Parmi la foultitude d'événements gérés par Javascript, il existe l'événement error. Son utilisation est assez obscure et manque un peu d'intérêt dans bien des cas. A tel point que l'équipe de jQuery a décidé d'en suspendre le support tout en livrant la méthode "en l'état" pour qui veut s'amuser avec.

Cet événement est applicable à l'objet window et image seulement et est déclenché, comme on peut s'en douter, lorsqu'une erreur intervient sur l'un de ces éléments. On laissera rapidement de côté l'objet window pour s'intéresser aux erreurs de l'objet image.

Quelques idées me viennent.

Faire disparaitre une image manquante

Pour ne pas polluer la page avec des images cassées, on les masque directement en cas de soucis. Cette idée est aussi donnée en exemple dans la documentation de jQuery.

$("img").error(function(){
    $(this).hide();
});

Remplacer une image manquante par une autre

Plus en douceur, on pourra aussi remplacer les images manquantes par une autre image d'alerte.

Image manquante
$(function() {
    $('img').error(function(evt) {
        var src = $(this).attr('src');

        $(this)
        .attr('alt', 'Cette image manque')
        .attr('src', 'alerte-image-manquante.png');
    });
});

Lancer un script PHP lorsqu'une image est manquante

Lorsqu'une image est manquante, il est utile d'en être rapidement informé pour réparer les dégâts. Sur le même principe que l'exemple précédent, on remplace l'URL de l'image par une nouvelle. Mais juste avant on appelle un script PHP qui lancera un job particulier. Pour par exemple, prévenir le webmaster par email ou écrire des logs de ces erreurs...

$(function() {
    $('img').error(function(evt) {
        var src = $(this).attr('src');

        $(this)
        .attr('alt', 'Cette image manque')
        .attr('src', 'log.php?src='+src+'&ref='+document.location)
        .attr('src', 'image.png');
    });
});

Un script PHP est appelé. On y passe le chemin de l'image manquante (src) et le chemin de la page en question (document.location). Le script lancera un email (attention au flood sur les sites à fort trafic) et loggera l'erreur dans un fichier.

log.php
<?php
    $message = sprintf("%s '%s' manquant sur '%s' \n", 
        date('Y-m-d H:i:s'), 
        $_GET['src'], 
        $_GET['ref']
    );
    file_put_contents("log.txt", $message, FILE_APPEND);

    mail('admin@jaysalvat.com', 'Image manquante', $message);
?>

Ce qui donnera des logs de ce type et un envoi de mail du même message.

Logs
2009-06-30 12:55:40 'picture.png' manquant sur 'http://jaysalvat.com/index.html' 
2009-06-30 12:55:43 'picture.png' manquant sur 'http://jaysalvat.com/index.html' 
2009-06-30 12:56:12 'picture.png' manquant sur 'http://jaysalvat.com/index.html' 
2009-06-30 12:57:38 'picture.png' manquant sur 'http://jaysalvat.com/index.html' 

Trackbacks

0 trackback

Commentaires

1 commentaire

Bonjour,

Merci pour votre tuto, je trouve ça très pratique.
J'ai tout de même un problème.
Sur mon site, j'ai d'autres script javascript que j'appelle de cette manière :

<script language="javascript" type="text/javascript" src="Blabla"&g…</script>

Dès lors, la technique que vous présenter ne fonctionne plus...

Voici un exemple :

Money-experience.com/test4.php

Dans cet exemple, j'ai mis 3 images dont 2 n'existent plus. J'ai aussi ajouté mon script de gestionnaire de pub que j'appelle comme indiquer ci-dessus (d'où une bannière qui s'affiche)

Le script fonctionne dès que j'enlève mon script de pub...

J'ai fait de nombreux tests, et le problème est systématique dès qu'il y a un autre script javascript avec un src.

J'espère que vous pourrez m'aider

:D)

1. Par CHAUDEY le mercredi 21 octobre 2009 à 14:47

Obligatoire. Vrai nom apprécié.

Il ne sera ni affiché, ni spammé.

Votre blog ou votre site web.

Constructif, courtois et correctement écrit. SMS proscrit. Merci.