I'm getting a bit of issues trying to hide arrays containing strings with special characters in checkboxes values. I've got these 3 DOM elements :
<div class="question-container form-group" data-id="235" data-parent-elements-visibility="["Choice 3 $^%&&_++_<>", "Choix deux, avec des virgules et des \"quotes\"", "Choix trois avec des a'postrop`hes et de deux [trucs] chelou<<."]" data-parent-id="304" id="question-container-235">
</div>
<div class="question-container form-group" data-id="307" data-parent-elements-visibility="["Choie 2 #\#$%^&*(", "Choice 3 $^%&&_++_<>", "Choix deux, avec des virgules et des \"quotes\"", "Choix trois avec des a'postrop`hes et de deux [trucs] chelou<<."]" data-parent-id="304" id="question-container-307">
</div>
<div class="question-container form-group" data-id="303" data-parent-elements-visibility="["Choie 2 #\#$%^&*(", "Choice 3 $^%&&_++_<>", "Choix 1 mon pote ! Avec des accent est des ç cédille", "Choix trois avec des a'postrop`hes et de deux [trucs] chelou<<."]" data-parent-id="304" id="question-container-303">
</div>
When I try to get the data attribute 'data-parents-elements-visibility', this is what I get :
$("#question-container-303").data('parent-elements-visibility')
"[\"Choie 2 #\\#$%^&*(\", \"Choice 3 $^%&&_++_<>\", \"Choix 1 mon pote ! Avec des accent est des ç cédille\", \"Choix trois avec des a'postrop`hes et de deux [trucs] chelou<<.\"]"
$("#question-container-307").data('parent-elements-visibility')
"[\"Choie 2 #\\#$%^&*(\", \"Choice 3 $^%&&_++_<>\", \"Choix deux, avec des virgules et des \\\"quotes\\\"\", \"Choix trois avec des a'postrop`hes et de deux [trucs] chelou<<.\"]"
$("#question-container-235").data('parent-elements-visibility')
(3) ["Choice 3 $^%&&_++_<>", "Choix deux, avec des virgules et des \"quotes\"", "Choix trois avec des a'postrop`hes et de deux [trucs] chelou<<."]
So question-container-235 behaves correctly and gives me an array back. Do you know why the other 2 are returning strings instead of the array ?
Thanks a lot !
The reason is data-parent-elements-visibility value in 307 has an issue with the 16th character which is a backslash. This is breaking content in between and avoid it being parse as an array.
Below will work fine(either double \ or none):
<div class="question-container form-group" data-id="307" data-parent-elements-visibility="["Choie 2 #\\#$%^&*(", "Choice 3 $^%&&_++_<>", "Choix deux, avec des virgules et des \"quotes\"", "Choix trois avec des a'postrop`hes et de deux [trucs] chelou<<."]" data-parent-id="304" id="question-container-307">
I guess the best way to handle it was what #zer00ne said : I reworked the entire thing to make an extra API call and have a nice json object to work with instead of storing that much stuff (user provided) in data attributes, which is prone to issues even if that backslash change might work in this particular case.
Thanks a lot !
Related
This question already has answers here:
How to select html nodes by ID with jquery when the id contains a dot?
(8 answers)
Closed 2 years ago.
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'orée d'un bois, mais aujourd'hui n'est pas un jour comme les autres. Aujourd'hui, vous partez à l'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'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'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'elles sont parfaitement inoffensives. Vous vous souvenez avoir lu qu'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'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>
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);
}
})
})
This question may seem as a duplicate one, but I cannot seem to find a solution for my problem.
I am fetching content from external websites using the iFramely API. Which works for almost all requested websites.
However, if I try to fetch for example a post from Reddit and display this in a sort of custom made 'preview box' the requested iFrame get rendered correctly, so far so good.
When I try to copy the HTML content of the 'preview box' in order to append it to another div using jQuery. It does not copy all HTML elements.
Complete function
$('#btn-add-extern-snippet').click(function() {
let embed_preview_container = $('#embed-preview');
let embed_target_number = $('#embed-target-number');
let target_number = $(embed_target_number).val();
$('.embed-no-' + target_number).html($(embed_preview_container).html());
...
});
I've tried the jQuery functions:
clone $('.embed-no-' + target_number).html($(embed_preview_container).clone());
html $('.embed-no-' + target_number).html($(embed_preview_container).html());
contents $('.embed-no-' + target_number).html($(embed_preview_container).contents());
using append $('.embed-no-' + target_number).append($(embed_preview_container).html());
But all of these functions do not seem the copy the full "innerHTML" of the mentioned 'preview box' (see pictures below).
The copied HTML content inside the 'other div' with an empty body & head.
The actual content in side the 'preview box'.
I must note here that this only seems to be te case for Reddit related content. It works for example with Soundcloud/Spotify/Bandcamp.
PS. I am using jQuery version 3.3.1
Code sample below:-
$("#copyToDiv").append($("#copyFromDiv").html());
Thanks
you can try this.
$('#copy').click(function(){
$('#div2').html($('#div1').html());
});
#div1{
background:green;
}
#div2{
background:blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id='copy'>Copy</button>
<div id='div1'>
<p>Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.
</p>
<div>
<h2>Lorem Ipsum</h2>
<p>Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles
</p>
</div>
<div id='div2'></div>
Alright, so I've found the solution/workaround to my own problem. Instead of copying the contents of the 'preview box', I stored the fetched HTML in a temporary variable, and appended the contents of this variable inside an 'another div' (this works).
Noteworthy, something strange that occurred to me while debugging is that the browser (in this case Chrome), does not render/display HTML correctly (see picture) (note the empty iFrame).
This is exactly what .html() copied. So long story short the following code worked for me:
// temporary variable for storing html.
let currentSnippet = '';
$('#btn-add-extern-snippet').click(function() {
let embed_preview_container = $('#embed-preview');
let embed_target_number = $('#embed-target-number');
let target_number = $(embed_target_number).val();
$('.embed-no-' + target_number).html(currentSnippet);
...
});
I have my string like this :
[[{"en":"Search\r\n","fr":"Chercher","it":"Cercare"}],[{"en":"MORE INFORMATION:","fr":"PLUS D'INFORAMTION:","it":"Informazioni:"}],[{"en":"Why choose us ?","fr":"Pourquoi nous choisir ?","it":"Perché scegliere noi?"}],[{"en":"Here are the main values that will lead you to choose ELGATEK for your IT project:","fr":"Voici les principales valeurs qui vous amèneront à choisir ELGATEK pour votre projet Informatique :","it":"I valori chiave che portano a scegliere ELGATEK per il vostro progetto IT:"}],[{"en":"CREATIVITY & INNOVATION","fr":"CRÉATIVITÉ & INNOVATION","it":"Creatività e Innovazione"}]
I want to replace all occurrence this part string ],[ with comma.
I tried str.replace('],[',',') but it works only on the first occurrence.
Please help.
Another way to achieve that :
let s = "[[{\"en\":\"Search\\r\\n\",\"fr\":\"Chercher\",\"it\":\"Cercare\"}],[{\"en\":\"MORE INFORMATION:\",\"fr\":\"PLUS D'INFORAMTION:\",\"it\":\"Informazioni:\"}],[{\"en\":\"Why choose us ?\",\"fr\":\"Pourquoi nous choisir ?\",\"it\":\"Perché scegliere noi?\"}],[{\"en\":\"Here are the main values that will lead you to choose ELGATEK for your IT project:\",\"fr\":\"Voici les principales valeurs qui vous amèneront à choisir ELGATEK pour votre projet Informatique :\",\"it\":\"I valori chiave che portano a scegliere ELGATEK per il vostro progetto IT:\"}],[{\"en\":\"CREATIVITY & INNOVATION\",\"fr\":\"CRÉATIVITÉ & INNOVATION\",\"it\":\"Creatività e Innovazione\"}]]\n";
var result = s.split('],[').join(',');
You try:
str.replace(/],\[/g, ',')
Might be easier to just use JSON.parse, then map the array. You can still stringify it if you really need it as a string, however I suppose you want to get an array of objects anyway.
let s = "[[{\"en\":\"Search\\r\\n\",\"fr\":\"Chercher\",\"it\":\"Cercare\"}],[{\"en\":\"MORE INFORMATION:\",\"fr\":\"PLUS D'INFORAMTION:\",\"it\":\"Informazioni:\"}],[{\"en\":\"Why choose us ?\",\"fr\":\"Pourquoi nous choisir ?\",\"it\":\"Perché scegliere noi?\"}],[{\"en\":\"Here are the main values that will lead you to choose ELGATEK for your IT project:\",\"fr\":\"Voici les principales valeurs qui vous amèneront à choisir ELGATEK pour votre projet Informatique :\",\"it\":\"I valori chiave che portano a scegliere ELGATEK per il vostro progetto IT:\"}],[{\"en\":\"CREATIVITY & INNOVATION\",\"fr\":\"CRÉATIVITÉ & INNOVATION\",\"it\":\"Creatività e Innovazione\"}]]\n";
let p = JSON.parse(s).map(e => e[0]);
console.log(p);
// if you really need it as a string:
console.log(JSON.stringify(p));
your string should replace like this:
var str = '[[{"en":"Search\r\n","fr":"Chercher","it":"Cercare"}],[{"en":"MORE INFORMATION:","fr":"PLUS D\'INFORAMTION:","it":"Informazioni:"}],[{"en":"Why choose us ?","fr":"Pourquoi nous choisir ?","it":"Perché scegliere noi?"}],[{"en":"Here are the main values that will lead you to choose ELGATEK for your IT project:","fr":"Voici les principales valeurs qui vous amèneront à choisir ELGATEK pour votre projet Informatique :","it":"I valori chiave che portano a scegliere ELGATEK per il vostro progetto IT:"}],[{"en":"CREATIVITY & INNOVATION","fr":"CRÉATIVITÉ & INNOVATION","it":"Creatività e Innovazione"}]]';
console.log(str.replace(/\[\{/g, '{').replace(/\}\]/g, '}'));
I have following data in JSON format and I want to parse in in JavaScript.
{"id":"897868990272958","posts":{"data":[{"id":"897868990272958_965738636819326","message":"As you are now aware, Federal elections have to be financed by personal donations only. To support my campaign, there is still tickets for my cocktail of Aug.27. at Balmoral's Community center. A 75% tax credit will be given for the net value of the ticket after expenses (+/- 33,75$ back into your pockets).\n\nComme vous le savez, les élections fédérales ne sont financées que par des dons personnels. Afin d'encourager ma campagne, il reste toujours des billets pour le cocktail du 27 août au centre communautaire de Balmoral. Un crédit d'impôt de 75% vous sera retourné sur la valeur net du billet après dépenses (+/- 33,75$ de retour dans vos poches).\n\nTo reserve tickets/pour réserver des billets: 753-6121.","comments":{"data":[{"id":"965738636819326_966081753451681","message":"je t'encourage mon rene mes indisponible ce soir"}],"paging":{"cursors":{"after":"MQ==","before":"MQ=="}}}},{"id":"897868990272958_965083470218176","message":"Hier, Haut-Madawaska !\n\nVisite d'entreprises et quelques poignées de mains à Clair et Baker Brook. Une visite éclaire à Saint-Hilaire et Edmundston puis, en soirée, rencontre avec le conseil municipal du Lac Baker. Le Haut-Madawaska est un exemple d'entrepreneurship et d'esprit d'initiative. Le chômage y est à zéro et on manque de travailleurs. Pas besoin d'envier la Beauce. À preuve, cette Coopérative qui vient de naitre à Clair et dont l'objectif ultime est de créer de l'emploi à partir de nos ressources à portée de main, et de miser sur la transformation. Bravo à tous ces convaincus et bénévoles qui ne jurent que par le mouvement coopératif et l'esprit communautaire.\n\nBravo aussi au conseil municipal et au maire suppléant du Lac Baker pour leur dévouement et l'énergie qu'ils mettent à protéger et développer ce bijoux de village.\n\nÀ entendre les gens que nous croisons, dans la rue ou dans les usines, nous recevons une oreille très attentive au Plan des libéraux, relativement à la classe moyenne. Il ne fait aucun doute, le vent tourne !"},{"id":"897868990272958_962429560483567","message":"Venez me rencontrer pour un cocktail !!!\nPour réserver votre billet, communiquez avec nous au quartier général libéral au 753-6121 (15 rue water, Campbellton NB)\n****************************************\nCome and meet me for a cocktail !!!\nTo reserve your tickets, please contact us at the liberal campaign office at 753-6121 (15 Water street, Campbellton NB)"},{"id":"897868990272958_961763833883473","message":"Hier, 18 août, visite de deux conseils municipaux coup sur coup !\n\nD'abord Balmoral. Comme d'autres municipalités de taille équivalente que j'ai déjà rencontrées, un conseil maitrisant ses dossiers avec des projets responsables et raisonnables à portée de réalisation. Il ne manque que la collaboration du fédéral qui n'est que trop absent. Bravo pour ce dynamisme.\n\nEnsuite Dalhousie. Comment ne pas lever son chapeau au maire Tremblay et ses conseillers et conseillères. Ils se battent pour notre petite ville du Restigouche-Est qui a subi des pertes de revenus «drastiques» suivant la fermeture du moulin et celle du plan thermique d'ÉNB. They are facing big challenges and they will have difficult decisions to take. We know the town's council will take those decisions in the best interest of it's community in mind. I will be there with an attentive ear to support their projets."},{"id":"897868990272958_961114093948447","message":"Aujourd'hui, Saint-Léonard au Rendez-vous des artistes !\n\nGrosse chaleur d'été, de beaux tableaux, de belles sculptures, des artistes extraordinaires et des gens qui nous laissent toujours entendre que... le vent tourne ! Je suis revenu à la maison avec ce tableau de circonstance en cette fin de semaine du 15 août. Merci à l'artiste-peintre Péruse. Surtout, toutes nos félicitations aux bénévoles qui ont encore fait un succès de ce rendez-vous des artistes.\n\nWarm day at «Le rendez-vous des artistes\". We saw beautiful paintings, sculpturs, and talked with interesting artists. And how pleasant it was to meet people. They surely let us know that the tide is turning ! I came back home with this beautiful painting right on the point for the ending weekend of the Acadian day. Thanks to artist-painter Péruse. Also, congratulations to all volunteers that made this artists gathering a success."}],"paging":{"previous":"https://graph.facebook.com/v2.4/897868990272958/posts?limit=5&fields=comments.limit%2815%29%7Bcomments%7Bmessage%7D,message%7D,message&since=1440606601&__paging_token=enc_AdD9KfoIkGsvwvKGKPHUvyEPbhuF2RoK63BKHTPw7tovNNMLZAZApH668RXKwpdMnnp7D6psZAc7wZAh0DlYIFoNPsjXjzfML0qyh30Oasasv9pyZAAZDZD&__previous=1","next":"https://graph.facebook.com/v2.4/897868990272958/posts?limit=5&fields=comments.limit%2815%29%7Bcomments%7Bmessage%7D,message%7D,message&until=1439765409&__paging_token=enc_AdDayGW6NPPTZA7gGT2HgRGZAVqinlc7ijLdPwYbZBexBpuBejfIzGdM42uW1GbO8epju5j8dDNv8qJ1lY8SMLZBZBQ3J0cIywdzQclw8KmqXv8HWlgZDZD"}}}
When I use the console of Google Chrome to do that it gives me an error. I want to write following lines:
var json = MY_DATA;
JSON.parse(json);
But when I want to assign my data to json the console gives me following error
Uncaught SyntaxError: Unexpected identifier(…)
What is the problem?
It looks like your JSON is already parsed to an object. You then try to parse it again and it is confused.
This is a pretty common mistake.
Some functionalities in jQuery automatically parse JSON and don't need to be explicitly told to.
#Adosi has already answered this correctly but I was adding an example so I'll include it anyway as it's too long for a comment. Add this to your code and open up your browser's console.
console.clear();
// your original data
var json = MY_DATA;
console.info("var json is a", typeof json);
console.log('json.id:', json.id);
// when json is stored as a string, it needs to be parsed.
// let's convert it back into a string and see what happens
var json_needing_parsing = JSON.stringify(json)
console.info("var json_needing_parsing is a", typeof json_needing_parsing);
console.log('json_needing_parsing.id:', json_needing_parsing.id); //undefined
// That didn't work. Let's parse it.
var json_parsed = JSON.parse(json_needing_parsing);
console.info("var json_parsed is a", typeof json_parsed);
console.log("json_parsed.id:", json_parsed.id);
Here it is in action. http://jsfiddle.net/qn9xkt7c/ (because the Stack Snippet editor was cross at me for the giant json object)
I'm using a jQuery "homemade" script (that I found here) and I'de like to start this one when the scroll reaches the tab block (the blue and grey block at the end of the page).
Here is a live version
My HTML :
<section id="Block" class="container-fluid block">
<div class="row accordeon">
<div class="blue">
<ul class="nav nav-tabs" id="myTab">
<li class="active">1 - Déposez un projet appel d’offre et recevez en moyenne 10 devis</li>
<li>2 - Comparez les devis et négociez librement</li>
<li>3 - Choississez le prestataire que vous voulez, quand vous voulez</li>
<li>4 - Payez le prestataire par le moyen de votre choix</li>
<li>5 - Evaluez le prestataire sur Codeur.com</li>
</ul>
</div>
<div class="gray">
<div class="tab-content">
<div class="tab-pane active" id="deposer">
<h4 class="text-left">1 - Déposez un projet appel d’offre et recevez en moyenne 10 devis</h4>
<p>Sans même vous inscrire, vous publiez votre projet. Il correspond à un appel d'offres auquel les prestataires vont répondre. C'est gratuit et l'inscription se fait automatiquement et simultanément.</p>
<p>Une fois le projet publié sur Codeur, les prestataires concernés sont avertis. Vous n'avez rien d'autre à faire. Vous recevez rapidement des devis gratuits qui seront classés sous la description de votre projet.</p>
<p>En savoir plus sur le dépot de projet :</p>
<ul class="unstyled">
<li><a class="shake" href="#">Comment créer mon projet ?<i class="icon-arrow"></i></a></li>
<li><a class="shake" href="#">Comment bien décrire mon projet ?<i class="icon-arrow"></i></a></li>
</ul>
</div>
<div class="tab-pane" id="comparer">
<h4 class="text-left">2 - Comparez les devis et négociez librement</h4>
<p>Comparez les devis et discutez avec leurs prestataires par messagerie privée, par messagerie instantanée ou par téléphone (si vous le souhaitez). Vous pouvez aussi modifier votre projet et donner des précisions aux prestataires. Vous négociez librement et mettez les prestataires en concurrence pour obtenir les meilleurs prix et délais et les meilleures prestations.</p>
<p>En savoir plus sur :</p>
<ul class="unstyled">
<li><a class="shake" href="#">Comment inviter un prestataire à faire une offre sur mon projet ?<i class="icon-arrow"></i></a></li>
<li><a class="shake" href="#">Comment utiliser la messagerie ?<i class="icon-arrow"></i></a></li>
</ul>
</div>
<div class="tab-pane" id="choisir">
<h4 class="text-left">3 - Choississez le prestataire que vous voulez, quand vous voulez</h4>
<p>C'est vous qui décidez quand et si vous sélectionnez un prestataire. Vous sélectionnez la personne que vous voulez. C'est très simple, il vous suffit de le sélectionner à partir de la fiche de votre projet.</p>
<p>Choisir un prestataire sur Codeur vous permettra de l'évaluer à l'issue de sa prestation. Vous pouvez aussi demander, avant de commencer le projet, de signer un devis en bonne et due forme.</p>
<ul class="unstyled">
<li><a class="shake" href="#">Comment choisir un prestataire pour réaliser mon projet ?<i class="icon-arrow"></i></a></li>
<li><a class="shake" href="#">Pourquoi attribuer un projet sur Codeur.com est il plus sûr ?<i class="icon-arrow"></i></a></li>
</ul>
</div>
<div class="tab-pane" id="payer">
<h4>4 - Payez le prestataire par le moyen de votre choix</h4>
<p>C'est vous qui décidez comment vous réglez votre prestataire. Vous discutez avec lui du moyen de paiement qui vous convient à tous les deux. Pour plus de sécurité, vous pouvez bloquer le paiement sur Codeur Tasks en début de projet, et vous libérez le paiement par étape : à chaque étape réalisée correspond un paiement. Cela permet d'éviter la plupart des litiges.</p>
</div>
<div class="tab-pane" id="evaluer">
<h4>5 - Evaluez le prestataire sur Codeur.com</h4>
<p>Dès la fin du projet, vous pouvez évaluer le prestataire. Votre évaluation sera publiée sur le site et si elle est positive, aidera le prestataire à trouver de nouveaux projets. Le prestataire pourra également vous évaluer et ainsi renforcer votre réputation sur Codeur.com pour trouver un prestataire lors de la publication d'un prochain projet.</p>
</div>
</div>
</div>
</div>
</section>
My script for scrolling :
<!-- Show anim on Scroll -->
<script>
$(document).ready(function() {
/* Every time the window is scrolled ... */
$(window).scroll( function(){
/* Check the location of each desired element */
$('.ShowMe').each( function(i){
var bottom_of_object = $(this).offset().top + $(this).outerHeight();
var bottom_of_window = $(window).scrollTop() + $(window).height();
/* If the object is completely visible in the window, fade it it */
if( bottom_of_window > bottom_of_object ){
$(this).animate({'opacity':'1'},500);
}
});
});
});
</script>
My script for the tab animation :
<!-- Tabs -->
<script>
var tabChange = function () {
var tabs = $('.nav-tabs > li');
var active = tabs.filter('.active');
var next = active.next('li').length ? active.next('li').find('a') : tabs.filter(':first-child').find('a');
// Use the Bootsrap tab show method
next.tab('show');
};
// Tab Cycle function
var tabCycle = setInterval(tabChange, 5000);
// Tab click event handler
$('a').on('click', function (e) {
e.preventDefault();
// Stop the cycle
clearInterval(tabCycle);
// Show the clicked tabs associated tab-pane
$(this).tab('show');
// Start the cycle again in a predefined amount of time
setTimeout(function () {
//tabCycle = setInterval(tabChange, 5000);
}, 15000);
});
</script>
I think first off all you need to check if the object is within your screen after you scroll. If you reach the object then check with an if statement if the object is visible and then you should execute your code.
Look at this DEMO and see the whole JS function.
JS
$(window).scroll(function() {
if (checkVisible($('#tester'))) {
alert("Visible!!! Paste your code in this if function!")
} else {
// do nothing
}
});
In your case would that be:
$(window).scroll(function() {
if (checkVisible($('#tester'))) {
var tabChange = function () {
var tabs = $('.nav-tabs > li');
var active = tabs.filter('.active');
var next = active.next('li').length ? active.next('li').find('a') : tabs.filter(':first-child').find('a');
// Use the Bootsrap tab show method
next.tab('show');
};
// Tab Cycle function
var tabCycle = setInterval(tabChange, 5000);
// Tab click event handler
$('a').on('click', function (e) {
e.preventDefault();
// Stop the cycle
clearInterval(tabCycle);
// Show the clicked tabs associated tab-pane
$(this).tab('show');
// Start the cycle again in a predefined amount of time
setTimeout(function () {
//tabCycle = setInterval(tabChange, 5000);
}, 15000);
});
} else {
// do nothing
}
});
Hope this helps!
---EDIT:
To solve that the function is called multiple times you need to unbind the scroll event.
Add this to your code: $(window).off('scroll');
$(window).on('scroll', function() {
if (checkVisible($('#Block'))) {
$(window).off('scroll'); # add this
var tabChange = function () {