Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > jQuery
jQuery Forum d'entraide sur le framework jQuery. Avant de poster : Tutoriels jQuery, FAQ jQuery, Tous les tutoriels JavaScript, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/11/2011, 10h43   #1
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Par défaut Evénement load, images et requêtes ajax

Bonjour,

Cela fait maintenant un bon moment que je farfouille, que je test, que je me creuse la tête, pour trouver un moyen simple de gérer un évènement load sur le contenu d'une réponse ajax. Pour l'instant sans résultat probant. Alors je me tourne vers vous.

Je vous détail ma réflexion :
- J'ai besoin de faire des traitements sur des images présentes dans ma page
- Sur une requête synchrone pas de souci, je le fait sur le $(window).load() et tout va bien.
- Sur une requête asynchrone ça se corse, je peux éventuellement le faire dans le success de la requête mais rien ne me permet de savoir si les images qui ont été ajoutées au DOM sont déjà chargées
- J'ai essayé avec $('img').load() mais ce n'est pas supporté par tous les navigateurs, des problèmes peuvent survenir si l'image était en cache, IE ne les envoie jamais, bref c'est pas bon
- $('img').load() fonctionne un peu mieux je crois quand il est ajouté sur une balise image sans src et que la source est renseignée après, mais je voudrais pouvoir ajouter ma réponse ajax au DOM sans m'em***der à remplir chaque balise img après coup
- J'ai essayé avec un plugin qui ajoute un évènement spécial load pour les images, mais je me choppe un "stack overflow" sur IE

J'enrage, je me dit que je ne dois pas être le seul à vouloir faire un traitement onload sur une réponse ajax, le success étant incomplet pour tout ce qui est image par exemple, mais impossible de trouver une solution concrète, simple et cross-browser.

Si vous avez ce même souci, et que vous avez une solution ou une piste, ça m’intéresse ^^
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h05   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 791
Points : 35 791
Euh... tu sembles mélanger plusieurs choses...

Citation:
Sur une requête synchrone pas de souci, je le fait sur le $(window).load() et tout va bien.

Quel rapport entre une requête AJAX synchrone et l'événement load de window ?
Citation:
Sur une requête asynchrone ça se corse, je peux éventuellement le faire dans le success de la requête mais rien ne me permet de savoir si les images qui ont été ajoutées au DOM sont déjà chargées
Là encore, je vois pas trop le rapport... Au moment du success, aucun élément n'a été ajouté au DOM tu peux donc être certain qu'aucune image n'a été chargée
Citation:
J'ai essayé avec $('img').load() mais ce n'est pas supporté par tous les navigateurs, des problèmes peuvent survenir si l'image était en cache, IE ne les envoie jamais, bref c'est pas bon
Pas tout compris... tu parles bien de load() ?
Citation:
$('img').load() fonctionne un peu mieux je crois quand il est ajouté sur une balise image sans src et que la source est renseignée après, mais je voudrais pouvoir ajouter ma réponse ajax au DOM sans m'em***der à remplir chaque balise img après coup
Ben si tu veux ajouter une action au chargement de l'image, il faudra bien la coder à un moment ou un autre non ? Ensuite, oui il est préférable de préciser l'action de l'événement avant l'insertion dans le DOM (pour éviter que l'événement soit déclenché avant qu'il ne soit défini si l'image est en cache) mais la délégation d'événement permet de gérer ça facilement avec jQuery.
Citation:
le success étant incomplet pour tout ce qui est image par exemple
Encore une fois, le success signifie uniquement que la réponse a été reçue, aucune insertion dans le DOM n'a encore été effectuée...
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h49   #3
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Navré j'ai pris quelque raccourci dans mes explications

Quand je parle de requête synchrone je parle simplement d'une page standard chargée complètement et normalement après une requête http (et non une requête ajax en mode synchrone) et qui contient des images sur lesquels je veut effectuer des traitements, notamment par rapport à leur largeur/hauteur, ce qui nécessite qu'elles soient chargées, dans ce cas là je fais mon traitement ainsi :
Code :
1
2
3
4
5
6
7
$(function(){
  $(window).load(function(){
    $('.selecteur img').each(function(){
      //traitement
    });
  });
});
... et tout va bien

Je veux que le même traitement soit effectué sur des images qui arriveraient dans le DOM lors d'une requête ajax : dans mon success je met à jour la partie de ma page qui contient ces images avec le contenu html de la réponse, j'ai donc bien de nouvelles images dans mon DOM mais je n'ai aucun moyen de savoir quand elles seront chargées, donc aucun moyen de savoir si mon traitement va correctement s'effectuer ou pas.

Pour ce qui est de mettre l'écouteur avant l'insertion dans le DOM, faire un
Code :
1
2
3
$('.selecteur img').live('load',function(){
  //traitement
})
ne marche pas (j'ai essayé) donc je suis bien obligé de mettre à jour mon DOM et de faire un bind après. Mais ça ne marche pas correctement sur tous les navigateurs, donc, comme je l'ai dit, remplir l'attribut src après est une des solutions, mais je ne considère pas ça comme une solution simple, d'autant qu'en synchrone ou asynchrone j'utilise les mêmes templates pour rendre ma page, dans lesquels les attributs src sont déjà renseignés. Cela impliquerait de boucler sur chaque image pour vider l'attribut src, poser l'écouteur, re-remplir l'attribut src. Et encore une dernière chose j'ai lu que même avec ce mécanisme certain navigateur n'envoyait pas l'évènement load si l'image était présente dans le cache.

Bref, je cherche un moyen simplissime et cross-browser d'être informé que les images (ou tout autre contenu qui dans le cas d'une requête http classique provoque cette latence entre l'évènement DOMready et l'évènement load) contenues dans une mise à jour du DOM sont bel et bien chargées.
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h59   #4
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Citation:
mais la délégation d'événement permet de gérer ça facilement avec jQuery.
Je viens de tilter sur cette partie de ta réponse (rapide d'ailleurs, je t'en remercie) qui ne m'avait pas frappée au premier abord, je manque surement de savoir faire à ce niveau, c'est peut-être ce que je cherche, peux tu m'en dire plus quant à ce que ça pourrait m'apporter ?

Merci d'avance
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 15h10   #5
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Bon, visiblement cela ne peut pas être simple, donc je me tourne vers un plugin (https://github.com/desandro/imagesloaded), cela a au moins le mérite d'être simple d'utilisation.

Sinon pour ce qui est de la délégation je crois avoir compris que la méthode live() en est une implémentation, son application à l'évènement load est des plus hasardeux, je ne sais pas ce qu'il en est pour la méthode delegate(), je me pencherai sur la question une autre fois
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 15h40   #6
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 057
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 057
Points : 45 176
Points : 45 176
cf aussi on()
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h37.


 
 
 
 
Partenaires

Hébergement Web