11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

en fait, je me demande comment est-ce que je peux faire pour que mon code jQuery fonctionne sur du code généré dynamiquement.

En fait, j'ai un module de recherche que j'appelle en ajax et je retourne le code généré à partir de la page PHP que j'appelle en Ajax.

Le problème, c'est que mon code jQuery ne réagit plus sur ce code généré dynamiquement.

Existe-il une solution pour que ce code réagisse au jQuery ou n'ai-je d'autre choix que de soumettre le formulaire ?

Merci d'avance

Bon dimanche.

Thierry
Si tu parles des events de jQuery, tu dois les ajouter après le chargement de tes éléments en ajax.

Ce qu'il faut comprendre lorsque tu fais :

$( ".class" ).click(function() {
});


N'est pas qu'il faut déclencher la fonction à chaque click sur l'élément .class mais qu'on attache un événement au click sur chaque élément .class qui existent à cet instant T.

Si tu ajoutes du code dynamiquement avec l'élément .class, ceux-ci n'auront pas d'événement click d'attaché donc il ne se passera rien. Tu peux observer facilement tout ça avec l'inspecteur de ton navigateur.
Modérateur
Et l'eau,

Il faut comprendre une chose : si tu déclares un événement sur un élément alors qu'il n'est pas dans le DOM, tu auras beau cliquer (par exemple) sur cet élément, rien ne se passera.
Tu as plusieurs solutions pour remédier à ce souci. Je vais t'en donner deux puisque les dernières concernent le Javascript natif et c'est plus délicat à mettre en place quand on ne connaît pas bien le sujet :

1ère solution:
Dans le callback de ta requête AJAX, tu déclares ton ou tes événement/s après l'insertion de ton/tes élément/s dans le dom

2e solution (en jquery seulement):
Ton sélecteur doit être un point d'appui et cibler "le/s élément/s absent/s" pour attribuer l'événement souhaité.
ex :

<div class="containerAjax"> <!-- point d'appui -->
    <div class="elementCible">element 1</div> <!-- élément inséré en AJAX -->
    <div class="elementCible">element 2</div> <!-- élément inséré en AJAX -->
    <div class="elementCible">element 3</div> <!-- élément inséré en AJAX -->
</div>


$('.containerAjax').on('click', '.elementCible', function(){
    //etc.
});

Modifié par niuxe (28 Jul 2019 - 17:37)
Bonjour Niuxe et bacasable,

d'abord, je tenais à vous remercier pour votre aide et vos conseils.

J'ai créé sur codepen une copie de mon code.

En fait, en cliquant sur le bouton "Ajout article", il ajoute un article au tout début.

Sur chaque article, il est normalement possible de voter. Quand on clique sur un article existant, il réagit. Par contre, quand on clique sur un nouvel article, il ne réagit plus.

Voici le code :

https://codepen.io/anon/pen/GVWgOK

Merci à vous.

Bonne journée

Thierry
Bonjour bacasable,

merci pour votre réponse. Le problème, c'est qu'en faisant ce que vous m'avez dit de faire, je ne suis plus sûr que mon code fonctionnera car le code risque de ne plus réagir sur les bonnes propriétés du code HTML (class et id).

En plus, je n'ai jamais été confronté à un tel problème.

Bonne journée
Thierry
Tu peux faire tout les essais nécessaires dans ton pen. Tu reçois quand même des réponses de qualité, j'espère que tu en as conscience, donc le minimum c'est de lire et de mettre la main à la patte pour modifier ton code. On peut te donner des indications supplémentaire si tu ne comprend pas mais personnellement je ne ferai jamais ton code à ta place.
Modifié par bacasable (30 Jul 2019 - 11:35)
Bonjour Niuxe,

tout d'abord, je tenais encore à vous remercier pour votre disposition, votre aide et vos conseils.

En fait, j'ai une question pour ma culture IT à vous poser.

Quand on génère du code dynamiquement via javascript et qu'on inspecte le code source par après, on peut remarquer que ce nouveau code HTML ne se trouve pas dans le code source. Qu'est-ce qui explique cela ? Je suppose que c'est parce qu'il ne fait pas partie du DOM dès le départ ? A ce moment, où se trouve ce code ? Ce code se trouve dans la mémoire cache ou autre part ?

Merci d'avance

Bonne journée
Thierry
Modérateur
bacasable a écrit :
Tu peux faire tout les essais nécessaires dans ton pen. Tu reçois quand même des réponses de qualité, j'espère que tu en as conscience, donc le minimum c'est de lire et de mettre la main à la patte pour modifier ton code. On peut te donner des indications supplémentaire si tu ne comprend pas mais personnellement je ne ferai jamais ton code à ta place.

C'est un peu maladroitement dit, mais j'abonde dans ton sens.

THIRT05 a écrit :

merci pour votre réponse. Le problème, c'est qu'en faisant ce que vous m'avez dit de faire, je ne suis plus sûr que mon code fonctionnera car le code risque de ne plus réagir sur les bonnes propriétés du code HTML (class et id).


Quand tu n'es pas sûr, ce n'est pas un problème en soit. Tu gardes ton code dans un fichier annexe dans ton disque dur. Le mieux étant de versionner. Mais là, je sais que tu vas te perdre puisque tu ne connais pas ce genre d'outils (SVN / GIT).

THIRT05 a écrit :

En plus, je n'ai jamais été confronté à un tel problème.


Ce n'est pas un problème non plus puisque tu viens ici sur Alsacreations pour apprendre et non gratter des scripts. Je pourrais te donner le poisson. Mais le mieux et de t'apprendre à pêcher, n'est ce pas ?

Ceci dit, là je suis un peu occupé. Mais en lisant ton code, j'ai vu ceci (qui ne fait pas propre):


$newArticle = "<div class='article'>";
$newArticle += "  <div class='first_line_header clearfix'>";
$newArticle += "    <div class='header_title_1'>";
$newArticle += "      <span class='header_title_text'>Article N</span>";
$newArticle += "    </div>";
$newArticle += "    <div class='header_title_2'>";
$newArticle += "      le retour du beau temps";
$newArticle += "    </div>";
$newArticle += "  </div>";
$newArticle += "  <div class='second_line_header clearfix'>";
$newArticle += "    <div class='vote ' id='vote_1' data-ref='ARTICLE' data-ref_id='1'>";
$newArticle += "      <div class='vote_btns'>";
$newArticle += "        <button class='vote_btn vote_like'><span class='like_count'>0</span></button>";
$newArticle += "        <button class='vote_btn vote_dislike'><span class='dislike_count'>0</span></button>";
$newArticle += "      </div>";
$newArticle += "    </div>";
$newArticle += "  </div>";
$newArticle += "</div>";


Tu déclares la variable d'une manière globale. C'est vraiment pas bon puisque celle ci peut rentrer en collision avec le même nom dans ton script plus tard. Pour preuve, si tu essaies de faire un console.log en dehors de ta function anonyme, tu vas voir que tu y as accès.


console.log(window.$newArticle);


Je t'invite à parcourir cet article : la portée en javascript (J'ai découvert ce site il y a pas longtemps lorsque j'ai partagé un lien à un membre. Il me semble qu'il soit bien foutu pour débuter dans le développement web. Il suffit de lire et de faire .)

Ensuite, je te propose d'utiliser la template string. Ça va t'éviter bien des déboires et ce sera plus lisible :

var maVar = `

Lorem ipsum dolor sit amet, consectetur adipisicing elit. 

Quos enim neque modi vero eveniet maxime dolores iure facere placeat nam, vel quibusdam laudantium ipsa, odio quaerat mollitia sit amet, assumenda! ipsum dolor sit amet, consectetur adipisicing elit. Eveniet assumenda, vel libero quod optio, deserunt omnis labore. Quidem veritatis totam laborum veniam, atque, numquam deserunt labore maxime rem consequuntur tempora! ipsum dolor sit amet, consectetur adipisicing elit. Non autem suscipit corporis voluptatum dolor, ipsa. Optio vel dolorum reiciendis iusto neque?

Odit dicta cumque quae ut unde. 

A, delectus, debitis. ipsum dolor sit amet, consectetur adipisicing elit. 
Dicta sit asperiores quisquam adipisci neque sint, rem harum odit rerum ab non perferendis recusandae, debitis, iure. 
Sunt iste quo necessitatibus voluptas. ipsum dolor sit amet, consectetur adipisicing elit. 
Asperiores ut temporibus veritatis magnam voluptates ipsa ducimus voluptate numquam 
quod architecto beatae quos assumenda, ipsam a non iste illum mollitia, esse.`;



Remarque bien comment est délimité la chaîne de caractères. Ce type de chaîne de caractères permet d'utiliser les sauts de lignes, d'éviter d'échapper les guillemets double ou simple. Et puis c'est nettement plus lisible n'est il pas ? Question annexe : Comment insérer une expression javascript dans un template string ?


var nombre1 = 3;
var nombre2 = 5;
var template = `
    la multiplication de 
    ${nombre1} x ${nombre2}
    vaut : 
    ${ nombre1 * nombre2 }
`;


Pour chipoter, tu utilises "$" comme début du nom de variable. Or, on va plutôt l'utiliser lorsque la variable fait référence à un élément dans le DOM.


var $monElementId = $('#unId')


Prend le temps d'apprendre. Paris ne s'est pas fait en un jour. Aller trop vite, c'est le mur !! Tu as de la chance, en ce moment, j'ai un peu de temps. Profite !
Modifié par niuxe (30 Jul 2019 - 18:37)
Modérateur
THIRT05 a écrit :


tout d'abord, je tenais encore à vous remercier pour votre disposition, votre aide et vos conseils.

Il n'y a pas de souci Smiley smile

THIRT05 a écrit :

Quand on génère du code dynamiquement via javascript et qu'on inspecte le code source par après, on peut remarquer que ce nouveau code HTML ne se trouve pas dans le code source. Qu'est-ce qui explique cela ? Je suppose que c'est parce qu'il ne fait pas partie du DOM dès le départ ? A ce moment, où se trouve ce code ? Ce code se trouve dans la mémoire cache ou autre part ?


remarque et question pertinente !

En fait, tu t'es donné la réponse. En effet, le code html injecté via le js va se retrouver dans la mémoire du navigateur. Il ne sera pas consultable dans le code source du html (je ne parle pas du code de la console Smiley cligne )

Qu'est ce que cela implique ? Quels sont les avantages et inconvénients ?
les avantages sont énormes mais les inconvénients aussi !
les avantages (quelques exemples):
- quand l'utilisateur fait une action, le script js (si ça était développé ainsi) va rendre une vue (page) suivant ce que l'utilisateur désire. exemple :
- - l'utilisateur est sur une liste d'articles et il clique pour en consulter un.
- - l'utilisateur est sur sa boite mail et il souhaite rédiger un email. Il clique et une fenêtre s'ouvre pour qu'il puisse éditer son email
quel est l'avantage ? il ne fait pas une requête serveur proprement dit. Ces actions sont distillées au fil du temps via de l'Ajax. De ce fait, les performances sont accrues ! certains éléments sont d'ores et déjà en mémoire et affichés le moment opportun (je te montre/je te cache)

les inconvénients (quelques exemples):
- oublie le référencement puisque le html injecté n'est pas dans le code source. Bien qu'il y ait la technique du serveur rendering qui palie à ce problème, je trouve que c'est du n'importe quoi (réinvention de la roue)
- "l'accessibilité" puisque le html injecté n'est pas dans le code source. J'ai mis entres guillemets puisque j'ai appris il y a quelques temps que les navigateurs accessibles peuvent lire le JS. Mais bon, la navigation au clavier par exemple est à faire la plupart du temps....

Pourquoi utiliser ce genre de techniques ?
Lorsque tu veux faire du deep web (ne pas confondre avec le dark net Smiley cligne ). Le deep web regroupe toutes les applications / site où tu vas te retrouver dans un espace personnel. Exemple : gestion de ton compte internet danss un site tel Orange/free/bouygues. gestion de ta boite mail sur Gmail. Cela ne nécessite pas un référencement n'est ce pas ? Smiley cligne

Avec quels outils on peut faire ce genre de choses ?
le javascript natif (vanillaJs pour les intimes) ou avec jquery, tu peux très bien le faire. Mais cela nécessite une méthodologie et une structure/architecture type (MV ou MVC ou HMVC)
Tu as des outils plus adaptés comme :

- EmberJS
- KnowoutJS
- BackboneJS Smiley love couplé avec Underscore et jQuery. Pendant quelques temps j'ai développé avec cette outil. Et puis le travail d'Ashkenas (son créateur) .... Maintenant c'est un outil désué et il y a mieux.
- AngularJS
- ReactJS Smiley love
- VueJS Smiley love
- SvelteJS (documentation et tuto très bien foutu)
- etc.
Modifié par niuxe (30 Jul 2019 - 19:48)
Bonsoir Niuxe,

une dernière fois pour ce sujet, je tenais à te remercier pour ton aide, ta disponibilité et tes conseils ...

Merci beaucoup et bonne soirée à toi,
Thierry