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 :

Ajax et lazyloading IMG


Sujet :

jQuery

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Ajax et lazyloading IMG
    Bonjour, je me heurte à un problème.

    J'ai crée sur un site Wordpress dernière version, php 7.2 une page avec un menu filtre de catégorie.
    En gros sur la page (BLOG) toutes les catégories apparaissent et un menu avec les différentes sous-catégories existent
    qui permet de n'afficher que les sous-catégories sélectionnées; Pour ce menu j'ai crée une fonction en ajax.
    Tout fonctionnes bien : Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
        function cat_ajax_get_3(catID) {
            var ajaxurl = '/wp-admin/admin-ajax.php';
            jQuery.ajax({
                type: 'POST',
                url: ajaxurl,
                data: {"action": "filtre-blog", cat: catID }, /* filtre-noustrouver */
                success: function(response) {
                    var $el = jQuery("#category-content-blog");
                    $el.fadeOut(400, function(){
                        $el.html(response).fadeIn(400); /* RESPONSE */
                    });
                    return false;
                }
            });
        }
     
        jQuery( ".category-blog #category-menu a.ajax" ).click(function() {
            jQuery(".category-blog #category-menu a.ajax").removeClass("current");
            jQuery(".category-blog #category-menu a.ajax").removeClass("current");
            jQuery(this).addClass("current"); 
            var catnumber = jQuery(this).attr('data-term-number');
            cat_ajax_get_3(catnumber);
        });
    Le problème c'est que chaque catégorie a un IMAGE DE UNE et qu'un script (blazy.js) est appliqué dessus.
    Quand j'active le filtre du menu, l'image disparait... normal car il faut revalider le script blazy cf : bLazy

    J'ai donc essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        jQuery(document).ready(function(){
            var mybLazy = new Blazy({ 
                selector: ".b-lazy" 
                , offset: 0 
                , container: "window"
                , successClass: "b-loaded"
            });
            mybLazy.revalidate();
        });
    Mais cela ne fonctionne pas... Une idée ?

    je me demandais si je ne devait pas plutôt appliquer une fonction au niveau de l'AJAX ?
    J'avoue que j'ai pas mal cherché mais je suis perdu... Donc si vous pouvez m'éclairer ?

  2. #2
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    Salut,

    pourquoi place ton revalidate sur document ready ? cet état ne se produit qu'une fois à la fin du chargement de ta page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    function cat_ajax_get_3(catID) {
            var ajaxurl = '/wp-admin/admin-ajax.php';
            jQuery.ajax({
                type: 'POST',
                url: ajaxurl,
                data: {"action": "filtre-blog", cat: catID }, /* filtre-noustrouver */
                success: function(response) {
                    var $el = jQuery("#category-content-blog");
                    $el.fadeOut(400, function(){
                        $el.html(response).fadeIn(400); /* RESPONSE */
                    });
             var mybLazy = new Blazy({ 
                selector: ".b-lazy" 
                , offset: 0 
                , container: "window"
                , successClass: "b-loaded"
            });
            mybLazy.revalidate();
                    return false;
                }
            });
        }
     
        jQuery( ".category-blog #category-menu a.ajax" ).click(function() {
            jQuery(".category-blog #category-menu a.ajax").removeClass("current");
            jQuery(".category-blog #category-menu a.ajax").removeClass("current");
            jQuery(this).addClass("current"); 
            var catnumber = jQuery(this).attr('data-term-number');
            cat_ajax_get_3(catnumber);
        });
    c'est à chaque retour de ton ajax que tu dois revalider.

    Sinon, pour information il vaux mieux que tu utilises la méthode done plutôt que la propriété success pour ton ajax.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $.ajax({
      url: "https://fiddle.jshell.net/favicon.png"
    })
      .done(function( data ) {
        if ( console && console.log ) {
          console.log( "Sample of data:", data );
        }
    });
    et pourquoi est ce que tu return false ? il n y a aucune raison de le faire.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci SHOWIE pour tes éclaircissements.
    En vérité je maitrise bien le html, ccs, un peu moins le js et jquery et j'ai voulu creuser le principe de l'ajax.
    Donc, comme plein de gens j'ai réadapté un script de github : le script
    Mais bon, même si j'ai modifié son script il restait des erreurs. J'ai essayé de comprendre et de ne pas recopier bêtement... mais il restait des erreurs;

    Pour le return false, j'avais un doute... c'est vrai que ça n'a rien à faire là.
    Pour le reste je vais tester. Tes explications me paraissent logiques.
    Pour le revalidate(), j'applique ce que dit le dev' de bLazy.js sur son site... En vrai il y a peu d'explications.
    J'ai fait moi même un PLUGIN avec son script. Il marche bien sauf pour l'ajax.

    Sinon j'étais en train d'explorer ce genre de chose.
    Car si j'ai un autre appel AJAX : il faudra à nouveau que j'appel bLazy() ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    jQuery(document).ajaxSuccess(function() {
            var mybLazy = new Blazy({ 
            selector: ".b-lazy" 
            , offset: 0 
            , container: "window"
            , successClass: "b-loaded"
        });
        setTimeout(function(){ mybLazy.revalidate();},100);
    });

  4. #4
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    Effectivement, si tu as plusieurs appel Ajax différents c'est une bonne idée utiliser ajaxSuccess pour factoriser le code.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Ok, j'essaye. Mais dans mon footer je vois le script blazy et après arrive le script ajax.
    Je pensais que l'appel à new Blazy() allait relancer le script mais ça ne semble pas marcher.
    pourtant que je fait une " alert('quelconque') " çà marche... C'est vraiment chelou...

    Je vais continuer de creuser. Je peux donner l'adresse du site mais en privé uniquement si certains ont le courage ?

  6. #6
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    oui je t'ai répondu un peu vite seul le revalidate toi être réexécuté.

    tu dois avoir les deux bouts de code séparé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        jQuery(document).ready(function(){
            var mybLazy = new Blazy({ 
                selector: ".b-lazy" 
                , offset: 0 
                , container: "window"
                , successClass: "b-loaded"
            });
        });
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    jQuery(document).ajaxSuccess(function() {
        setTimeout(function(){ mybLazy.revalidate();},100);
    });

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Pour le moment j'ai essayé bcp de choses mais ça ne marche pas.

    -> l'AJAX s’exécute bien.
    -> les images en différées via bLazy.j aussi...

    Mais les 2 ensembles, non. Quand je déclenche la requête AJAX le script bLazy.js et un autre en jquery ne sont pas exécutés.
    Ce qui est normal vu que comme tu l'as dit les fonctions ont déjà été exécutés.
    Il faut donc, trouver un moyen de redéclencher les scripts jquery quand un appel AJAX est fait... J'essaye ta solution.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Au final... rien ne marche bien. J'ai fait un test...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    jQuery(document).ajaxSuccess(function() {
        setTimeout(function(){ mybLazy.revalidate();},100);
        alert ('essai');
    });
    Alert 'essai'; s'affiche mais on dirait que c'est un problème d'ordre d’exécution.
    Franchement, je ne sais plus. Je pense que je vais revoir le principe de l'ajax dans wp...
    Et pourtant il n'y pas d'erreur d'indiquée.

  9. #9
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    si tu essai ceci tu obtiens quoi dans la console ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    jQuery(document).ajaxSuccess(function() {
        console.log( mybLazy);
        alert ('essai');
    });

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    ReferenceError: mybLazy is not defined[En savoir plus] myblazy.js:11:5
    <anonyme> http://www.xxxxxxxxxxxxx/wp-content/plugins/my-blazy/myblazy.js?ver=1.0.0:11
    jQuery 5
    dispatch

    handle

    trigger

    l

    o
    Si je mets toute la fonction ça marche par contre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    jQuery(document).ajaxSuccess(function() {
        var mybLazy = new Blazy({ 
            selector: ".b-lazy" 
            , offset: 0 
            , container: "window"
            , successClass: "b-loaded"
        });
        console.log( mybLazy);
    });

  11. #11
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    Il faut supprimer le var devant mybLazy afin de la rendre globale et accessible de partout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        jQuery(document).ready(function(){
            mybLazy = new Blazy({ 
                selector: ".b-lazy" 
                , offset: 0 
                , container: "window"
                , successClass: "b-loaded"
            });
        });

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/11/2011, 11h53
  2. ajax syncro panier aprés click img
    Par spins06 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/08/2010, 20h07
  3. Réponses: 3
    Dernier message: 23/06/2010, 17h02
  4. AJAX + Innerhtml + img => Bug sous IE
    Par GregPeck dans le forum Langage
    Réponses: 12
    Dernier message: 07/02/2006, 17h43

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