begin process at 2010 03 18 08:51:09
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > CLASSE AJAX COMPLÈTE

CLASSE AJAX COMPLÈTE


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :ajax, classe, objet, prototype, clientserveur Niveau :Expert Date de création :02/06/2007 Date de mise à jour :06/06/2007 03:14:32 Vu / téléchargé :17 388 / 783

Auteur : Arto_8000

Ecrire un message privé
Site perso
Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

 Description

Bon cela fait plusieurs classes AJAX qui sont postées sur ce site, mais aucune n'était vraiment complète et ne permettait de simplifier tous les aspects de AJAX. Plusieurs aspects sont souvent manquants comme le format de retour (texte ou xml), le fait que les rêquetes soient asynchronous ou non, etc.

L'usage est relativement simple et permet beaucoup de chose, car j'ai fait cette classe pour quel en accepte le plus possible. Voici plusieurs exemples qui vous permettront de pouvoir utiliser toutes les fonctionnalités cette classe au maximum.

Exemple 1 (avec la fonction setParam) :

ObjAJAX = new Ajax();
ObjAJAX.setParam ({
url          : "http://yoururl/index.html",
returnFormat : "txt",
method       : "POST",
data         : {
test  : "11",
test1 : "4",
test2 : "555"
},
asynchronus  : true,
onComplete   : function (response) {alert(response)},
onFailure    : function (errorCode) {alert("Erreur : " + errorCode)}
});
ObjAJAX.execute();

Exemple 2 (avec la fonction setParam) :

ObjAJAX = new Ajax();
ObjAJAX.setParam ({
url          : "http://yoururl/index.html",
returnFormat : "txt", //  OU returnFormat : "xml"
method       : "POST", // OU method       : "GET"
data         : "valeur1=1&valeur2=2",
asynchronus  : true, // OU asynchronus  : false
onComplete   : "document.body.innerHTML = response"
});
ObjAJAX.execute();

Exemple 3 (avec la fonction setParamFromForm et setParam) :

JS :
ObjAJAX = new Ajax();
ObjAJAX.setParamFromForm(0); // OU ObjAJAX.setParamFromForm("form1"); OU ObjAJAX.setParamFromForm(document.forms[0]); OU ObjAJAX.setParamFromForm(document.getElementById(" form1_id"));
ObjAJAX.setParam({
    onComplete : "document.body.innerHTML = response"
});
ObjAJAX.execute();

HTML :
<form action="http://yoururl/index.html" method="POST" name="form1" id="form1_id">
<input type="text" name="valeur1" value="1">
<input type="text" name="valeur2" value="2">
<input type="button" name="button" value="Envoyer" onclick="fonctionblabla()"> <!-- Contrôle ignorer lors de l'envoie avec ma classe -->
</form>

Note : Lorsque vous utiliser la fonction setParamFromForm avec un chiffre en paramètre, ce chiffre doit correspondre à ça place dans le document HTML (si c'est le premier dans le document, alors c'est 0, si c'est le deuxième c'est 1 et ainsi de suite).

Note 2 : Lorsque vous utiliser la fonction setParam, certains paramètres ont déjà une valeur par défault : asynchronus (true), data (""), method ("GET") et returnFormat ("txt"). Si vous utilisez les valeurs par défaut, il n'est pas obligatoire de les paramètrer. Cependant, il est obligatoire d'avoir un paramètre "url" et "onComplete" pour que évidement le tout fonction comme il le faut.

Source

  • /*
  • Classe pour AJAX Par HoLyVieR aka Arto_8000
  • */
  • // Synthaxe : ErreurObj ([String Message]) Objet
  • // Objet pour la gestion d'erreur
  • function ErreurObj(txt)
  • {
  • // Variable //
  • this.txt = txt;
  • this.caller = getCaller(ErreurObj.caller);
  • // Fonction //
  • this.toString = function () {
  • return "Erreur : " + this.txt + " Fonction : " + this.caller;
  • }
  • }
  • // Synthaxe : isset ([Variable]) Boolean
  • // Même chose que en PHP
  • function isset(toTest)
  • {
  • return (typeof toTest != "undefined");
  • }
  • // Synthaxe : Array.inArray ([String ChercheQuoi]) Boolean
  • // Chercher pour une chaine particuliere dans un tableau
  • function inArray(text)
  • {
  • for (a=0;a<this.length;a++)
  • {
  • if(this[a] == text)
  • {
  • return true;
  • }
  • }
  • }
  • Array.prototype.inArray = inArray;
  • // Synthaxe : getCaller ([String fonction.caller]) String
  • // Retourne le nom de la fonction appartir de l'attribut caller //
  • function getCaller(rawCaller)
  • {
  • rawCaller = rawCaller.toString();
  • if (rawCaller == null)
  • return "";
  • return rawCaller.substring(rawCaller.indexOf("function ") + 9,rawCaller.indexOf("(")).replace(" ","");
  • }
  • // Synthaxe : Ajax () Objet
  • // Objet centrale de la classe
  • function Ajax()
  • {
  • // Variable //
  • this.asyn = true;
  • this.data = "";
  • this.url = "";
  • this.method = "GET";
  • this.returnFormat = "txt";
  • this.obj;
  • this.init();
  • }
  • // Synthaxe : httprequest () Objet XMLHttpRequest
  • // Crée l'objet XMLHttpRequest //
  • Ajax.prototype.init = function()
  • {
  • this.obj = null;
  • if (window.XMLHttpRequest)
  • this.obj = new XMLHttpRequest();
  • else if (window.ActiveXObject) // if IE
  • {
  • var ieversions = ['Msxml2.XMLHTTP','Microsoft.XMLHTTP','Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];
  • for(var i=0; !this.obj && i<ieversions.length; i++)
  • {
  • try
  • {
  • this.obj = new ActiveXObject(ieversions[i]);
  • }
  • catch(e) { }
  • }
  • }
  • }
  • // Lorsque la requête ne réussit pas
  • Ajax.prototype.onFailure = function (errorCode)
  • {
  • // ...
  • }
  • // Lorsque la requête réussit
  • Ajax.prototype.onComplete = function (response)
  • {
  • // ...
  • }
  • // Synthaxe : setParamFromForm ([HTML Form || String Name || Int Index])
  • // Ajoute les paramètres et les données d'un formulaire à celui de la requête
  • Ajax.prototype.setParamFromForm = function (obj)
  • {
  • if (!isNaN(obj))
  • obj = document.forms[obj];
  • if (typeof obj == "string")
  • eval("obj = document."+obj);
  • if (!isset(obj))
  • {
  • return ErreurObj("Donnée Invalide");
  • }
  • this.method = (isset(obj.method) && (["GET","POST"].inArray(obj.method.toUpperCase()))) ? obj.method.toUpperCase() : this.method;
  • this.url = obj.action;
  • for (i=0;i<obj.elements.length;i++)
  • {
  • if (["file","button","reset","submit"].inArray(obj.elements[i].type.toLowerCase()))
  • continue;
  • if (this.data != null)
  • this.data += "&";
  • this.data += obj.elements[i].name + "=" + escape(obj.elements[i].value);
  • }
  • }
  • // Synthaxe : setParam ([Array data])
  • // Ajoute les paramètres à la requête à partir d'un tableau
  • Ajax.prototype.setParam = function (arr)
  • {
  • if (typeof arr != "object" && !isset(arr))
  • {
  • return ErreurObj("Donnée Invalide");
  • }
  • for(k in arr)
  • {
  • switch (k)
  • {
  • case "url" : this.url = arr[k]; break;
  • case "method" : this.method = (["GET","POST"].inArray(arr[k].toUpperCase())) ? arr[k].toUpperCase() : this.method; break;
  • case "data" :
  • if (typeof arr[k] == "string")
  • {
  • if (this.data != "")
  • this.data += "&";
  • this.data += arr[k];
  • }
  • else
  • {
  • if (typeof arr[k] != "object")
  • break;
  • for (j in arr[k])
  • {
  • if (this.data != "")
  • this.data += "&";
  • this.data += j + "=" + escape(arr[k][j]);
  • }
  • }
  • break;
  • case "asynchronus" : this.asyn = arr[k]; break;
  • case "onComplete" : this.onComplete = arr[k];break;
  • case "onFailure" : this.onFailure = arr[k];break;
  • case "returnFormat" : this.returnFormat = arr[k];break;
  • }
  • }
  • }
  • // Synthaxe : Function execRequest () //
  • // Exécute la requête, ainsi que le callback
  • Ajax.prototype.execute = function ()
  • {
  • this.obj.open(this.method,this.url,this.asyn);
  • if (this.method == "POST")
  • this.obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  • if (this.asyn)
  • {
  • _tempAJAX_Reference_ = this; // Crée une copie de l'objet AJAX courant pour pouvoir le récupérer après //
  • this.obj.onreadystatechange = function () {
  • if (_tempAJAX_Reference_.obj.readyState == 4 && _tempAJAX_Reference_.obj.status == 200)
  • {
  • if (_tempAJAX_Reference_.returnFormat != "txt")
  • response = _tempAJAX_Reference_.obj.responseXML;
  • else
  • response = _tempAJAX_Reference_.obj.responseText;
  • if (typeof _tempAJAX_Reference_.onComplete == "string")
  • eval (_tempAJAX_Reference_.onComplete);
  • else
  • _tempAJAX_Reference_.onComplete(response);
  • }
  • else if (_tempAJAX_Reference_.obj.readyState == 4)
  • {
  • errorCode = _tempAJAX_Reference_.obj.status;
  • if (typeof _tempAJAX_Reference_.onFailure == "string")
  • eval(_tempAJAX_Reference_.onFailure);
  • else
  • _tempAJAX_Reference_.onFailure(errorCode);
  • }
  • }
  • this.obj.send(this.data);
  • }
  • else
  • {
  • this.obj.send(this.data);
  • if (this.obj.status == "200")
  • {
  • if (this.returnFormat != "txt")
  • response = this.obj.responseXML;
  • else
  • response = this.obj.responseText;
  • if (typeof this.onComplete == "string")
  • eval (this.onComplete);
  • else
  • this.onComplete(response);
  • }
  • else
  • {
  • errorCode = this.obj.status;
  • if (typeof this.onFailure == "string")
  • eval (this.onFailure);
  • else
  • this.onFailure(errorCode);
  • }
  • }
  • }
	/*
Classe pour AJAX Par HoLyVieR aka Arto_8000
	*/

// Synthaxe : ErreurObj ([String Message]) Objet
// Objet pour la gestion d'erreur
function ErreurObj(txt)
{
	// Variable //
	this.txt = txt;
	this.caller = getCaller(ErreurObj.caller);
	
	// Fonction //
	this.toString = function () {
	return "Erreur : " + this.txt + " Fonction : " + this.caller;
	}
}

// Synthaxe : isset ([Variable]) Boolean
// Même chose que en PHP
function isset(toTest)
{
	return (typeof toTest != "undefined");
}

// Synthaxe : Array.inArray ([String ChercheQuoi]) Boolean
// Chercher pour une chaine particuliere dans un tableau
function inArray(text)
{
	for (a=0;a<this.length;a++)
	{
		if(this[a] == text)
		{
			return true;
		}
	}
}
Array.prototype.inArray = inArray;

//  Synthaxe : getCaller ([String fonction.caller]) String
// Retourne le nom de la fonction appartir de l'attribut caller //
function getCaller(rawCaller)
{
	rawCaller = rawCaller.toString();
	if (rawCaller == null)
	return "";
	
	return rawCaller.substring(rawCaller.indexOf("function ") + 9,rawCaller.indexOf("(")).replace(" ","");
}

// Synthaxe : Ajax () Objet
// Objet centrale de la classe
function Ajax()
{
	// Variable //
	this.asyn = true;
	this.data = "";
	this.url = "";
	this.method = "GET";
	this.returnFormat = "txt";
	this.obj;
	this.init();
}

// Synthaxe : httprequest () Objet XMLHttpRequest
// Crée l'objet XMLHttpRequest //
Ajax.prototype.init = function()
{
    this.obj = null;
    if (window.XMLHttpRequest)
        this.obj = new XMLHttpRequest();
    else if (window.ActiveXObject)  // if IE
    {
        var ieversions = ['Msxml2.XMLHTTP','Microsoft.XMLHTTP','Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];

        for(var i=0; !this.obj && i<ieversions.length; i++)
        {
		    try
		    {
		        this.obj = new ActiveXObject(ieversions[i]);
		    }
		    catch(e)  { }
        }
    }
}

// Lorsque la requête ne réussit pas
Ajax.prototype.onFailure = function (errorCode)
{
	// ...
}

// Lorsque la requête réussit
Ajax.prototype.onComplete = function (response)
{
	// ...
}

// Synthaxe : setParamFromForm ([HTML Form || String Name || Int Index])
// Ajoute les paramètres et les données d'un formulaire à celui de la requête
Ajax.prototype.setParamFromForm = function (obj)
{
	if (!isNaN(obj))
	obj = document.forms[obj];
	
	if (typeof obj == "string")
	eval("obj = document."+obj);
	
	if (!isset(obj))
	{
		return ErreurObj("Donnée Invalide");
	}
	
	this.method = (isset(obj.method) && (["GET","POST"].inArray(obj.method.toUpperCase()))) ? obj.method.toUpperCase() : this.method;
	this.url = obj.action;
	
	for (i=0;i<obj.elements.length;i++)
	{
		if (["file","button","reset","submit"].inArray(obj.elements[i].type.toLowerCase()))
		continue;
		
		if (this.data != null)
		this.data += "&";
		
		this.data += obj.elements[i].name + "=" + escape(obj.elements[i].value);
	}
}

// Synthaxe : setParam ([Array data])
// Ajoute les paramètres à la requête à partir d'un tableau
Ajax.prototype.setParam = function (arr)
{
	if (typeof arr != "object" && !isset(arr))
	{
		return ErreurObj("Donnée Invalide");
	}
	
	for(k in arr)
	{
		switch (k)
		{
			case "url" : this.url = arr[k]; break;
			case "method" : this.method = (["GET","POST"].inArray(arr[k].toUpperCase())) ? arr[k].toUpperCase() : this.method; break;
			case "data" :
			if (typeof arr[k] == "string")
			{
				if (this.data != "")
				this.data += "&";
				this.data += arr[k];
			}
			else
			{
				if (typeof arr[k] != "object")
				break;
				
				for (j in arr[k])
				{
					if (this.data != "")
					this.data += "&";
					this.data += j + "=" + escape(arr[k][j]);
				}
				
			}
			break;
			case "asynchronus" : this.asyn = arr[k]; break;
			case "onComplete" : this.onComplete = arr[k];break;
			case "onFailure" : this.onFailure = arr[k];break;
			case "returnFormat" : this.returnFormat = arr[k];break;
		}
	}
}

// Synthaxe : Function execRequest () //
// Exécute la requête, ainsi que le callback
Ajax.prototype.execute = function ()
{
	this.obj.open(this.method,this.url,this.asyn);
	
	if (this.method == "POST")
	this.obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	
	if (this.asyn)
	{
		_tempAJAX_Reference_ = this; // Crée une copie de l'objet AJAX courant pour pouvoir le récupérer après //
		this.obj.onreadystatechange = function () {
			if (_tempAJAX_Reference_.obj.readyState == 4 && _tempAJAX_Reference_.obj.status == 200)
			{
				if (_tempAJAX_Reference_.returnFormat != "txt")
				response = _tempAJAX_Reference_.obj.responseXML;
				else
				response = _tempAJAX_Reference_.obj.responseText;
				
				if (typeof _tempAJAX_Reference_.onComplete == "string")
				eval (_tempAJAX_Reference_.onComplete);
				else
				_tempAJAX_Reference_.onComplete(response);
			}
			else if (_tempAJAX_Reference_.obj.readyState == 4)
			{
				errorCode = _tempAJAX_Reference_.obj.status;
				
				if (typeof _tempAJAX_Reference_.onFailure == "string")
				eval(_tempAJAX_Reference_.onFailure);
				else
				_tempAJAX_Reference_.onFailure(errorCode);
			}
		}
		this.obj.send(this.data);
	}
	else
	{
		this.obj.send(this.data);
		
		if (this.obj.status == "200")
		{
			if (this.returnFormat != "txt")
			response = this.obj.responseXML;
			else
			response = this.obj.responseText;
			
			if (typeof this.onComplete == "string")
			eval (this.onComplete);
			else
			this.onComplete(response);
		}
		else
		{
			errorCode = this.obj.status;
			if (typeof this.onFailure == "string")
			eval (this.onFailure);
			else
			this.onFailure(errorCode);
		}
	}
	
}

 Conclusion

Comme je vise de créer la classe la plus complète possible, si vous croyez qu'il manquerait quelque chose n'hésitez pas à en faire part.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

02 juin 2007 21:39:34 :
fautes de français
03 juin 2007 16:57:05 :
Suite aux commentaires de kankrelune et de Naixn, l'envoie des paramètres avec setParam ce fait maintenant avec un tableau associatif et le parseDataBeforeSend a été remplacé par escape.
03 juin 2007 17:35:04 :
Prototypage de toutes les fonctions de la classe, ajout des events onComplete et onFailure. Modification de la fonction init pour supporter davantage de version de IE. Merci à kankrelune et à Naixn pour leur réponse rapide.
06 juin 2007 03:14:32 :
Une petite erreur c'est glissée dans les exemples.

 Sources du même auteur

Source avec Zip PAF (PHP / AJAX FRAMEWORK)
Source avec Zip Source avec une capture MENU DYNAMIQUE CSS À 100%
Source avec Zip CONVERSION AVEC OPÉRATEUR BINAIRE
Source avec Zip Source avec une capture CONTRÔLE POUR FORMULAIRE
Source avec Zip Source avec une capture CHARIVARIE AVEC XMLHTTPREQUEST

 Sources de la même categorie

Source avec Zip Source avec une capture SÉQUENCEUR par jdmcreator
Source avec Zip COMPRESSION DE TEXTE CÔTÉ CLIENT EN JS VIA ALGORYTHME LZW par niamor36
Source avec Zip VIRTUAL IPHONE (V.2) par loicseg
Source avec Zip MOOTABLEAU par Miky76
Source avec Zip CALCULER VOTRE IMC par lesnouesremy

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CLASSE AJAX : PROTOTYPE ROCKS ! par ralecul
Source avec Zip CLASS VERIFICATION DES SAISIES par TheWeasel47
Source avec Zip Source avec une capture EXPLORATEUR WEB par XtremDuke
Source avec Zip Source avec une capture AJAX : COMPLETER AUTOMATIQUEMENT UN FORMULAIRE (<INPUT TYPE=... par phpajax
ENVOI DE FORMULAIRE AVEC DE L'AJAX par Klephte

Commentaires et avis

Commentaire de Naixn le 03/06/2007 11:28:25

Je n'ai pas testé la source en elle même, mais je trouve très peu pratique et encore moins efficace la façon dont tu passes les paramètres à ta méthode.

Je veux dire, il aurait été beaucoup plus intéressant de faire :

# ObjAJAX.setParam ({
# url: "http://yoururl/index.html",
# returnFormat: "txt",
# method: "POST",
# data: [{valeur1: "1", valeur2: "2"}],
# asynchronus: "true",
# callback: function (response) {document.body.innerHTML = response}
# });

C'aurait été tellement plus simple...

Et puis, Ajax.Request de prototype est plutôt assez complète, d'autant plus qu'elle permet de faire des callbacks intéressants : onComplete, onFailure (très intéressant ça), onInteractive, onCreate, etc.
Je t'invite à visiter : http://www.prototypejs.org/api/ajax/options :)

Commentaire de kankrelune le 03/06/2007 12:18:24

Dans la lignée de Naixn

for(k in arr)
{
    switch (k)
    {
         case "url" : this.url = arr[k]; break;
... .. .

Comme ça tu peux passer soit un tableau associatif soit un objet... c'est bien plus simple... .. .

Sinon est ce que tu connais escape(), encodeURI(), encodeURIComponent() parce que tu réinvente la roue avec ton getCaller()... .. .

Personellement je pense qu'un approche objet en utilisant le prototypage serait plus propre... .. .

Ton isset() ne sert à rien si ce n'est à faire joli... entre faire

if(isset(toTest))

ou directement faire

if(typeof toTest != "undefined")

autant prendre la deuxième solution... .. .

Sinon c'est plutôt bien... .. .

@ tchaOo°

Commentaire de kankrelune le 03/06/2007 12:21:59

Oups me suis trompé c'est pas getCaller() c'est parseDataBeforeSend()... .. .

@ tchaOo°

Commentaire de Arto_8000 le 03/06/2007 16:18:20

Pour le isset, c'était justement pour faire plus beau, maintenant que je fais davantage de PHP je trouve ça plus pratique et visuellement plus facile à reconnaître que le traditionnel typeof.

Naixn -> Pour cette source je n'en avais jamais entendu parler, mais je vais sûrement jeter un coup d'oeil.

Pour la façon de passer les paramètres, je vais corriger pour que ça soit un tableau associatif et pour le parseDataBeforeSend c'était un vieille habitude que j'avais pris d'utiliser ça au lieu du escape.

Aussi pour rajouter des events, le onComplete c'est la même chose que le callback et le onFailure c'est une assez bonne idée que je vais rajouter. Sinon je doutes de l'utilité du onInteractive et onCreate.

Commentaire de Naixn le 03/06/2007 16:44:45

Et pourtant il y a en a !
onCreate, c'est quand la requête vient d'être lancée avec succès (pas forcément effectuée), ça permet donc de faire quelque chose juste après.
onInteractive, ce sont les résultat partiels renvoyés, et pour l'avoir utilisé, je peux t'assurer que c'est assez utile.
De toute façon, si javascript et Prototype avec Ajax.Request fournissent ces possibilités, c'est justement parcequ'il peut y avoir une utilité :)

Personellement, je ne fais plus jamais d'ajax sans prototype :p

Commentaire de kankrelune le 03/06/2007 16:51:27

"Sinon je doutes de l'utilité du onInteractive et onCreate"

bah ça peut toujours servir genre pour une barre de chargement... mais bon c'est pas indispensable... .. .

par contre je maintien tu devrais utiliser le prototypage parce que la c'est bof bof... toi qui fais du php... bien que le model objet de javascript n'ai d'objet que le nom... imagine ton code en php... .. .

function Ajax()
{
$thisObj = (object)array();
$thisObj->callback = null;
$thisObj->asyn = true;
$thisObj->data = "";
$thisObj->url = "";
$thisObj->method = "GET";
$thisObj->obj = httprequest();
$thisObj->returnFormat = "txt";

if ($thisObj->obj->txt !== null)
return $thisObj->obj;

$thisObj->execute = create_function('', 'execRequest();');
$thisObj->setParam = create_function('$param', 'setParam($param);');
$thisObj->setParamFromForm = create_function('$param', 'setParamFromForm($param);');

return $thisObj;
}

Comprend tu... au final tu crée des référence sur des fonctions à chaque instanciation... c'est couteux en perf et pô beau... .. . ;o)

Alors qu'avec le prototypage tous tes objets héritent de tes méthodes...

Ajax.prototype.execute = function()
{
    // code de ta fonction execRequest()
};

Ajax.prototype.setParam = function(param)
{
    // code de ta fonction setParam()
};

Ajax.prototype.setParamFromForm = function(param)
{
    // code de ta fonction setParamFromForm()
};


Sinon... tu utilise beaucoup de fonction qui ne sont pas à proprement parlé des méthode (ou alors statique) tu devrait plus travailler en OO... cf code à la fin de mon post... .. .

Pour finir tu risque d'avoir des problèmes d'instanciation avec certaines version de IE... tiens un bout de code tiré du fin fond de la poubelle qui me sert de pc... lol... .. . ;o)

Ajax.prototype.init = function()
{
    this.obj = null;
    if (window.XMLHttpRequest)
        this.obj = new XMLHttpRequest();
    else if (window.ActiveXObject)  // if IE
    {
        var ieversions = ['Msxml2.XMLHTTP','Microsoft.XMLHTTP','Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];

        for(var i=0; !this.obj && i<ieversions.length; i++)
        {
    try
    {
        this.obj = new ActiveXObject(ieversions[i]);
    }
    catch(e)  { }
        }
    }
}

Voili voilou... .. .

@ tchaOo°

Commentaire de Arto_8000 le 03/06/2007 17:41:23

Voilà, j'ai fait plusieurs update sur à peu près tout ce qui vous avez dit, s'il manque toujours quelque chose faite moi encore signe.

Commentaire de manouille le 04/06/2007 10:20:49

hello, super ta class, mais ...

j'ai un soucis, j'obtiens systématiquement une erreur  que voici :

document.content has no properties
onreadystatechange()ajax.js (ligne 194)
[Break on this error] eval (_tempAJAX_Reference_.onComplete);

PLEASE HELP ;-)

Commentaire de manouille le 04/06/2007 10:22:02

Désolé pour les trois post mais le site rencontre des difficultés on dirait, page d'erreur 500 ..

Commentaire de Arto_8000 le 04/06/2007 14:29:41

Manouille -> Cela vient fort probablement du code que tu as mis dans le onComplete. J'imagine que tu utilisais un String dans lequel tu avais mis ton code. Post moi la déclaration que tu as fait et je vais pouvoir t'aider davantage.

Commentaire de Cyrano24 le 22/07/2007 08:32:46

Pour ma part, je viens de tester ce code, il est tout bonnement parfait pour le besoin que j'avais.

À un petit détail près toutefois : j'ai du désactiver la méthode inArray() qui me posait un problème assez majeur par rapport au reste de mon code JavaScript, enfin sous cette forme s'entend, c'est à dire en prototype de Array. J'ai donc utilisé une autre fonction autonome que j'avais déjà pour tester la présence d'un élément dans un tableau, plus proche de la méthode PHP en ce sens que je lui envoie deux paramètres : l'élément à chercher et le tableau d'éléments. Ce détail mis à part, je trouve ça très bien.

Compliments :)

Commentaire de Evangun le 11/08/2007 00:47:58

Hello,

bravo pour cette source ! C'est vrai que prototype est excellent pour Ajax, mais j'ai la flemme d'extraire les fonctions Ajax qui sont au milieu d'un framework de 100ko :/ Donc cette classe-ci fera très bien l'affaire en attendant pour une utilisation commune, et je rajouterai onCreate si besoin, car j'aime beaucoup l'idée.

Quelques problèmes quand même :

- comme le dit Cyrano24, il y a un problème avec inArray(). Ca me rajoute une case à tous mes tableaux, et cette case contient "inArray" !? Mes tableaux sont multi-dimensionnels et associatifs, je ne sais pas si cette info peut t'aider à régler le problème ? Enfin bref, en en faisant une fonction normale et pas une méthode prototypée, tout est revenu dans l'ordre.

- personne ne l'a évoqué jusqu'ici, alors je ne sais pas si c'est moi mais : en GET ça ne marche pas :/ Pour POST tu envoies les données avec .send, OK, mais avec GET tu devrais les concaténer dans l'URL, et tu ne le fais pas il me semble. Il manque donc cette ligne au tout début de Ajax.prototype.execute, et là ça marche : if (this.method == 'GET') this.url += '?'+this.data;

- "syntaxe" ne prend pas de "h" :)

Merci encore :D

Commentaire de Evangun le 11/08/2007 02:01:38

Ha et il y a une question toute bête qui me bloquait à l'époque où je commençais le javascript, tu devrais peut-être spécifier dans un exemple comment passer la réponse à une fonction quelconque : il faut simplement écrire :

onComplete : nomdemafonction,

Attention, le seul et unique argument passé à la fonction sera la réponse (sinon il faut modifier le code de Arto_8000).

Commentaire de Arto_8000 le 11/08/2007 05:39:23

Pour la case ajoutée à tous tes array, le problème est juste avec le foreach je crois ? Quand tu fais les foreach il prend en compte que tout ce qui est ajouté avec prototype est une donnée, un peu bizarre, mais ça le fait. Pour éviter cela rajoute un condition du genre dans tes boucles où il y a le problème :

if (typeof arr[k] == "function")
continue;

Pour le GET c'est sûrement un oublie de ma part.

Aussi le projet est loin d'être mort. Personnellement j'utilise souvent cette classe et de temps en temps je vois des choses que je vais rajouter pour un prochain update. Pour l'instant j'ai pris un peu d'avance sur le commencement d'un autre projet, mon chat PHP, et celui-ci va prendre un peu de temps avant de revenir sur ma table de travaille.

Commentaire de Evangun le 17/08/2007 18:46:47

Effectivement pour le problème lié au prototypage, après avoir cherché longtemps, ce que tu dis est la meilleure solution.

Pour en revenir à la source, tu pourras même mettre :
if (this.method == 'GET'){
this.url += '?'+this.data;
this.data = null;
}
Je précise pour le data null, histoire de pas envoyer les données une deuxième fois pour rien en GET.

Sinon j'ai trouvé un autre problème dans ta source, que je ne sais pas régler : l'encodage.
Avec ta source, pas moyen d'envoyer de l'utf8 ! J'ai fait mes tests avec 2 scripts AJAX, le premier ultra-basic (pas de classe) où ma chaîne arrive en utf8, et la même chose en passant par ta classe, ça arrive en je-ne-sais-quel format ISO, mais pas du utf8. C'est vraiment étonnant car mes pages appelante et appelée sont toutes les deux en utf8, et même en spécifiant un header Content-type: ... , charset=utf8; dans ta source, pas moyen que la chaine reste en utf8.
Au final ça pourra être sympa qu'on puisse préciser l'encodage au moment de l'instanciation, même si a priori ce n'est pas indispensable. à+

Commentaire de Evangun le 10/09/2007 13:51:09

Hello,
je reviens aujourd'hui avec 2 choses assez importantes à modifier, qui se trouvaient dans le même bloc :

à la place de

if (this.data != "")
this.data += "&";
this.data += j + "=" + escape(arr[k][j]);

mettre :

if(typeof arr[k][j] != "function"){
if (this.data != "")
this.data += "&";
this.data += j + "=" + escape(arr[k][j]);
}

car là on se retrouve avec le problème de l'énumération des méthodes de prototypage : si on ne met pas if(typeof arr[k][j] != "function"), il va envoyer toutes les méthodes prototypées de Array dans la requête, ce qui est totalement inutile et génère plus de trafic.

L'autre chose à modifier :
à la place de :

this.data += j + "=" + escape(arr[k][j]);

mettre

this.data += j + "=" + encodeURIComponent(arr[k][j]);

Comme le dit le Mozilla devguide : "Les fonctions escape et unescape ne fonctionnent pas correctement pour les caractères non-ASCII et sont donc déconseillées". Concrètement ce qui se passe, c'est que le UTF8 est viré et que le caractère "&" fait planter. Il faut utiliser encodeURIComponent.

Il y a encore un autre truc que j'ai remarqué, mais que je n'ai pas encore résolu, alors je repasserai plus tard :)

Commentaire de Arto_8000 le 10/09/2007 22:02:38

Pour le truc avec le GET j'attend un peu avant d'updater, car je veux changer un peu les choses pour le fonctionnement.

Pour le encodeURIComponent, j'en avais jamais entendu parler. Comme ça l'a l'air d'être assez standard et supporter par tous les navigateurs je vais updater pour cela.

Commentaire de phpajax le 23/10/2007 03:45:55

tres bonne source, comment fait on pour y ajouter oncreate pour charger un gif de loading ??

Commentaire de Arto_8000 le 23/10/2007 04:02:53

Le oncreate c'est quand tu instancies la classe, non ?

Tu peux le faire comme quelque chose dans ce genre là :

affiche_le_loading();

var AjaxOBJ = new ...
[...]
onComplete :  enlever_le_loading(),
onFailure :  enlever_le_loading()
[...]

Sinon tu peux toujours modifier la classe elle-même.

Ajax.prototype.onCreate = function ()
{
   [Code pour afficher le loading]
}

Ajax.prototype.init = function ()
{
    [...]
    this.onCreate();
}

et ensuite avec le onComplete et onFailure tu enlèves la bar de loading.

Commentaire de phpajax le 23/10/2007 04:12:36

Ajax.prototype.init = function()
{

    this.onCreate();

    .......

}

Ajax.prototype.onComplete = function (response)
{
document.getElementById('loading').style.visibility='hidden';
}

Ajax.prototype.onCreate = function ()
{
   document.getElementById('loading').style.visibility='visible';
}

elle est ou la faute? ou sinon, je doit procéder comment ?
merci pour ta réponse très rapide :)

Commentaire de phpajax le 23/10/2007 04:48:09

Ajax.prototype.onCreate = function ()
{   document.getElementById('loading').style.visibility='visible';
alert('crée');
}
---> avec l'alerte, je voi bien que ca marche, mais sans l'alerte rien ne se passe !
:s

Commentaire de Arto_8000 le 24/10/2007 01:25:05

Pour le onComplete c'est quand tu mets les paramètres. Désolé de ne pas avoir été assez clair.

var AjaxOBJ = new Ajax();
ObjAJAX.setParam ({
    onComplete :  "enlever_le_loading()",
    onFailure :  "enlever_le_loading()",
    [... tes autres paramètres ...]
});

Commentaire de phpajax le 27/02/2008 15:29:52

j'utilise cette classe dans mon site, plusieurs appels par page ( mise a jour de plusieurs div...)
le problème c'est que ca plante assez souvent...
c'est du a quoi? comment peut-on optimiser ce script ?

Commentaire de phpajax le 27/02/2008 15:31:41

Ce que je veux dire par plante c'est que le navigateur (IE) est vraiment scotche a jamais comme si il y avait un deadlock.

Commentaire de Arto_8000 le 27/02/2008 16:55:29

Si tu utilise le mode synchrome, le navigateur attend que le résultat soit reçu avant de continuer le script. D'où l'impression que ça fait un deadlock. Normalement tu es mieux avec le mode asynchrome.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

"settimeout" dans une classe [ par francois44 ] Bonjour à tous!Je suis actuellement en train de bosser sur une classe d'affichage de NEWS.Je sais qu'il y en a plein dans les sources, mais j'ai rien probleme de classe [ par wonesek ] bonjour j'ai un petit probleme: comment obtenir le nom d'un objet a partir d'une de ses methodes?par exemple: si mon objet s'appel monObj, faire en so variable contenant le nom de la methode JAVASCRIPT [ par s1pike ] Bonjour &#224; tous, j'ai un petit pb &#224; r&#233;soudre. J'ai un classe qui se nomme utilisateur et qui contient des methodes getNom(),getPrenom(). onreadystatechange et this.... [ par vinise ] bonjour à tousjai une petite question pour vous... j'ai créer une classe Ajax qui est et dans cette classe j'utilise onreadystatechange avec une fonct CRéation d'objet [ par jeanjeandada ] Bonjour,POur créer un objet avec ces propriété il faut créer une classe ??? si oui, comment faites vous pour en créer une . merci<span style="color: Problème AJAX et balise <form> [ par Valentino ] Bonjour,J'ai récuperé un petit script qui me permet de faire de l'upload ajax (http://blogs.developpeur.org/cyril/archive/2007/03/24/ajax-et-upload-pa AJAX ? Editeur [ par tuneserapasmonnom ] Bonjour,Je ne m'y connais que très peu en javascript / ajax mais j'ai besoin d'appeler une fonction php quand je modifie un textarea. J'explique : Je Pause sur un objet Timer [ par benwa74 ] Bonjour, Je cherche un moyen me permettant de mettre un timer en pause.Pour cela je pense qu'il faut connaitre la valeur de mon Timer a un instant T . problème liste lié avec AJAX et navigateur et doctype [ par FRED0181 ] Bonjour,J'ai creer une une page en PHP/AJAX qui comporte deux listes déroulante liées.(listes remplies par BD Mysql)Lorsque j'ai testé ma page, les li probleme ajax dans require php [ par sarsator ] Bonjour,voila mon probleme,j'ai une pages avec de 'lajax pour vcerifier avant d'envoyer le formulaire est qui fias changer le texte pour la verificati


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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,671 sec (4)

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