Version complète: sur le forum Webmaster Hub : récupérer le code généré par une fonction sans l'afficher
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > AjaX et JavaScript
captain_torche
Salut à tous !
Je suis en train de tenter de contourner un petit souci en JavaScript :
J'ai actuellement une fonction, placée sur un serveur distant (dont je n'ai donc pas le contrôle), qui m'affiche une image en fonction de certains paramètres (via un document.write).
Le souci, c'est que si aucune image ne peut être affichée, il m'en affiche quand même une par défaut, de 1px sur 1px, mais qui est suffisante pour casser un design (où les éléments doivent être alignés au pixel près).
J'aimerais savoir s'il était possible de stocker le rendu de cette fonction dans une variable, pour éventuellement vérifier le contenu de cette image, et décider de l'afficher (ou pas).

Merci d'avance !
Kent
En fait, ta fonction renvoie un echo du genre : echo "<img src='http://blabla/imagepardefaut.jpg'>";

si tu connais l'url et les attributs utilisé dans l'echo de la balise <img> tu pourrais faire quelque chose du genre ..

CODE
if(fonctionQuiRenvoieLimage != "<img src='http://blabla/imagepardefaut.jpg'>)
{
fonctionQuiRenvoieLimage();
}


Seulement je ne sais pas si une fonction est executé lorsqu'on l'évalue. Je pense que oui sad.gif

Mais il faudrait nous montrer comment fonctionne cette fonction, si elle renvoie l'image sous forme d'un echo du tag html ?

Il faudrait trouver le moyen d'évaluer le resultat d'une fonction sans l'executer, ou de désactiver les echos ...

EDIT : Oups je viens de me rendre compte que ça serait plus du javascript en fait blush.gif , mais le principe reste le même non ? il faut évaluer le resultat afin de décider oui ou non de l'afficher...
captain_torche
C'est exactement ça wink.gif
Le seul souci, c'est que le code est exécuté quoi qu'il arrive.

Je suis en train de trouver une méthode pour contourner ça (je masque le div généré, et je ne l'affiche qu'en fonction de certains tests), mais c'est pas encore super-propre.
TheRec
Bonjour,

Donc invariablement, le document.write s'exécute car il est appelé dans le script distant ? Ou as-tu le contrôle sur ce(s) document.write ?

Si tu n'a pas le contrôle sur cela, le seul moyen que je vois est, une fois la page chargée et le script distant exécuté, reprendre l'ensemble des éléments générés (pour peu que l'arborescence DOM soit toujours cohérente) et effectuer un deuxième traitement en corrigeant ce qui ne te plait pas.
Je ne peux que te conseiller jQuery pour ce genre de travaux, il y a des fonctions très pratiques pour la sélection des éléments souhaités.
Une fois les éléments sélectionnés, tu peux simplement les supprimer de l'arborescence.
Il faut simplement placer ce traitement dans un événement qui se produit après l'appel à ton script distant.
captain_torche
Ben en fait, c'est un peu ce que je suis en train de faire wink.gif
Je regarde ce que ça donnerait si je supprimais carrément l'objet, plutôt que de le masquer / afficher.
captain_torche
Bon, TheRec, merci, tu m'as mis sur la bonne voie wink.gif
J'étais parti du principe de masquer par défaut tous les éléments incriminés (via CSS), puis les afficher en Javascript s'il le fallait, mais ça me causait quelques bugs sous IE6.

Je suis revenu à un affichage normal, avec suppression de l'élément si la chaîne est trouvée, et ça marche nickel, merci !
TheRec
De rien. Bien sûr, jQuery n'est pas du tout indispensable, il facilite juste les choses à mon avis. Il ne fait rien de plus que ce qu'est capable de faire Javascript nativement wink.gif
captain_torche
J'en n'ai pas eu besoin, effectivement wink.gif
Pour info, le code que j'ai utilisé :
CODE
addLoadEvent(function() {
    var images = document.getElementsByTagName('img');
    var vide = "empty.gif";
    for(var i = 0; i < images.length; i++) {
        var src = images[i].src;
        if(src.indexOf(vide, 0) != -1) {
            var div = images[i].parentNode.parentNode;
            div.removeChild(div.firstChild);
            div.removeAttribute('class');
        }
    }
});

En utilisant la fonction addLoadEvent(), de Simon Willison.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.