Aller au contenu

récupérer le code généré par une fonction sans l'afficher


captain_torche

Sujets conseillés

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 !

Lien vers le commentaire
Partager sur d’autres sites

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 ..

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 :(

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: , mais le principe reste le même non ? il faut évaluer le resultat afin de décider oui ou non de l'afficher...

Modifié par Kent
Lien vers le commentaire
Partager sur d’autres sites

C'est exactement ça ;)

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Bon, TheRec, merci, tu m'as mis sur la bonne voie ;)

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 !

Lien vers le commentaire
Partager sur d’autres sites

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 ;)

Lien vers le commentaire
Partager sur d’autres sites

J'en n'ai pas eu besoin, effectivement ;)

Pour info, le code que j'ai utilisé :

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.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...