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 :

Pourquoi ma fonction ne fonctionne qu'une fois


Sujet :

jQuery

  1. #1
    Invité
    Invité(e)
    Par défaut Pourquoi ma fonction ne fonctionne qu'une fois
    Bonjour

    J ai un index dont une partie du code est
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <div id="view">
        <span class="sp-link" data-sp-url="page_2">page 2</span>
        <p> <span class="sp-link" data-sp-url="page_3">page 3</span></p>
        <p>div view</p>
    </div>
    <!--  Scripts-->
    <script src="jquery.js"></script>
    <script>
        $(".sp-link").click(function() {
            var lurl = $(this).data("sp-url");
            $.get('pages/' + lurl + '.html', function(pageContent) {
                $('#view').html(pageContent);
            })
        });
    </script>

    Depuis mon index j appelle sans pb les pages 2 ou 3 mais quand j ai chargé le contenu dans ma div view cela ne fonctionne plus !,
    c est à dire que le click sur mes class="sp-link" chargee dans view ne chargent rien

    J ai tenté en modifiant le chargement comme ceci $('#view').load('pages/' + lurl + '.html'); mais toujours rien !

    Si dans mes pages chargées je mets un <a href="../index.html">Retour à l index</a> cela fonctionne...

    Un peu d aide serait bienvenue.
    merci
    Dernière modification par ProgElecT ; 27/04/2018 à 12h05. Motif: S'il vous plait, autant que possible, indiquer le langage utilisé, [CODE=xyz], pour activer la bonne coloration syntaxique.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Bonjour, pour ton code qui ne "clique qu'une fois" essaye en changeant la premiere ligne par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $('body').on('click', '[class="sp-link"]', function() {
    La methode .load() est deprecated

    que t'indique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     $.get('pages/' + lurl + '.html', function(pageContent) {
              alert(pageContent);
            });

  3. #3
    Invité
    Invité(e)
    Par défaut
    merci, cela fonctionne

    ce qui m est indiqué c est
    [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
    mais j avais cherché sur http://api.jquery.com et n ai pas trouvé qu elle etait depreciated...

    Par quoi devrais-je la remplacer alors mon but etant de changer dynamiquement le contenu d une div

  4. #4
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    Citation Envoyé par rooky06 Voir le message
    Par quoi devrais-je la remplacer alors mon but etant de changer dynamiquement le contenu d une div
    en jQuery = $.load() => http://api.jquery.com/load/

    en Javascript = fetch() => https://developer.mozilla.org/fr/doc...PI/Using_Fetch
    ( https://caniuse.com/#search=fetch )
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Ce code fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $('body').on('click', '[class="sp-link"]', function() {
            var lurl = $(this).data("sp-url");
     
            $('#view').load('pages/' + lurl + '.html');
    });
    A noter que $.load() peut prendre en parametre une fonction callback

  6. #6
    Invité
    Invité(e)
    Par défaut
    merci à tous

  7. #7
    Invité
    Invité(e)
    Par défaut
    je me permets de remonter ce post que j avais mis en resolu pour avoir une petite precision

    fonctionne parfaitement avec la seule class sp-link mais si cette classe est parmi d autres, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class="truc sp-link machin chose"
    comment procéder ?

    Merci pour cette precision

  8. #8
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    Tu peux tout aussi bien écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $('body').on('click', ".sp-link",  function() { ...
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(".sp-link").on('click',   function() { ...
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(".sp-link").click(function() { ...
    qui permettent tous l'exécution d'une fonction sur un evt "click" sur tous les éléments utilisant la classe "sp-link" et quel que soit le nombre de classes qui leur soient affectés.

    Le premier cas permet l'exec de la fonction lié à tout élément ayant pour classe "sp-link" présent sur la page au moment du click, même si cet élément n'était pas présent lors du chargement initial de la page.
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  9. #9
    Invité
    Invité(e)
    Par défaut
    merci d avoir pris le temps de répondre à ma question mais j avais essayé en premier ce que tu proposes et cela ne fonctionne pas car j essaie de faire une petite appli via cordova et les pages sont charéges par un routeur et la seule façon de faire que cela fonctionne est celle proposée par bonjourajax.

    Actuellement j encapsule sp-link dans une div qui apporte le style pour remédier au fait que je n ai jamais les même classes qui accompagnent sp-link, ce qui aurait permis de modifier le code fonctionnel de bonjourajax...

    j espère avoir été assez clair pke à la relecture ça semble tout de même un peu confus...

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Bonsoir
    Voila comment tu peux remédier à ce probleme

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $('body').on('click', '[class^="sp-link"]', function()

    Il faut que la classe sp-link soit la premiere classe de ton élément
    Au fait, as tu réussi a mettre les notifications sur ton appli ?
    Ayant voulu testé Cordova (phonegap) j'avais posé une question la-dessus pas de réponse depuis des semaine a croire que personne ne s'en sert :p

  11. #11
    Invité
    Invité(e)
    Par défaut
    merci je vais tester ça des demain

    pour les notifications... je n en suis pas encore là mais j ai vu qu il y avait au moins unplugin https://github.com/phonegap/phonegap...NSTALLATION.md

    sinon j avais pensé à utiliser les sockets car j avais trouvé le plugin avant de savoir que les notifications existaient et oui je ne suis passé que ectte anné au smartphone

  12. #12
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Ca marche tiens moi au courant !
    merci pour le plugin je regarde ca (et pour les sockets tu t'y es pris comment?)

  13. #13
    Invité
    Invité(e)
    Par défaut
    pour les sockets, pas encore fait, c etait l idee premiere mais je n'en suis pas encore arrivé à cette étapte...

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par bonjourajax Voir le message
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $('body').on('click', '[class^="sp-link"]', function()

    Il faut que la classe sp-link soit la premiere classe de ton élément
    Ou sinon [class*="sp-link"].

    Petite précision : .sp-link est un sélecteur de classe alors que [class="sp-link"] est un sélecteur d’attribut. Il vaut mieux éviter de recourir à un sélecteur d’attribut « nu » car c’est équivalent au sélecteur universel *[class="sp-link"], qui est peu performant avec les moteurs CSS des navigateurs actuels.

    Voir l’excellent article CSS Performance Has Changed (for the Better) de Nicole Sullivan, ou Efficiently Rendering CSS pour une version plus courte.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Invité
    Invité(e)
    Par défaut
    merci je vais aller voir cela

  16. #16
    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 637
    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 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Petite précision aussi concenrant le comportement de qu'une fois ...

    Ton code en soi ne précise pas "une seule fois"
    Ce qui se passe en fait c'est que le callback de ton code vient écraser le contenu HTML existant en le remplaçant pas le code reçu en retour d'ajax.
    Du coup les éléments qui avaient reçu les attributions de click au chargement de page sont détruits et remplacés par d'autres qui eux n'ont pas reçu l’attribution du click

    Il existe alors 3 possibilités:
    * Réattribuer les click après le remplacement du code
    * Faire du on('click', ... par délégation à partir d'un parent ( ainsi les éléments nouveaux créés après le ready se voient automatiquement attribué les évènements du ready )
    * utiliser le delegate() qui fait en gros la même chose que le précédent
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  17. #17
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Bonjour,
    Watilin c'est obligé d'utiliser [class="sp-link"] car .sp-link ne fonctionne pas sur son système .

  18. #18
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    Citation Envoyé par bonjourajax
    ... car .sp-link ne fonctionne pas sur son système ...
    peux de chance que cela ne fonctionne pas sur un quelconque navigateur en utilisant jQuery et en « Vanilla JS » c'est reconnu depuis IE8 via querySelector(All), autant dire un sacré bail !

  19. #19
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    merci d avoir pris le temps de répondre à ma question mais j avais essayé en premier ce que tu proposes et cela ne fonctionne pas car j essaie de faire une petite appli via cordova et les pages sont charéges par un routeur et la seule façon de faire que cela fonctionne est celle proposée par bonjourajax.

    Actuellement j encapsule sp-link dans une div qui apporte le style pour remédier au fait que je n ai jamais les même classes qui accompagnent sp-link, ce qui aurait permis de modifier le code fonctionnel de bonjourajax...

    j espère avoir été assez clair pke à la relecture ça semble tout de même un peu confus...
    Bonjour,
    Apparemment cela ne fonctionne quand meme pas sur son appli Cordova

  20. #20
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Il me semble que c'était sa première préoccupation liée au fait que les éléments étaient simplement détruits et recrées et le fait de mettre un écouteur sur un parent à résolu ce problème.

    Le fait de maintenant vouloir cibler via le sélecteur [class="sp-link"], tout à était dit par les différents intervenants.

    Au passage @rooky06 il eut été préférable d'ouvrir une nouvelle discussion les deux soucis n'ayant rien à voir entre eux si ce n'est ton projet !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/10/2010, 20h49
  2. [AJAX] Méthode sous Ajax qui ne fonctionne qu'une fois?
    Par patrice419 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/04/2007, 13h19
  3. Réponses: 2
    Dernier message: 26/06/2006, 13h43
  4. Pourquoi ce popup s'ouvre qu'une fois ?
    Par psychoBob dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 01/06/2006, 12h11
  5. allocation dynamique ne fonctionne qu une fois.
    Par michael urbain dans le forum C
    Réponses: 7
    Dernier message: 11/03/2006, 10h51

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