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 :

Fenêtres modales récursives


Sujet :

jQuery

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut Fenêtres modales récursives
    Bonjour,

    J'ai besoin pour un projet de faire un petit système de popup modales (qui se mettent au 1er plan et qui empêchent l'utilisateur d’accéder à ce qui est en arrière plan) et récursive. Comme ça fait un moment qu'on me parle de jquery, je me suis dit aller hop, j'essaye de faire avec !

    Soyez donc indulgent envers quelqu'un qui s'y est mis voilà tout juste quelques heures.

    J'en reviens à mon problème. Mes 1er essais donnent quelque chose de sympa (merci à l'auteur de ce petit tuto), mais l'aspect "récursif" ne marche absolument pas...

    je met des guillemet autour de récursif car dans mon implémentation, ça ne l'est pas vraiment. Je fait juste un affichage de popup les nes par dessus les autres.

    Les CSS :
    Code css : 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
    div.popupbg{
    	display: none;
    	position: fixed;
    	top: 0%;
    	left: 0%;
    	width: 100%;
    	height: 100%;
    	background-color: #000;
    	opacity:0.8;
    	filter: alpha(opacity=80);
    }
    div.divpopup {
    	display: none; 
    	background: #fff;
    	padding: 20px;
    	border: 10px solid #d0d0d0;
    	float: left;
    	position: fixed;
    	top: 50%; left: 50%;
    	box-shadow: 0px 0px 10px #000;
    	border-radius: 10px;
    }
    img.close_button {
    	float: right;
    	margin: -55px -55px 0 0;
    }
    a.popup{
          color:#F00;
    }


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html>
    <meta charset="utf-8"> 
    <head>
        <script language="javascript" type="text/javascript" src="./js/jquery-2.1.1.js"></script>
    </head>
    <body>
    <a data-width="200" href="#" class="popup" >mon lien</a>
    <div style="position:absolute;z-index:2000;"><a data-width="200" href="#" class="popup" >mon nouveau lien</a></div>
    </body>
    </html>
    <script language="javascript">
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    var z_level = 1000;
    var id_item = 1;
    $(function(){
    	$('a.popup').on('click', function() {
     
    		z_level += 10;
    		var current_id = "item" + ++id_item;
    		//alert(current_id);
    		$('<div/>') .attr('class', 'popupbg')
    					.attr('z-index', z_level)
    					.attr('id', current_id + "popupbg")
    					.html('')
    					.appendTo($('body'))
    					;
     
    		$('<div/>') .attr('class', 'divpopup')
    					.attr('id', current_id )
    					.attr('z-index', z_level + 1)
    					.html('')
    					.appendTo($('body'));
     
    		$('<img/>')
    					.css('cursor', 'pointer')
    					.attr('src', './img/close.gif')
    					.attr('class', 'close_button')
    					.on('click', function(event) { 
    										  return function(item_id){
    											  $('#'+item_id).fadeOut(100, function() {$('#'+item_id).remove();});
    											  $('#'+item_id + "popupbg").fadeOut(100, function() {$('#'+item_id + "popupbg").remove();});
    										  }(current_id);
    										 })	
    					.prependTo($('#'+current_id));
     
    		$('div#'+current_id).fadeIn(250).css({'width':Number($(this).data('width'))});
    		$('div#'+current_id + "popupbg").fadeIn(250)
     
                    // 1er essai
    		//$('div#'+current_id).append('<a data-width="300" href="#" class="popup" >lien semi statique : '+current_id+'</a>')
     
                    // 2eme essai
    		//$('<a/>').attr('href', '#').attr('class', 'popup').attr('data-width', '400').html('lien dynamique').appendTo($('div#'+current_id));
     
     
    	});
     
    });

    Pour vous épargner le plus possible la séance de déchiffrage du code, le principe est simplement lorsque l'on clique sur un lien de class a.popup de créer une 1er div fixe grisée qui recouvre la page, et de mettre par dessus une div qui correspond à la popup.
    A chaque nouvelle fenetre ouverte, les ID et le Z-index sont générés dynamiquement (et séquentiellement) grâce à des variables globales.

    Seulement voilà, tant que les liens existent sur la page principales, pas de problèmes, ça marche et je peux ouvrir autant de popup que je veux les unes par dessus les autres ("mon nouveau lien" qui reste au 1er plan permet de tester ce principe).

    En revanche, quand je génère dynamiquement une nouvelle balise a de même class à l'intérieur de la popup créée... bha ça ne marche pas...

    J'avais d'abord tenter d'ajouter le nouveau lien à l'intérieur de la popup créé avec la méthode append() de jquery (1er essai commenté dans le code). Le lien est bien la, mais il ne se passe rien quand je clique dessus. J'ai supposé que append devait faire un genre de innerHTML et que peut être que jquery n'avait alors pas connaissance de l'existance de l'objet <a> créé, et j'ai donc tenté une 2ème méthode plus dynamique (2eme essai commenté dans le code)... mais pas mieux...

    Bref, je suis un peu bloqué car j'ai bien l'impression que jquery ne fonctionne pas sur les balises créées dynamiquement, et ça me parait gros pour que ça soit le cas...

    Y aurait-il donc une ame charitable qui y voit plus clair que moi et qui puisse me mettre sur la voix pour résoudre ce problème ?

    En vous remerciant !

    EDIT :

    J'ai une pseudo-solution qui consiste à transformer ma fonction anonyme en une fonction classique MkPopup() et a ré associer manuellement l’événement avec .on('click', MkPopup) à chaque balise <a> créées dynamiquement... La solution ne me satisfait que moyennement, mais tend à confirmer ma dernière hypothèse. Des avis ?

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonjour

    [...] j'ai bien l'impression que jquery ne fonctionne pas sur les balises créées dynamiquement, et ça me parait gros pour que ça soit le cas...
    $( selecteur parent non dyamique ).on( events, selecteur enfant dynamique, function(){ ... }); // <a href="http://api.jquery.com/on/" target="_blank">http://api.jquery.com/on/</a>.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    C'est la pseudo-solution que j'avais trouvé...

    Bon, je ferais avec !

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerBuilder] Récupérer la main sur une fenêtre modale
    Par jpdar dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 14h21
  2. Modifier un champ à partir d'une fenêtre modale
    Par ahoyeau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/03/2005, 16h53
  3. Formulaire dans une fenêtre modale
    Par Amnesiak dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 14h25
  4. Supprimer la croix dans une fenêtre modale
    Par AnneOlga dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/01/2004, 14h52
  5. Rendre une fenêtre modale non modale
    Par Smortex dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/03/2003, 17h56

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