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

JavaScript Discussion :

Fixer une valeur lors de son affectation


Sujet :

JavaScript

  1. #1
    Membre confirmé Avatar de d-Rek
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 438
    Points : 455
    Points
    455
    Par défaut Fixer une valeur lors de son affectation
    Bonjour à tous,

    C'est sûrement une question bête mais j'arrive pas à m'en sortir.
    Je génère des éléments à la volée sur lesquels je définie des évènements comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element.onmouseover=function(){maFonction(valeur1, valeur2);};
    Seulement dans ma boucle, valeur1 et valeur2 sont incrémentées différemment.
    Et le problème est qu'en fin de compte, tous les éléments ont la même valeur pour valeur1 et valeur2 soit valeur1 finale et valeur2 finale.

    Il faut donc que je fixe ces valeurs à l'instant où je définie l'évènement.
    Vous avez une idée ?

  2. #2
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    je n'ai pas très bien compris mais si tes valeurs ne sont pas des variables mais des valeurs en dur (dans le code montré) essaye de les mettre entre quote pour voir

  3. #3
    Membre confirmé Avatar de d-Rek
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 438
    Points : 455
    Points
    455
    Par défaut
    Si, si, mes valeurs (valeur1 et valeur2) sont variables..
    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
    function go(){
    	var valeur1=0, valeur2=0;
    	var content=document.createElement('div');
    	for(var i=0; i<10; i++){
    		var cell=document.createElement('div');
    		cell.onmouseover=function(){maFonction(valeur1, valeur2);};
    		cell.id='div'+i;
    		cell.style.border='1px solid #000000';
    		cell.style.width='10px';
    		cell.style.height='10px';
    		content.appendChild(cell);
    		valeur1=valeur1+5;
    		valeur2=valeur2+7;
    	}
    	document.getElementsByTagName('body')[0].appendChild(content);
    }
     
    function maFonction(v1, v2){
    	alert(v1+' ~ '+v2);
    }
    Après ça, toutes mes div font maFonction(50, 70); alors que par exemple div0 devrait faire maFonction(0, 0);

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Peut-être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(var i=0; i<10; i++){
    		var cell=document.createElement('div');
    		content.appendChild(cell);
    		cell.onmouseover=function(){maFonction(valeur1, valeur2);};
    		cell.id='div'+i;
    		cell.style.border='1px solid #000000';
    		cell.style.width='10px';
    		cell.style.height='10px';
    		valeur1+=5;
    		valeur2+=7;
    	}
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    cell.onmouseover="maFonction("+valeur1+","+ valeur2+");}";

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    J'suis pas bien sûr d'avoir compris mais je peux déjà te mettre en garde vis-à-vis du contexte de tes variables (scope).

    Lorsque tu fais ton branchement de fonction sur l'événement "mouseOver" tu définis une fonction qui dépend directement de tes variables "valeur1" et "valeur2" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell.onmouseover=function(){maFonction(valeur1, valeur2);};
    Effectivement, la définition de ta fonction, anonyme, ne mentionne pas de paramètres. Lorsqu'elle sera appelée "valeur1" et "valeur2" seront alors recherchées en dehors du scope de ta fonction et elle retourneront leur valeur au présent. En l'occurence, "valeur1" et "valeur2" sont définies au même endroit que tu définis ta fonction, c'est à dire dans le bloc de la fonction "go".

    Lorsque tu définis ces deux variables dans le cadre de ta fonction "go", elles n'existent que dans ce cadre (sauf si au niveau global tu en as défini d'autres, mais là ça se complique encore... ^^'). Ainsi, lorsque "go" est appelée, la p'tite tambouille se fait : "valeur1" et "valeur2" sont déclarées, une fonction anonyme est définie sur le tas et attribuée pour l'écoute d'événements et ensuite "valeur1" et "valeur2" prennent leurs valeurs finales, soit, en se basant sur ce que tu nous rapportes : 50 et 70.

    Si tu veux que ta fonction d'écoute fasse référence à des valeurs "arrêtées à un moment donnée" il faut utiliser qqchose qui ressemble à ce que Matthieu2000 vient de l'écrire (je pense que ça ne marche pas ton truc Matt') :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell.onmouseover = new Function("maFonction(" + valeur1 + ", " + valeur2");");
    (si tu as besoin de déclarer des paramètres pour cette fonction il faut passer leurs noms sous forme de chaînes de caractères, un à la fois, en paramètres à l'appel à "new Function", avant le corps de la fonction)

    "new Function" crée une fonction, avec pour corps le fragment que tu lui passes, sous forme d'une chaîne de caractères. Au moment où tu définis cette fonction, les valeurs de "valeur1" et "valeur2" sont alors arrêtées dans le temps.

    J'espère que tu as compris au moins qq-chose dans tout ça; c'est un peu tordu...

  7. #7
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    Citation Envoyé par TigRoO° Voir le message
    (je pense que ça ne marche pas ton truc Matt') :

    teste quand même des fois ca marche

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Pour te faire plaisir j'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $("field").onmouseover = new Function("console.log('pouet');");
    fonctionne alors que ce qui suit non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $("field").onmouseover = "console.log('pouet');";
    "onmouseover" comme tous ces callback doivent être des fonctions, ce n'est pas comme les attributes "href" des ancres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    anchor.href = "javascript:console.log('pouet');";
    devrait fonctionner.

    Ceci dit, utiliser les ancres pour introduire des intéractions dans une page n'est pas toujours la meilleure solution... ^^'

  9. #9
    Membre confirmé Avatar de d-Rek
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 438
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par TigRoO° Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell.onmouseover = new Function("maFonction(" + valeur1 + ", " + valeur2");");
    Exact. Je connaissais plus la syntaxe pour prendre les valeurs à l'instant T.
    Merci TigRoO°

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    De rien !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/03/2011, 10h34
  2. Scintillement d'une image lors de son déplacement
    Par johnbob789 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 31/07/2006, 15h04
  3. Reduire la taille d'une image lors de son upload
    Par mael94420 dans le forum ASP
    Réponses: 1
    Dernier message: 19/06/2006, 20h27
  4. fixer une valeur dans un menu deroulant
    Par donny dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/05/2005, 09h51
  5. Réponses: 6
    Dernier message: 27/01/2004, 16h08

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