0

I'm trying to retrieve an element with jquery, but I can't ... The element with the corresponding id is created and present on my source code, however, with the correct selector, it remains undefined.

my html:

<div id='container-journal'>
    <!--Pour scroll jusqu'au nouveau texte-->
    <button id='btn-scroll'>Scroll</button>
    <input type="text" id='scroll_to' value="{{scroll_to}}" >

    <div id="cadre-sommaire" class="list-group">
        {{sommaire_html|safe}}
    </div>
    <div id='cadre-textes' data-spy="scroll" data-target="#cadre-sommaire" data-offset="30" class="scrollspy-example">
        {{textes_html|safe}}
        <div id='to-be-continued'>
            <img id="image-stylo" src="{% static 'aventures/stylo_plume.png' %}" alt="un stylo plume">
        </div>
    </div>
</div>

The searched element is located in the variable textes_html. When the input has the value: '#cha-3-sit-4.2' My source gives me the element: <p id="cha-3-sit-4.2" class="texte-chap-situ heros-concernes">...</p>

JS code:

$(function() {
  $('#container-journal').on('click', '#btn-scroll', function() {
    var scroll_to = $('#scroll_to').val()
    if (scroll_to.length) {
      $('#cadre-textes').animate({
        scrollTop: $(scroll_to).offset().top
      }, 1000);
    }
  })
})

I guess the reason is because the DOM is created from a variable, but I don't understand why this is a problem. Sorry, I'm a beginner.

Thx !

add: Im using Django Here the created source:

<div id='container-journal'>
   <!--Pour scroll jusqu'au nouveau texte-->
   <button id='btn-scroll'>Scroll</button>
   <input type="text" id='scroll_to' value="#cha-3-sit-4.2" >

   <div id="cadre-sommaire" class="list-group">
       <a class='list-group-item list-group-item-action chapitre  sommaire' href='#chapitre-1'>Chapitre 1 : Préparatifs</a><a class="list-group-item list-group-item-action tour sommaire" href="#chap-1-situ-1" >Se préparer pour le ...</a><a class='list-group-item list-group-item-action chapitre  sommaire' href='#chapitre-2'>Chapitre 2 : La grande plaine</a><a class="list-group-item list-group-item-action tour sommaire" href="#chap-2-situ-2" >La grande champignon...</a><a class='list-group-item list-group-item-action chapitre active sommaire' href='#chapitre-3'>Chapitre 3 : La forêt enchantée</a><a class="list-group-item list-group-item-action tour sommaire" href="#chap-3-situ-1" >Choix du chemin dans...</a><a class="list-group-item list-group-item-action tour sommaire" href="#chap-3-situ-4" >La vieille cabane</a>
   </div>
   <div id='cadre-textes' data-spy="scroll" data-target="#cadre-sommaire" data-offset="30" class="scrollspy-example">
   <hr class='hr-tour'><h3 class='journal-h' id='chapitre-1'>Chapitre 1 : Préparatifs</h3><hr class='hr-tour'><span class='texte-chap-situ'>Vous vivez dans un petit village à l&#x27;orée d&#x27;un bois, mais aujourd&#x27;hui n&#x27;est pas un jour comme les autres. Aujourd&#x27;hui, vous partez à l&#x27;aventure. <br>Aujourd’hui, vous partez défier un dragon et vous comptez bien revenir avec un trésor!</span><br><br><hr class='hr-tour'><h4 class='journal-h' id='chap-1-situ-1'>Se préparer pour le voyage</h4><hr class='hr-tour'><p class="tours">Tour n° 1.</p><br><p id="cha-1-sit-1.0" class="texte-chap-situ heros-concernes">Polux, pantouffle et mirouffle.</p><p class="texte-chap-situ">Pour trouver le dragon, vous allez rencontrer de nombreux dangers. Il faut donc bien vous préparer et pour cela une petite visite dans le village s&#x27;impose !</p><br><hr class='hr-tour'><h3 class='journal-h' id='chapitre-2'>Chapitre 2 : La grande plaine</h3><hr class='hr-tour'><span class='texte-chap-situ'>Alors que vous quittez le village, vous découvrez un vaste paysage, mais pas des plus faciles à parcourir.</span><br><br><p class="tours">Tour n° 2.</p><br><hr class='hr-tour'><h4 class='journal-h' id='chap-2-situ-2'>La grande champignonnière</h4><hr class='hr-tour'><p class="tours">Tour n° 3.</p><br><p id="cha-2-sit-2.0" class="texte-chap-situ heros-concernes">Polux, pantouffle et mirouffle.</p><p class="texte-chap-situ">Vous entrez dans la grande champignonnière. Tout est sombre et humide partout autour de vous, des petites silhouettes tapies dans l&#x27;ombre semblent vous observer. Elles sont de plus en plus nombreuses.</p><p class="texte-chap-situ">Vous avez déjà entendu parler de ces créatures, et êtes convaincus qu&#x27;elles sont parfaitement inoffensives. Vous vous souvenez avoir lu qu&#x27;elles sont très craintives et sensibles au bruit.</p><br><p class="journal-heros"><em><strong>Polux</strong> souhaite essayer de leur parler.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">Pas très sûr de toi, tu essaies d’entrer en contact avec les petites créatures. Tes paroles résonnent dans la champignonnière, les silhouettes se bouchent les oreilles et finissent par disparaître. Alors que tu t’apprêtes à repartir, un peu déçu, tu remarques l’une d’entre elles venant à toi et poussant d’étranges chaussons faits de feuilles et d’écorce. Ils sont très confortables, mais surtout, tes pas ne font plus aucun bruit.</div></div><hr><br><p class="journal-heros"><em><strong>Mirouffle</strong> souhaite courir et essayer de les semer avec l'aide de <strong>Pantouffle</strong>.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/echec.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">D’un coup, vous vous élancez et vous mettez à courir le plus vite possible sans regarder derrière vous. Vous vous rendez rapidement compte que les petites créatures ne vous encerclaient pas réellement, mais qu’en réalité, la forêt en est remplie. Sans pour autant les voir, vous sentez l’agitation causée par votre fuite et en comprenez un peu tard la raison : vous piétinez de nombreux champignons, et cet acte de destruction semble les affoler.</div></div><hr><br><p id="cha-2-sit-2.1" class="texte-chap-situ heros-concernes">Pantouffle et mirouffle.</p><p class="texte-chap-situ">La limite de la champignonnière n’est plus très éloignée et il est fort probable qu’on ne te suivra pas en dehors, mais devant l’attitude de plus en plus agitée des petites silhouettes, vous réfléchissez à la meilleure démarche à suivre…</p><br><p class="journal-heros"><em><strong>Pantouffle</strong> souhaite arrêter de courir.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">Comprenant l’agitation crée par ta fuite, tu décides de t’arrêter. Les créatures se calment à leur tour, leurs visages restent fermés, mais elles ne font pas signe de vouloir s’approcher. Après quelques instants, tu reprends lentement la route en faisant bien attention à ne pas piétiner les champignons, tu comprends vite que cette attitude est plus raisonnable et ressens l’apaisement des petites silhouettes environnantes. Elles te surveillent jusqu’à la sortie de la champignonnière, que tu n’es pas malheureux de quitter.</div></div><hr><br><p class="journal-heros"><em><strong>Mirouffle</strong> souhaite continuer à courir.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite_critique.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">Tu redoubles d’effort et parviens à sortir de la champignonnière. Tu es épuisé et a besoin de te reposer un bon moment afin de récupérer de tes émotions.</div></div><hr><hr class='hr-tour'><h3 class='journal-h' id='chapitre-3'>Chapitre 3 : La forêt enchantée</h3><hr class='hr-tour'><span class='texte-chap-situ'>Vous laissez enfin la grande plaine derrière vous. Il fait chaud et vous ne seriez pas mécontent d’arriver en forêt si vous ne vous étiez pas un minimum renseigné sur ce qui vous attend. Autrefois rayonnante et pleine de vie, la Forêt Enchantée est désormais plongée dans l’obscurité et le silence, on la surnomme d’ailleurs maintenant la « Forêt Maudite ». Force est de constater qu’il ne reste plus grand-chose de l’ancienne magie, pure et bienfaisante. Les créatures que l’on y rencontre ne sont pas toutes malsaines, non, mais disons que la tendance n’est clairement plus aux bénédictions.</span><br><br><hr class='hr-tour'><h4 class='journal-h' id='chap-3-situ-1'>Choix du chemin dans la forêt</h4><hr class='hr-tour'><p class="tours">Tour n° 4.</p><br><p id="cha-3-sit-1.0" class="texte-chap-situ heros-concernes">Polux, pantouffle et mirouffle.</p><p class="texte-chap-situ">Arrivés dans la forêt, trois choix s’offrent à vous.<br>Le premier sentier mène aux anciennes sources d’eau chaude, autrefois très appréciées des voyageurs. Malheureusement, Kaa, un python d’une taille gigantesque, a décidé d’en faire son territoire. Le second sentier, à l’opposé du premier, risque de vous mener tout droit chez Verrula, une sorcière méchante et hideuse comme il se doit. Enfin, il est possible d’éviter ces sentiers, la progression en sera plus difficile et semée d’obstacles, mais les mauvaises rencontres moins certaines.</p><br><p class="journal-heros"><em><strong>Pantouffle</strong> souhaite le sentier de la sorcière avec l'aide de <strong>Mirouffle et Polux</strong>.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">En vous engageant sur ce chemin, vous vous remémorez ce que vous savez sur la sorcière. Verrula est installée dans la forêt depuis bien longtemps, il semble qu’elle se soit elle-même tournée vers le côté obscur progressivement, comme la forêt. Ainsi tout n’est pas perdu, peut-être lui reste-t-il un peu de gentillesse. Quoi qu’il en soit, elle a la fâcheuse tendance à se servir des aventuriers de passage comme cobayes pour ses expériences. Oh, ils finissent tous par ressortir de la forêt un jour ou l’autre… Il paraît que le dernier est rentré chez lui avec un nez de cochon.</div></div><hr><hr class='hr-tour'><h4 class='journal-h' id='chap-3-situ-4'>La vieille cabane</h4><hr class='hr-tour'><p class="tours">Tour n° 5.</p><br><p id="cha-3-sit-4.0" class="texte-chap-situ heros-concernes">Polux, pantouffle et mirouffle.</p><p class="texte-chap-situ">Vous vous engagez sur le sentier de la sorcière et remarquez très vite, à votre grand plaisir, que cette partie de la forêt semble avoir gardée un peu de son charme d’autrefois. Les arbres paraissent plus verts, moins serrés les uns contre les autres et le chemin en meilleur état. Bref, la promenade commence bien.<br>Bientôt vous découvrez une petite cabane en bois au bord du chemin. Le moins que l’on puisse dire, c’est qu’elle n’inspire pas confiance, elle est dans un sale état mais sa construction, robuste, ne laisse pas de place au doute quant à sa solidité. Ici et là sont accrochés aux murs d’étranges outils dont vous n’avez aucune idée de l’utilité, vous vous demandez d’ailleurs s’ils ne sont pas purement « décoratifs ». Vous remarquez aussi que diverses parties animales y sont accrochées, ce qui a pour effet de vous inquiéter davantage.<br>S’agit-il de la maison de la sorcière ? Celle-ci paraissant abandonnée, votre curiosité vous pousse à vous en approcher. Vous allez jusqu’à poser l’oreille contre la porte, à l’affut d’un bruit.<br>« Crrrrôôôôaaaaaa, crôa crôôaaaaaa ! » Un bruit infernal retentit alors derrière la porte, suivi de tapotements frénétiques contre la paroi. Vous sursautez et faites un bond en arrière. La créature enfermée dans cette cabane semble en grande détresse, son attitude indique clairement un appel à l’aide ! Mais vous n’avez plus vraiment de doute quant à la propriétaire des lieux, cette cabane appartient à la sorcière.</p><br><p class="journal-heros"><em><strong>Polux</strong> souhaite entrer dans la cabane avec l'aide de <strong>Pantouffle</strong>.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">Quelque soit l’animal qui se trouve derrière cette porte, il a besoin de votre aide et vous ne pouvez pas vous résigner à passer votre chemin. La peur au ventre, vous essayez d’ouvrir discrètement la porte. Malheureusement, elle semble fermée de l’intérieur et vous n’avez pas d’autre choix que de rentrer en force. Elle cède facilement et vous vous retrouvez propulsés à l’intérieur. <br>Ce que vous découvrez est plus étrange encore qu’à l’extérieur : des ingrédients inconnus, des ustensiles de cuisine, des fioles et bocaux aux contenus douteux, de vieux livres poussiéreux sur des étagères bancales… Et une marmite posée dans la cheminée, au-dessus d’un feu mourant.</div></div><hr><br><p class="journal-heros"><em><strong>Mirouffle</strong> souhaite continuer son chemin.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">La prudence est de mise dans une telle situation. Quel que soit l’animal qui se trouve derrière cette porte, vous estimez que le risque de tomber nez à nez avec la sorcière est trop élevé, il pourrait d’ailleurs s’agir d’un piège, ou réveiller la sorcière de sa sieste... Vous n’avez aucune envie de vous attarder sur les lieux et vous vous éloignez en courant de la vieille cabane.</div></div><hr><br><p id="cha-3-sit-4.1" class="texte-chap-situ heros-concernes">Polux et pantouffle.</p><p class="texte-chap-situ">Les croassements vous ramènent à la réalité, le seul être vivant que vous trouvez en ce lieu ressemble à un corbeau, le bec bien trop gros, les ailes atrophiées et à moitié déplumé. Pas de sorcière à l’horizon, c’est un grand soulagement. Mais le corbeau ne vous laisse pas de répit, il sautille vers un objet d’apparence ronde et cristalline et le tapote du bec, vous indiquant de le prendre. Au moment ou l’un de vous saisit l’objet, une faible lueur s’en dégage et il est assailli par des paroles : « Aide-moi ! Aide-moi ! La fiole ! La fiole ! »<br>Vous comprenez que le corbeau surexcité peut vous parler par l’intermédiaire de cet objet magique.</p><br><p class="journal-heros"><em><strong>Polux</strong> souhaite rester pour aider le corbeau.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">Ce pauvre animal te semble louche. Pourtant tu ne peux pas te résoudre à l’abandonner et décides de rester l’aider.</div></div><hr><br><p class="journal-heros"><em><strong>Pantouffle</strong> souhaite quitter les lieux et prendre l'objet.</em></p><div class="row" style="margin: 0;"><div class="col-3" ><img class="img-result-journal" src="/static/aventures/reussite.png" alt="Image correspondant au résultat de l'action."></div><div class="journal-texte-tour col-9">Cette situation ne te plaît pas, le corbeau ne t’inspire rien de bon. Tu préfères quitter les lieux sans trainer et glisses l’objet magique dans ta poche avant de sortir, le corbeau te poursuit quelques instants en te demandant de reposer l’objet, enfin en t&#x27;invectivant de tous les noms d’oiseaux ! Tu finis par le chasser plus vigoureusement et te sauves en courant, pas très fier de ton attitude.</div></div><hr><br><p id="cha-3-sit-4.2" class="texte-chap-situ heros-concernes">Pantouffle et mirouffle.</p><p class="texte-chap-situ">Vous courez un bon moment avant de vous considérer en sécurité, cette cabane était vraiment effrayante. Vous êtes fatigué d’avoir autant couru et avez besoin de refaire le plein d’énergie. Il faut marcher encore un peu avant de trouver un endroit acceptable pour une petite pause.<br>L’endroit est idéal, ensoleillé, placé au bord d’une rivière, un ancien banc usé par le temps et datant d’une époque où il faisait bon se promener en ce lieu, et cerise sur le gâteau, un magnifique pommier rempli de fruits mûrs.</p>
    <div id='to-be-continued'>
        <img id="image-stylo" src="/static/aventures/stylo_plume.png" alt="un stylo plume">
    </div>
</div>

If my DOM is not fully loaded, how can I wait until my variable is loaded before executing my function?

edit2: The consol errors:

Uncaught TypeError: $(...).offset() is undefined
<anonymous> http://127.0.0.1:8000/static/aventures/js/chapitre.js:252
jQuery 8
    dispatch
    handle
    add
    ke
    each
    each
    ke
    on
<anonymous> http://127.0.0.1:8000/static/aventures/js/chapitre.js:247
jQuery 13
    e
    t
    setTimeout handler*l/<
    c
    fireWith
    fire
    c
    fireWith
    ready
    B
    EventListener.handleEvent*
    <anonymous>
    <anonymous>
chapitre.js:252:33
<anonyme> http://127.0.0.1:8000/static/aventures/js/chapitre.js:252
jQuery 8
    dispatch
    handle
    (Asynchrone : EventListener.handleEvent)
add
    ke
    each
    each
    ke
    on
<anonyme> http://127.0.0.1:8000/static/aventures/js/chapitre.js:247
jQuery 13
    e
    t
    (Asynchrone : setTimeout handler)
l
    c
    fireWith
    fire
    c
    fireWith
    ready
    B
    (Asynchrone : EventListener.handleEvent)
<anonyme>
    <anonyme>
    <anonyme>
Niko71
  • 45
  • 1
  • 8
  • Where is the element in the html code above ? what kind of template/framework is that ? Looks like the element gets generated dynamic, and is not present in the dom on load/init – Marc Oct 18 '20 at 20:54
  • can you try replace `$('#container-journal').on('click',.....` with `$(document).on('click',` ? Do you see console errors? – john Smith Oct 18 '20 at 20:59
  • hi, still got: `Uncaught TypeError: Cannot read property 'top' of undefined` – Niko71 Oct 18 '20 at 21:09
  • Please include any console errors in the question itself. Is your `scroll-to` element hidden? [As `.offset()` does not work with hidden elements](https://api.jquery.com/offset/). – Jon P Oct 18 '20 at 21:54
  • Console errors added. No it isn't hidden. Tried by removing all other JS functions, same result. – Niko71 Oct 19 '20 at 07:26
  • You'd have to escape the `.` into `\.`. (even better to remove them from your markup if possible). – Kaiido Oct 19 '20 at 08:41
  • Oh yes thanks a lot! – Niko71 Oct 19 '20 at 11:12

1 Answers1

0

If you are getting Uncaught TypeError: Cannot read property 'top' of undefined it means your event handler is executing.

I think the problem is that the variable scroll_to is not a DOM node, instead, you are just saving the value inside the node ($('#scroll_to').val())

What if you try:

$(function() {
  $('#container-journal').on('click', '#btn-scroll', function() {
    var scroll_to = $('#scroll_to')
    if (scroll_to.val().length) {
      $('#cadre-textes').animate({
        scrollTop: scroll_to.offset().top
      }, 1000);
    }
  })
})

  • It doesn't work, I don't want to scroll to my input '#scroll_to', but get its value which I use as selector. – Niko71 Oct 19 '20 at 07:29