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

Bibliothèques & Frameworks Discussion :

Réaffecter un Event.observe


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 17
    Points : 16
    Points
    16
    Par défaut Réaffecter un Event.observe
    Bonjour,

    Je suis en train de découvrir Prototype et Scriptaculous, mais je bloque sur un petit point (de détail j'espère).

    Je cherche à faire un tableau de scores, que l'utilisateur remplis en faisant glisser les valeurs sur les cases (exemple). Jusque là, pas de problème. A chaque fois que l'utilisateur ajoute une valeur, elle est enregistrée dans la base de données. Ce traitement se fait en AJAX, et fonctionne également.

    La fonction AJAX retourne le code HTML du tableau, que je réinjecte dans la page, à la place du code de l'ancien tableau. A partir de là, les cellules n'interceptent plus les évènement. Et même si je relance un Event.observe(window, 'load', fonction, false), rien ne se passe.

    Ci dessous quelques fragments du code JS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function glisser0() {
    	new Draggable('point_0', {revert: true});
    }
    function glisser05() {
    	new Draggable('point_05', {revert: true});
    }
    function glisser1() {
    	new Draggable('point_1', {revert: true});
    }
    ...
    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
    function preparerCellules() {
     
    	var classes = new Array('2_1', '2_2', '2_3', '2_4', '2_5',
    		'2_6', '2_7', '2_8', '2_9', 'prof');
     
    	for (var i=0; i<classes.length; i++) {
    		Droppables.add('h09_'+classes[i], {
    			accept: 'points',
    			onDrop: function(classe, cellule) {
    				test(9, classe.id, cellule.id);
    			}
    		});
    		Droppables.add('h10_'+classes[i], {
    			accept: 'points', overclass: 'active2',
    			onDrop: function(classe, cellule) {
    				test(10, classe.id, cellule.id);
    			}
    		});
    		...
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Event.observe(window, 'load', glisser0, false);
    Event.observe(window, 'load', glisser05, false);
    Event.observe(window, 'load', glisser1, false);
    Event.observe(window, 'load', glisser15, false);
    Event.observe(window, 'load', glisser2, false);
    Event.observe(window, 'load', glisser25, false);
    Event.observe(window, 'load', glisser3, false);
    Event.observe(window, 'load', glisser35, false);
    Event.observe(window, 'load', glisser4, false);
    Event.observe(window, 'load', glisser45, false);
    Event.observe(window, 'load', glisser5, false);
    Event.observe(window, 'load', preparerCellules, false);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ajouterPoint(heure, point, equipe) {
     
    	var demande = 'heure='+heure+'&point='+point+'&equipe='+equipe;
    	var url = 'action/score_ajouterPoint.action.php';
     
    	requete.open("POST", url, true);
    	requete.onreadystatechange = callbackAjouterPoint;
    	requete.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    	requete.send(demande);	
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function callbackAjouterPoint() {
     
    	if (requete.readyState == 4) {
    		if (requete.status == 200) {
     
    			document.getElementById('principal').innerHTML = requete.responseText;
    			Event.observe(window, 'load', preparerCellules, false);
    		}
    	}
     
    }

  2. #2
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    L'évènement load est lancé une seule fois, au chargement de la page. Donc tu ne peux plus le réappeler dans callbackAjouterPoint() puisque la page est déja chargée.

    Appelle directement toutes tes méthodes à la place de Event.observe(window, 'load', preparerCellules, false), ca devrait marcher

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Merci, c'est exactement ça ...

    J'ai une seconde question, découlant de la première. Au fur et à mesure, le glissement devient de plus en plus saccadé, comme si la page devenait lourde. Est-ce que ça viendrait d'une surcharge d'évènement. Si oui, peut-on en supprimer ?

  4. #4
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    T'as la méthode destroy qui s'applique à un draggable pour détruire l'instance.

    Tu peux par exemple faire un truc dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var arrayDraggables = new Array();
     
    function glisser0() {
    	arrayDraggables.push(new Draggable('point_0', {revert: true}));
    }
    function glisser05() {
    	arrayDraggables.push(new Draggable('point_05', {revert: true}));
    }
    function glisser1() {
    	arrayDraggables.push(new Draggable('point_1', {revert: true}));
    }
    ...
    Et tu les supprimes tous juste avant de recréer ta div:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (var v=arrayDraggables.length-1; v>0;v--){
       arrayDraggables[v].destroy();
       arrayDraggables.pop();
    }

Discussions similaires

  1. Event.observe baisse de performance ?
    Par Promesses dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 16/06/2008, 09h09
  2. Event.observe (plusieurs objets)
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 10/06/2008, 14h14
  3. Event.observe sur IE
    Par moumoune65 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/07/2007, 11h45
  4. [Prototype] Appel Event observe
    Par sorenson2 dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 17/07/2007, 12h02
  5. event.observe ne fonctionne pas sous IE
    Par mikees dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/06/2007, 18h48

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