IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Evénement load, images et requêtes ajax


Sujet :

jQuery

  1. #1
    Membre habitué Avatar de eckerdecker
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 134
    Points : 185
    Points
    185
    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 ^^

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Euh... tu sembles mélanger plusieurs choses...

    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 ?
    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
    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() ?
    $('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.
    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...

  3. #3
    Membre habitué Avatar de eckerdecker
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 134
    Points : 185
    Points
    185
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre habitué Avatar de eckerdecker
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 134
    Points : 185
    Points
    185
    Par défaut
    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

  5. #5
    Membre habitué Avatar de eckerdecker
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 134
    Points : 185
    Points
    185
    Par défaut
    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

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    cf aussi on()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redimension d'image. Evènement "load"
    Par Mascotte dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 05/06/2008, 15h31
  2. [AJAX] Exécuter 2 requêtes ajax/php.
    Par djalilk dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 22/10/2007, 11h52
  3. [AJAX] Afficher une image GD avec ajax
    Par darkvodka dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/06/2007, 00h43
  4. [AJAX] Centraliser les requêtes AJAX afin d'avoir un seul appel
    Par Mike_69 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/03/2007, 16h51
  5. Images et requêtes impossible
    Par javaboy dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 16/02/2007, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo