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 :

connaitre l'objet ayant déclanché l'évenement ?


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut connaitre l'objet ayant déclanché l'évenement ?
    voilà, je génère un certain nombre de xhr (dépendant de la page) et je leur affecte tous une fonction commune pour le onreadystatechange, mais il faudrait que je puisse savoir à l'execution de la fonction quel objet xhr a généré cet évenement pour récupérer la page web qu'il a téléchargée).
    J'ai essayé 'this', qui pointe sur la fonction en elle meme, j'ai donc ensuite essayé this.parent, this.owner, tous deux indéfinis.
    Si quelqu'un sait comment faire...

  2. #2
    Invité
    Invité(e)
    Par défaut
    salut

    je ne suis pas du tout certain que ça te donnera l'objet xhr, mais as-tu essayé la propriété caller ?

    sinon au pire tu peux passer par une variable globale : quand un objet xhr est actif, tu le stocke dans une var globale que tu peux récupérer dans ton onreadystatechange... c'est pas super propre, mais au moins t'es sûr que ça marche
    Dernière modification par Deepin ; 11/05/2011 à 11h42.

  3. #3
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par XecTech
    voilà, je génère un certain nombre de xhr (dépendant de la page) et je leur affecte tous une fonction commune pour le onreadystatechange, mais il faudrait que je puisse savoir à l'execution de la fonction quel objet xhr a généré cet évenement pour récupérer la page web qu'il a téléchargée).
    J'ai essayé 'this', qui pointe sur la fonction en elle meme, j'ai donc ensuite essayé this.parent, this.owner, tous deux indéfinis.
    Si quelqu'un sait comment faire...
    Je pense que tu vas devoir le faire manuellement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function callBack(objet_xhr) {
      var texte = objet_xhr.responseText;
      // traitement à faire
    }
    puis, pour ton xhr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    xhr.onreadystatechange=function(){callBack(xhr)};
    xhr2.onreadystatechange=function(){callBack(xhr2)};
    etc...
    A mon avis, ça devrait fonctionner...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut
    Citation Envoyé par torvalds17
    salut
    sinon au pire tu peux passer par une variable globale : quand un objet xhr est actif, tu le stocke dans une var globale que tu peux récupérer dans ton onreadystatechange... c'est pas super propre, mais au moins t'es sûr que ça marche
    Et je fais comment pour savoir quelle variable globale stock le bon xhr ? au maximum j'en ai 50 qui bossent en meme temps...

  5. #5
    Membre éprouvé Avatar de rieppe
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Par défaut
    Citation Envoyé par XecTech
    Et je fais comment pour savoir quelle variable globale stock le bon xhr ? au maximum j'en ai 50 qui bossent en meme temps...
    Utiliser un tableau de xhr ? Ton indice serait le numéro du xhr, ca peut t'aider ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut
    Citation Envoyé par torvalds17
    salut
    je ne suis pas du tout certain que ça te donnera l'objet xhr, mais as-tu essayé la propriété caller ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    La propriété caller pointe vers l'objet de type Function responsable de l'appel à ma_fonction. Cette propriété n'est donc accessible que dans le corps de la fonction.
    Si ma_fonction n'est pas appelée depuis une autre fonction, caller vaut null.
    cela ne conviendra malheureusement pas, je cherche un objet et pas une fonction, mais merci, je ne connaissais pas du tout cette propriété :-D

  7. #7
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par denisC
    Je pense que tu vas devoir le faire manuellement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function callBack(objet_xhr) {
      var texte = objet_xhr.responseText;
      // traitement à faire
    }
    puis, pour ton xhr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    xhr.onreadystatechange=function(){callBack(xhr)};
    xhr2.onreadystatechange=function(){callBack(xhr2)};
    etc...
    A mon avis, ça devrait fonctionner...
    Ping? (pourquoi personne ne lis mes posts? )

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut
    Citation Envoyé par rieppe
    Utiliser un tableau de xhr ? Ton indice serait le numéro du xhr, ca peut t'aider ?
    c'est ce que je fais, malheureusement dans le corp de ma fonction je n'arrive pas à savoir quel était la valeur de l'index car j'utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    xhrs[i] = new XMLHttpRequest();
    	xhrs[i].onreadystatechange = function() {
    		alert(sender);
    		if(xhrs[i].readyState == 4 && xhrs[i].status == 200){
    			document.getElementById('esp'+i).innerHTML = xhrs[i].responseText;
    		}
    	}
    	xhrs[i].open("GET", "http://kureuilgames.free.fr/MPP/esprep.php", true);
    	xhrs[i].send('');
    or le i n'est interpreté qu'à l'execution de la fonction et non à sa création, je n'obtiens donc pas le bon index.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut
    Citation Envoyé par denisC
    Ping? (pourquoi personne ne lis mes posts? )
    malheureusement je suis confronté au meme problème, mes xhr sont indexés par un variant, cela va donc donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xhrs[i].onreadystatechange=function(){callBack(xhrs[i])};
    or ce i ne sera interpretté qu'à l'execution et n'aura plus la bonne valeur.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Par défaut
    et si tu encapsulais le tout à l'aide d'une classe ?

    basiquement et sans avoir testé :
    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
     
     
    xhr[i]=new objXhr(i);
    xhr[i].req.open("GET", "http://kureuilgames.free.fr/MPP/esprep.php", true);
    ...
     
    ObjXhr=function(id_obj) {
        this.id_obj=id_obj;
        this.req=new XMLHttpRequest();
     
        /*
            appel de la fonction de callback à l'aide de call()
            le premier argument référence l'objet en cours
        */
        this.req.onreadystatechange=CallBack.call(this);
    }
     
    function CallBack() {
        //recuperation de l'id à l'aide de this.id_obj
     
        //traitements
    }
    si la variable xhr n'est pas global tu ne devrais pas avoir besoin de faire de tableau.

    sinon c'est vite fait donc faudra surement adapté et faire une plus jolie classe

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut
    Citation Envoyé par tthierry
    et si tu encapsulais le tout à l'aide d'une classe ?

    basiquement et sans avoir testé :
    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
     
     
    xhr[i]=new objXhr(i);
    xhr[i].req.open("GET", "http://kureuilgames.free.fr/MPP/esprep.php", true);
    ...
     
    ObjXhr=function(id_obj) {
        this.id_obj=id_obj;
        this.req=new XMLHttpRequest();
     
        /*
            appel de la fonction de callback à l'aide de call()
            le premier argument référence l'objet en cours
        */
        this.req.onreadystatechange=CallBack.call(this);
    }
     
    function CallBack() {
        //recuperation de l'id à l'aide de this.id_obj
     
        //traitements
    }
    si la variable xhr n'est pas global tu ne devrais pas avoir besoin de faire de tableau.

    sinon c'est vite fait donc faudra surement adapté et faire une plus jolie classe
    Merci, je testerais ça dès que possible et mettrais le tag "résolus" s'il y a lieu.
    En attendant, si quelqu'un a une autre idée, plus j'apprends mieux je me porte ^^

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut
    j'ai adapté ton idée à mon script, ça qui m'a donné ça :
    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
    function XhrE(i, doc) {
    	this.id = i;
    	this.doc = doc;
    	this.xhr = new XMLHttpRequest();
    	function orsc(obj) {
    		alert(obj.id + ':' + obj.xhr.readyState + ':' + obj.xhr.status); //debugging
    		if(obj.xhr.readyState == 4 && obj.xhr.status == 200){
    			alert(obj.xhr.responseText);
    			obj.doc.getElementById('esp'+obj.id).innerHTML = obj.xhr.responseText;
    		}
    	}
    	this.xhr.onreadystatechange = orsc(this);
    	this.xhr.open("GET", "mon url...", true);
    	this.xhr.send('');
    }
    la création se passe sans problème, seulement je n'obtiens qu'un message par xhr créé : 'x:0:0', x étant biensur l'id correspondant, c'est comme si l'open et le send n'agissaient pas. Je sais que cela devient hors sujet mais je poste d'abord ici avant de polluer le forum avec un nouveau thread...
    sinon merci, le problème initial est résolu (j'ai bien mon id).

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Par défaut
    si tu veux garder cette syntaxe essaie plutôt un truc dans le genre (ça aidera js à retrouver ces petits) :

    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
     
    function XhrE(i, doc) {
    	this.id = i;
    	this.doc = doc;
    	this.xhr = new XMLHttpRequest();
     
            var obj=this;
    	this.xhr.onreadystatechange = function() {
    		alert(obj.id + ':' + obj.xhr.readyState + ':' + obj.xhr.status); //debugging
    		if(obj.xhr.readyState == 4 && obj.xhr.status == 200){
    			alert(obj.xhr.responseText);
    			obj.doc.getElementById('esp'+obj.id).innerHTML = obj.xhr.responseText;
    		}
    	}
    	this.xhr.open("GET", "mon url...", true);
    	this.xhr.send('');
    }
    sinon tu peux essayer de factoriser en déléguant à chaque méthode de ta classe une fonctionnalité (récupérer les différents paramètre de ton objet lors de sa construction, gérer le xmlhttprequest en fonction du navigateur, gestion du onreadyState, construction de la chaîne de requete en get ou post,... ) et mettre la fonction de callback à l'extérieur de la classe (suffirais de passer sa référence au constructeur).

    ça te permettrais d'utiliser cette classe dans tous tes projets en te facilitant ce type de requête

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 39
    Par défaut
    merci, c'est parfait :-D, je vais enfin pouvoir commencer la partie la plus interressante du projet ^^

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/01/2007, 10h30
  2. Connaitre l'objet appelant
    Par aurelien94 dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2006, 12h51
  3. Réponses: 13
    Dernier message: 20/03/2006, 15h31
  4. Récupérer le type d'objet ayant le focus
    Par pilz dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/02/2006, 15h31
  5. [POO] Conflit avec objet ayant le meme name
    Par ozzmax dans le forum Langage
    Réponses: 7
    Dernier message: 11/01/2006, 18h06

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