begin process at 2012 05 29 18:57:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Javascript / DHTML / Ajax

 > 

JavaScript Orienté objet (POO)

 > 

Classes

 > 

Problème pour crer une classe pour faire de l'ajax...pleaseHELP !!!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème pour crer une classe pour faire de l'ajax...pleaseHELP !!!

jeudi 15 janvier 2009 à 16:06:53 | Problème pour crer une classe pour faire de l'ajax...pleaseHELP !!!

diversjms

Bonjour à tous et merci de me lire !!

Afin de faire de l'ajax propement je souhaite créer tous d'abord  une classe pour faire de simple requete asyncrhone avec le serveur avec un comportement par défault selon les évenements ( erreur 404 , erreur , success , ect ). Le but est de pouvoir utiliser cette classe comme ceci :


    var maRequete = new asyncRequest("test.php") ;
   
    //je définie la méthode
ifSuccess() selon l'utilisation que je désire
    maRequete .ifSuccess = function (xhr){
        //si la requete à réussi
    }


   //je définie la méthode ifError () selon la gestion des erreurs que
   //je désire
mais un comportement par défault existe si
   //je ne définie pas cette   méthode ( a voir dans la class )

    maRequete .ifError = function (error){
        //code selon ce que j'ai besoin de faire
    }


       //même chose
    maRequete.onLoading = function (etat){
        //pendant le chargement avec le serveur
    }

   
   
maRequete.send() ;        //on envois la requete au serveur

Un comportement par défault existe pour chacune des 4 méthodes de cette objet comme vous allez le voir dans la class. Voilà donc la classe que j'ai ecrite :

function asyncRequest(file){
   
    //Attributs
    this.data = null ;     //les eventuelles variables
    this.method = 'POST' ; //method utilisé, POST par default
    var filename = file ;  //fichier à joindre
   
    //Gestion d'erreur si filename non renseigné
    if((filename==null) || (filename=='') ){
        //On remonte l'erreur en utilisant la methode iferror
        this.ifError("Le nom du fichier à joindre n'a pas été fournis.") ;
        return false ;
    }
   
    //Methodes

    //methodes ifError() avec son comportement par défault
    this.ifError = function (error){
        if(error == ""){
           alert("Erreur durant la requette avec le serveur");
        }else{
           alert(error) ;
        }
    }

   
//methodes onLoading () avec son comportement par défault
    this.onLoading = function (statut){
        //vide par default.
à redéfinir selon ce qu'on désire faire pendant le chargement
    }

   
//methodes ifSuccess () avec son comportement par défault
    this.ifSuccess = function (xhr){
        //vide par default. à redéfinir selon l'utilisation de xhr désiré
    }

   
//methodes send() , va creer un XMLHTTPRequest et faire la requette
    this.send = function(){
        xhr = new xhrObj() ; //un objet XmlHTTPRequest
        xhr.open(this.method, filename , true);
       
        //Conditionement des variables si on en as
        if((this.data != null ) && (this.data != '')){
          //Si on a demande POST il faut envoye les variables dans l'entette
          if(this.method == "POST"){
             xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");    
          }else{
//sinon methode GET
             this.filename = this.filename+"?"+data ;
          }
        }
       
        //Envois de la requette (instruction commune  GET et POST)
        xhr.send(this.data);
       
        //Processus de la com ASYNCRHONE
        xhr.onreadystatechange = function (){

           /* C'est à partir d'ici que j'ai un probleme. Ici dans
onreadystatechange()
              je n'arrive plus a accéder aux methodes de ma classe ,
this.onLoading() ,
              this.ifError() ,
this.ifSuccess()
            */
           
            if (xhr.readyState != 4){
                   this.onLoading(xhr.readyState) ; //  <-
introuvable (this.onLoading is not a function)
            }

            //A la fin de la com
            if (xhr.readyState == 4){

                //Gestion de lerreur 404
                if (xhr.status == 404){
                      //si je provoque l'erreur vonlontairement pour tester j'aurrais
"this.ifErroris not a function)"
                      this.ifError('Action Impossible : \n  Le document est introuvable (erreur 404)') ;
                }
                //Si tous s'est bien pass et qu'on a definit une fonction pour le relais, on essaye de l'xcuter
                if (xhr.status == 200){
                    this.ifSuccess(xhr) ; //
<- introuvable (this.ifSuccess is not a function)
                }
            }
        }
    }
}



Bien sur j'arrive à utiliser mes méthodes en dehors de xhr.onreadystatechange() et je suis désespéré de triturer ce code dans tous les sens. Quelqu'un sait t'il pourquoi je ne peux plus accéder aux méthodes à l'intérieur de xhr.onreadystatechange() ????


Merci d'avance à tous ceux qui ce penche sur mon problème, çà fait maintenant 2 semaines que je bloque sur çà.



dimanche 1 mars 2009 à 21:34:37 | Re : Problème pour crer une classe pour faire de l'ajax...pleaseHELP !!!

Kimjoa

ton problème viens du 'binding' ,les fonctions passé en paramètre d'autre fonction perdent leurs  contexte d'origine , onreadystatechange va etre appellé par une fonction native du js, qui va lui mettre en paramètre  le onreadystatechangeque que tu aura définit....
en gros,
onreadystatechangeva ètre appellé par une autre fonction qui l'aura passé avant en argument.

pour retrouver le contexte de t'as fonction faut en refaire une autre! avec une variable locale à la fonction référencant ton context .

voici en une , celle de prototype;
Function.prototype.bind = function() {
      var __method = this, args = Array.prototype.slice.call(arguments,0), object = args.shift();
      return function() {
         return __method.apply(object, args.concat(Array.prototype.slice.call(arguments,0)));
      }
   }

et pour ton code ca donne

this.send = function(){...}.bind(this)

a++


Cette discussion est classée dans : function, erreur, xhr, if, iferror


Répondre à ce message

Sujets en rapport avec ce message

intérompre une fonction... [ par davidcian ] Bonjour,Je cherche a stopper le déroulement d'une fonction lors d'une condition, j'ai testé avec return mais ça marche pas...Fonction principal:functi Dropdownlist et ajax [ par kalabichou ] Bonjour à tous, Actuellement j'essaye de faire fonctionner 4 dropdownlist dans un environnement j2ee sous eclipse. En utilisant ajax j'envoie mes par JavaScript - Erreur = Null [ par SpaceHam ] Je veux faire en JavaScript une page de création bien simple. J'ai un message d'erreur qui m'affiche comme quoi on attend un objet qui serais à Null. Problème avec IE 6 et 7 (Erreur d'exécution inconnue) [ par ov3rdoze ] Bonjour à tous J'essaye désespérement de résoudre ce problème. Le script doit si possible envoyer le formulaire via XMLHttpRequest, ou sinon valider comment garder en mémoire la valeur d'une variable [ par ricky250r ] Je suis entrain de faire un petit jeu de mémoire et j'ai une variable qui affiche le record le plus bas mais quand je clic sur le bouton nouvelle part Besoin d'aide jeu mémoire [ par ricky250r ] Salut a tous j'ai fait un petit jeu de mémoire pour mes enfant et je voudrais ajouter un mode pro(une case a cocher) et quand la case est cocher sa li mon diapo ne s'affiche pas sans connection [ par hitu ] Bonjour j'ai réalisé un diaporama mais celui ne s'affiche pas quand je ne suis pas connecté! Merci d'avance voici mon code: [code=as][code=html] Rechargement d'une page non pris en compte avec certains navigateurs [ par spacedelta ] [b]Bonjour[/b], [i]J'ai posté un sujet sur ce forum puisque j'ai besoin d'aide, comme je sais que ce forum est hyper actif =D[/i] [u]Alors voici mon p pb getter et setter sur ie<9 [ par aerolyte ] bonjour, habitué a l'actionscript me voila bien embéter. J'ai un bout de code qui marche bien sauf pour ie<9 [code=js]var Charg=(function(){ 'use st Fonction AJAX qui ne se déclenche pas [ par Shivan0910 ] Bonjour, Je sollicite de votre bienveillance dans la résolution de ce problème qui tend à m'épuiser J'ai deux fonctions function creationXHR() { var


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales