captain_torche Posté 13 Février 2007 Posté 13 Février 2007 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 Posté 13 Février 2007 Posté 13 Février 2007 (modifié) 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 , mais le principe reste le même non ? il faut évaluer le resultat afin de décider oui ou non de l'afficher... Modifié 13 Février 2007 par Kent
captain_torche Posté 13 Février 2007 Auteur Posté 13 Février 2007 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.
TheRec Posté 13 Février 2007 Posté 13 Février 2007 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 Posté 13 Février 2007 Auteur Posté 13 Février 2007 Ben en fait, c'est un peu ce que je suis en train de faire Je regarde ce que ça donnerait si je supprimais carrément l'objet, plutôt que de le masquer / afficher.
captain_torche Posté 13 Février 2007 Auteur Posté 13 Février 2007 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 !
TheRec Posté 13 Février 2007 Posté 13 Février 2007 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
captain_torche Posté 13 Février 2007 Auteur Posté 13 Février 2007 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.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant