Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSE AJAX COMPLÈTE


Information sur la source

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é: 13 546 / 628

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Pour les "Membres Club", vous pouvez 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.

Commentaires et avis

signaler à un administrateur
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 :)

signaler à un administrateur
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°

signaler à un administrateur
Commentaire de kankrelune le 03/06/2007 12:21:59

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

@ tchaOo°

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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°

signaler à un administrateur
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.

signaler à un administrateur
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 ;-)

signaler à un administrateur
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 ..

signaler à un administrateur
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.

signaler à un administrateur
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 :)

signaler à un administrateur
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

signaler à un administrateur
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).

signaler à un administrateur
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.

signaler à un administrateur
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. à+

signaler à un administrateur
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 :)

signaler à un administrateur
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.

signaler à un administrateur
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 ??

signaler à un administrateur
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.

signaler à un administrateur
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 :)

signaler à un administrateur
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

signaler à un administrateur
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 ...]
});

signaler à un administrateur
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 ?

signaler à un administrateur
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.

signaler à un administrateur
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(). 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 [ par adamess ] C&#146;est quoi &nbsp;Ajax&nbsp;? Est-ce que Ajax&nbsp;: c&#146;est <SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-fam priorité d'un objet [ par Hermios ] Salut à tousir s'il existe un moyen de définir une priorité pour un objet, en l'occurence un bouton: Mon programme javascript traite un grand nombre d AJAX et FireFox [ par el_bassir ] J'ai creé un script php utilisant ajax pour charger des donneés d'une base de donnees sans avoir a recharger tte la page;   ca marche tres bien sur in Recup d'une page aspx dans un span. AJAX a la place d'une iframe. [ par Targos ] Hello tout le monde.J'ai un petit probleme, je veux recupérer dans un &lt;span&gt; d'une page html le contenu d'une page aspx.Pas de probleme j'ai uti Objet en argument dans une fonction [ par 1300371 ] Est il possible de passer un objet (par exemple une image) en parametre dans une fonction ?? Sachant que par la suite j'apelle recursivement ma foncti


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode