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 :

id (créé à la volée) non interprété


Sujet :

jQuery

  1. #1
    Invité
    Invité(e)
    Par défaut id (créé à la volée) non interprété
    Bonjour,
    voici un exemple simpliste de mon questionnement :
    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
    <!DOCTYPE HTML><html>
    <head>
    <!-- Scripts jQuery : initialisation -->
    <script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
    	$('#idBloc_1').click( function () {
    		changeBloc_2_from_1();
    	});
    	$('#idBloc_2').click( function () {
    		changeBloc_3_from_2();
    	});
    });
    function changeBloc_2_from_1(){
    	var txthtml = 'Bloc 2 : <span id="idBloc_2">-> maintenant, changer le Bloc 3</span>';
    	$('#ajaxBloc2').html(txthtml);
    }
    function changeBloc_3_from_2(){
    	var txthtml = 'Bloc 3 : youpi ! ca marche !';
    	$('#ajaxBloc3').html(txthtml);
    }
    </script>
    </head>
    <body>
    		<p>Bloc 1 : <span id="idBloc_1">-> changer le Bloc 2</span></p>
    		<p id="ajaxBloc2">Bloc 2 : (...)</p>
    		<p id="ajaxBloc3">Bloc 3 : (...)</p>
    </body>
    </html>
    Bloc 1 : -> changer le Bloc 2
    Bloc 2 : (...)
    Bloc 3 : (...)
    1/ On clique sur "-> changer le Bloc 2" :
    le Bloc 2 affiche "Bloc 2 : -> maintenant, changer le Bloc 3"
    Bloc 1 : -> changer le Bloc 2
    Bloc 2 : -> maintenant, changer le Bloc 3
    Bloc 3 : (...)
    2/ MAIS quand on clique ensuite sur "-> maintenant, changer le Bloc 3", CA NE fonctionne PAS...

    Je pense que ça vient du fait que <span id="idBloc_2"> ne soit pas dans le DOM "de départ", mais j'aimerais :
    - comprendre pourquoi ça ne fonctionne pas,
    - et surtout comment y remédier !
    Merci.


    PS1 : Je voudrais éviter la solution (qui fonctionne, mais... ceci n'est qu'un exemple simpliste...) :
    => re-déclarer $('#idBloc_2').click(........) DANS la fonction changeBloc_2_from_1()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function changeBloc_2_from_1(){
    	var txthtml = 'Bloc 2 : <span id="idBloc_2">-> maintenant, changer le Bloc 3</span>';
    	$('#ajaxBloc2').html(txthtml);
    	// ON REMET ICI : 
    	$('#idBloc_2').click( function () {
    		changeBloc_3_from_2();
    	});
    }
    PS 2 : je voudrais éviter aussi de mettre des onclick="..." ou onchange="..." ou autres dans le code html
    Comme ici : (ca fonctionne très bien, mais c'est justement ce que je ne veux pas faire !) :

    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
    <!DOCTYPE HTML><html>
    <head>
    <!-- Scripts jQuery : initialisation -->
    <script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
    <script type="text/javascript">
    function changeBloc_2_from_1(){
    	var txthtml = 'Bloc 2 : <span id="idBloc_2" onclick="changeBloc_3_from_2();">-> maintenant, changer le Bloc 3</span>';
    	$('#ajaxBloc2').html(txthtml);
    }
    function changeBloc_3_from_2(){
    	var txthtml = 'Bloc 3 : youpi ! ca marche !';
    	$('#ajaxBloc3').html(txthtml);
    }
    </script>
    </head>
    <body>
    		<p>Bloc 1 : <span onclick="changeBloc_2_from_1();">-> changer le Bloc 2</span></p>
    		<p id="ajaxBloc2">Bloc 2 : (...)</p>
    		<p id="ajaxBloc3">Bloc 3 : (...)</p>
    </body>
    </html>
    PS : vous aurez compris que les variables "var txthtml = ..." peuvent provenir d'un appel Ajax, et être bien plus complexe qu'un simple "youpi !"
    Dernière modification par Invité ; 24/07/2012 à 18h18.

  2. #2
    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 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    ben si les elements n'existent pas au moment du ready ... il est normal que l'on ne puisse pas leur attribuer directement d'evenements.

    il faut par par on() ou delegate()

    sinon au moment de sa création ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function changeBloc_2_from_1(){
    	$('#ajaxBloc2').append($('<span/>').attr('id',"idBloc_2").click( changeBloc_3_from_2).text('-> maintenant, changer le Bloc 3')
    }
    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 !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci SpaceFrog,
    delegate() fonctionne (dans mon exemple simpliste) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	$('body').delegate('#idBloc_2', 'click', function () {
    		changeBloc_3_from_2();
    	});
    Je teste en "situation réelle" tout de suite...

    [EDIT] Nickel chrome ! ca fonctionne très bien (listes liées jQuery/Ajax...)

    Encore merci à la Grenouille de l'Espace.

  4. #4
    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 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    oui et au passage le 3 paramètre étant une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $('body').delegate('#idBloc_2', 'click', changeBloc_3_from_2);
    un petit résolu pour la route ?
    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 !

  5. #5
    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
    Bonsoir,
    il semblerait préférable de migrer vers .on().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(document).on( 'click','#idBloc_2', changeBloc_3_from_2)
    ou mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $('#ajaxBloc2').on( 'click','span', changeBloc_3_from_2);

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci NoSmoking,
    j'avais essayé, mais avec une mauvaise syntaxe.

    En effet, ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	$('#ajaxBloc2').on('click', '#idBloc_2', function () {
    		changeBloc_3_from_2();
    		// ...autres actions : appels ajax, coup de téléphone à un ami, 50-50, joker,... c'est mon dernier mot Jean-Pierre,...
    	});
    Bloc 1 : -> changer le Bloc 2
    Bloc 2 : -> maintenant, changer le Bloc 3
    Bloc 3 : youpi ! ca marche !
    PS :
    - dans la "vraie vie", je fais appel à plusieurs actions (pas uniquement changeBloc_3_from_2()).
    - et je mets '#idBloc_2' car mon action s'effectue (toujours dans la "vraie vie") sur un <input>, un <select>, ou autre...
    - l'action elle-même peut être 'click', 'change', 'keyup',...

    Voici ce que j'obtiens dans la "vraie vie" (listes liées Pays/départements/CP/Ville) :
    Code javascript : 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
    $(document).ready(function(){
    	/* PAYS : select -> on change */
    	$('body').on('change', '#'+id_paysId, function () {
    		changeDeptSelectFromPays();
    		resetCPInput();
    		resetVilleInput();
    	});
     
    	/* DEPARTEMENT : select -> on change */
    	$('body').on('change', '#'+id_deptId, function () {
    		changeCPInputFromDept();
    		changeVilleSelectFromDept();
    	});
     
    	/* CP : input -> on keyup */
    	$('body').on('keyup', '#'+id_CP, function () {
    		changeVilleSelectFromCP();
    	});
     
    	/* VILLE : input -> on keyup */
    	$('body').on('keyup', '#'+id_Ville, function () {
    		changeCPSelectFromVille();
    	});
    	/* VILLE : select -> on change */
    	$('body').on('change', '#'+id_Ville, function () {
    		changeCPSelectFromVille();
    	});
     
    });
    Dernière modification par Invité ; 25/07/2012 à 10h40.

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

Discussions similaires

  1. [JSTL] <x:transform> non interprété
    Par Pi2 dans le forum Taglibs
    Réponses: 1
    Dernier message: 21/07/2006, 16h43
  2. index.php non interprété directement
    Par Celeborn dans le forum Apache
    Réponses: 3
    Dernier message: 04/07/2006, 14h21
  3. variable d'environnement windows non interprétée
    Par rogerio dans le forum Windows
    Réponses: 4
    Dernier message: 02/06/2006, 07h06
  4. balises non interprétées sous IE mais bien sous FF
    Par trotters213 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 27/04/2006, 14h31
  5. IIS et code ASP non interprété
    Par christel1982 dans le forum ASP
    Réponses: 4
    Dernier message: 25/10/2005, 09h26

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