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 !

AJAX - UN SEUL APPEL DE FONCTIONS POUR FAIRE DES LIENS ET SOUMETTRE DES FORMULAIRES


Information sur la source

Catégorie :Formulaire Classé sous : ajax, formulaire, lien, get, post Niveau : Débutant Date de création : 01/02/2007 Date de mise à jour : 02/02/2007 15:59:43 Vu : 7 718

Note :
9 / 10 - par 5 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note

Description

Bonjour,

Voilà je suis débutant, et j'ai réalisé pour mon besoin deux fonctions Javascript qui me permettent par le biais d'Ajax de pouvoir aussi bien soumettre un formulaire que de réaliser des liens hypertextes. Le tout à partir d'un seul appel de fonction standard. Les paramètres (il n'y en a que 4) permettent de faire le reste.

N'hésitez pas à critiquer, même si jusque là, ces fonctions ont très bien marché et je les mets à l'épreuve en développant mon propre CMS :p
 

Source

  • function getFormData(form)
  • {
  • var data1 = "";
  • var form = document.getElementById(form);
  • var elements = form.elements;
  • for(var i=0; i<form.length; i++)
  • {
  • data1 += elements[i].name + "=" +escape(elements[i].value);
  • if((i+1)<form.length)
  • {
  • data1+="&";
  • }
  • }
  • return data1;
  • }
  • function ajax(fichier, div, method, form)
  • {
  • var xhr=null;
  • var data="null";
  • if(form!="null")
  • {
  • if(method=="GET")
  • {
  • data=form;
  • method="POST";
  • }
  • else
  • {
  • data = getFormData(form);
  • }
  • }
  • // détection du navigateur pour la création de l'objet XMLHttpRequest (soit l'acronyme xhr)
  • if (window.XMLHttpRequest)
  • {
  • xhr = new XMLHttpRequest();
  • }
  • else if (window.ActiveXObject)
  • {
  • xhr = new ActiveXObject("Microsoft.XMLHTTP");
  • }
  • xhr.open( method, fichier, false);
  • xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  • xhr.send(data);
  • if (document.getElementById)
  • {
  • document.getElementById(div).innerHTML=xhr.responseText;
  • }
  • else
  • {
  • if (document.layers)
  • {
  • document.div.innerHTML=xhr.responseText;
  • }
  • else
  • {
  • document.all.div.innerHTML=xhr.responseText;
  • }
  • }
  • }
  • // Appels
  • ajax("monfichier.php", "div_de_destination", "GET", null)
  • ajax("monfichier.php", "div_de_destination", "POST", null)
  • // ces appels permettent d'exécuter le script contenu dans monfichier.php et d'afficher le retour dans la div d'id div_de_destination, ici il n'y a pas de paramètre. Ce sont les appels de base, ils me servent notamment pour faire les liens hypertextes.
  • ajax("monfichier.php", "div_de_destination", "GET", "c=2&d=4")
  • // cet appel permet d'exécuter le script contenu dans monfichier.php et d'afficher le retour dans la div d'id div_de_destinatio, les données c=2 et d=4 sont transmises par la méthode POST.
  • ajax("monfichier.php", "div_de_destination", "POST", "mon_formulaire")
  • // cet appel permet d'exécuter le script contenu dans monfichier.php et d'afficher le retour dans la div d'id div_de_destinatio, les données du formulaire sont récupérées et mises en forme (également encodées avec la fonction escape, équivalent de l'url_encode de php) par la fonction getFormData puis sont transmises par la méthode POST.
function getFormData(form)
	{
		var data1 = "";
		var form = document.getElementById(form);
		var elements = form.elements;
		for(var i=0; i<form.length; i++)
			{
				data1 += elements[i].name + "=" +escape(elements[i].value);
				if((i+1)<form.length)
					{
						data1+="&";
					}
			}
		return data1;
	}

function ajax(fichier, div, method, form)
	{
		var xhr=null;
		var data="null";

		if(form!="null")
		{
			if(method=="GET")
			{
			data=form;
			method="POST";
			}
			else
			{
			data = getFormData(form);
			}
		}
// détection du navigateur pour la création de l'objet XMLHttpRequest (soit l'acronyme xhr)
		if (window.XMLHttpRequest)
		{
			xhr = new XMLHttpRequest();
		}
		else if (window.ActiveXObject)
		{
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		}
		xhr.open( method, fichier, false);
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xhr.send(data);

		if (document.getElementById)
                {
                        document.getElementById(div).innerHTML=xhr.responseText;
                }
                else
                {
                        if (document.layers)
                        {
                                document.div.innerHTML=xhr.responseText;
                        }
                        else
                        {
                                document.all.div.innerHTML=xhr.responseText;
                        }
                }

	}

// Appels
ajax("monfichier.php", "div_de_destination", "GET", null)
ajax("monfichier.php", "div_de_destination", "POST", null)
// ces appels permettent d'exécuter le script contenu dans monfichier.php et d'afficher le retour dans la div d'id div_de_destination, ici il n'y a pas de paramètre. Ce sont les appels de base, ils me servent notamment pour faire les liens hypertextes.
ajax("monfichier.php", "div_de_destination", "GET", "c=2&d=4")
// cet appel permet d'exécuter le script contenu dans monfichier.php et d'afficher le retour dans la div d'id div_de_destinatio, les données c=2 et d=4 sont transmises par la méthode POST.
ajax("monfichier.php", "div_de_destination", "POST", "mon_formulaire")
// cet appel permet d'exécuter le script contenu dans monfichier.php et d'afficher le retour dans la div d'id div_de_destinatio, les données du formulaire sont récupérées et mises en forme (également encodées avec la fonction escape, équivalent de l'url_encode de php) par la fonction getFormData puis sont transmises par la méthode POST.

Conclusion

Pour appeller la fonction de départ, il vous suffit de suivre les exemples en bas de la source.

Je suppose que ce n'est pas ce qui se fait de mieux, mais ça marche très bien jusqu'à maintenant.
 

Historique

01 février 2007 11:15:52 :
J'ai viré des commentaires inutiles
01 février 2007 11:18:44 :
Corrections, j'avais involontairement supprimé une ligne de code essentielle :s
02 février 2007 15:59:43 :
Amélioration de la portabilité, merci à Wizard512 pour son coup de main

Commentaires et avis

signaler à un administrateur
Commentaire de R0_0T le 02/02/2007 14:26:52

Il n'y aurait pas une petite erreur à cette condition:

#  if(method=="GET")
# {
# data=form;
# method="POST";
# }
# else
# {
# data = getFormData(form);
# }

si non, je m'excuse : ) amicalement

signaler à un administrateur
Commentaire de wizard512 le 02/02/2007 14:50:57

il faudrait remplacer le :

                  "document.getElementById(div).innerHTML"

sinon sa marchera que pour IE      ^^"
Tien va voir, ma source sur ajax, aillant le même principe.

http://www.javascriptfr.com/codes/AJAXSIMPLIFIER-SEUL-FONCTION-GET-POST_39282.aspx

signaler à un administrateur
Commentaire de Gwinyam le 02/02/2007 15:40:52

@ R0_0T : je ne vois pas ce que tu veux dire, il n'y a pas d'erreur, j'ai volontairement bloquer le passage de données par la méthode GET. Si c'est autre chose, je ne vois pas ce dont tu veux parler. Enfin jusque là tout a bien marché de mon côté.

@ Wizard512: je regarde ton code, merci du lien

signaler à un administrateur
Commentaire de wizard512 le 02/02/2007 15:59:49

Non tu est partie loin la  ^^"
je n'ais jamais parler d'erreur, et encore moin de la methode GET  ^^"

je te parle de la compatibilité de ton code,
sous Firefox et les autres navigateurs autre que IExplorer,
parce que ton "document.getElementById(div).innerHTML"
n'est pas valable pour tous les navigateurs, par exemple sous FF,
c'est pas censer fonctionné.....

....mais a propos de GET, pourquoi l'avoir bloquer...?!

signaler à un administrateur
Commentaire de Gwinyam le 02/02/2007 16:05:50

euh il y a mélange, pour l'erreur, c'était pour R0_0T, toi j'avais compris que c'était pour la portabilité ;)

Tu peux regarder si la correction que j'ai fait et bonne, ou tout au moins correspond à ce que tu suggérais stp?

La fonction GET, je l'ai bloqué uniquement pour l'envoi de paramètres. Question de sécurité. En fait mon CMS est en plein développement, j'ai démarré seul, maintenant on est une petite équipe, pour pouvoir être sur que tout le monde puisse relire et comprendre ce que fait n'importe quel autre développeur, on a intégré des règles de base. Donc notamment passages de paramètres uniquement avec POST. Voilà globalement le pourquoi ;)

signaler à un administrateur
Commentaire de wizard512 le 02/02/2007 16:15:24

lol, dsl chui un peu tête en l'air     ^^"
bon bref au nivo de ta mise a jour, je dirais que c'est bon,
normalement sa dois etre compatible ( la flem de tester ;p mais sa a l'air bon )

Bravo pour ta source....

P.S.: Je te conseillerais de faire un message d'attente,
car parfois la requete peux duré plusieurs seconde, même si c'est asser rare....

signaler à un administrateur
Commentaire de Gwinyam le 04/02/2007 16:30:36

Ouais j'ai vu que t'avais fait un message d'attente, je crois que je vais le faire aussi, je mettrais ça dès que j'aurais une idée pour l'image d'attente de mon site. Je veux faire un truc propre et pro ;)

Merci de ton soutien en tout cas :)

signaler à un administrateur
Commentaire de wizard512 le 04/02/2007 18:13:47

De rien, tant que c'est pour aider,
un projet libre, qui sert une nouvelle technologie,
et qui pourait en plus aider des jeunes programmeurs, alors la......

.....chui completement dispo lol

bonne continuation....     ;)

signaler à un administrateur
Commentaire de Gwinyam le 04/02/2007 23:18:29

C'est bon j'ai testé, à priori c'est bon ça marche correctement. Maintenant ne reste plus qu'à mettre en place une bonne parade pour les fichiers...

Je sais déjà comment faire, mais je suis sûr qu'il y a moyen de soumettre le formulaire d'envoi de fichiers avec cet appel de fonction, je suis un ouf lol

signaler à un administrateur
Commentaire de coucou747 le 05/02/2007 09:41:29

"je suis sûr qu'il y a moyen de soumettre le formulaire d'envoi de fichiers avec cet appel de fonction"=> pas de façon portable... faut activeX pour pouvoir lire des fichiers chez le client...

signaler à un administrateur
Commentaire de Gwinyam le 05/02/2007 13:29:21

Ouais bon je laisse tomber alors
Merci de l'info

signaler à un administrateur
Commentaire de hvb le 07/02/2007 10:41:41

en quoi document.getElementById(div).innerHTML ne marcherait pas sous FF?
Cela fait partie de la norme... ça marche sous ie,ff,opera et meme netscape...

signaler à un administrateur
Commentaire de malalam le 09/02/2007 19:21:02 administrateur CS

Hello,

innerHTML fonctionne sous FF...mais ne fait pas partie d'une norme, hormis celle de Microsoft.
Ca n'est pas un attribut HTML, ni d'aucun document, et donc, ça n'est pas du DOM.
Mais ça reste pratique dans certains cas...même si DOM propose ce qu'il faut pour faire la même chose.

signaler à un administrateur
Commentaire de hvb le 10/02/2007 00:13:56

wah je savais pas ça. Je me suis renseigné un peu, et en fait ça a l'air d'une petite galère de faire exactement la même chose qu'innerHTML... et selon un benchmark que j'ai trouvé par hasard, niveau performance, meme sous firefox ou opéra, innerhtml est plus rapide que les fonctions DOM permettant son equivalent.
A l'heure de la mise en avant du respect des normes web, dur dilemme! Reste de plus à voir si cette fonction hors norme ne sera pas ammenée à disparaitre... :/

signaler à un administrateur
Commentaire de coucou747 le 12/02/2007 18:23:01

DOM est de loin beaucoup plus compliqué à manipuler... l'avantage de DOM? quand on veut faire du XUL, innerHTML n'existe plus, puisqu'on n'est plus dans du html, mais le DOM permet quand même de manipuler le document...

signaler à un administrateur
Commentaire de lordbdp le 15/05/2007 18:30:54

A tester... Mais semble très pratique ;o)

signaler à un administrateur
Commentaire de lordbdp le 15/05/2007 18:35:23

Y'a plus le lien pour télécharger !

signaler à un administrateur
Commentaire de LeFauve42 le 28/09/2007 11:01:20 9/10

Salut,

> "je suis sûr qu'il y a moyen de soumettre le formulaire d'envoi de fichiers avec cet appel de fonction"
> => pas de façon portable... faut activeX pour pouvoir lire des fichiers chez le client...

Dans GMail, ils y arrivent, non ?
Bon, je n'ai pas reussi a trouver comment :o) mais ca doit etre possible.
Pour l'instant quand j'ai besoin d'uploader un fichier dans une appli ajax, je fais un peu le porc en mettant un form normal dans une petite IFrame.
Si quelqu'un connait une meilleure methode, je suis preneur :o)

Eric

signaler à un administrateur
Commentaire de Gwinyam le 28/09/2007 17:16:33

GMail y arrivent, parce qu'ils font comme toi XD

signaler à un administrateur
Commentaire de LeFauve42 le 28/09/2007 17:33:25

> GMail y arrivent, parce qu'ils font comme toi XD

C'est ce que je pensais, mais je n'en ai pas vraiment l'impression...
Le "Input" tag est dans une table qui contient tout l'entete du mail, et ils appellent une fonction dans le onchange dont je n'ai pas reussi a trouver la source ( _CM_OnAttach() si je me souviens bien).

Je pense que ca se verrai si tout l'entete etait recharge, non ?

Eric

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Formulaire par methode POST via lien [ par zzzzzz ] SalutJ'aimerai savoir comment on peu envoyer un formulaire par methode POST via un lien et non un boutonMerci d'avance :) valider un formulaire avec un lien [ par perig ] BonjoursJe cherche à faire un lien avec une transmission de variables mais par la méthode postAlors j'ai pensais à un formulaire utilisant la méthode lien 2 effets [ par chaps29 ] bonjour, je souhaiterais faire un lien avec une double action qui necessiterait du javascript je m'explique c'est pour modifier un element dans une b Envoie de donner en POST sans formulaire [ par K0rr1gan ] Bonjour, je cherche &#224; envoyer des donn&#233;es en post vers une page php avec du javascript mais SANS passer par un formulaire et un submit. Y probleme formulaire [ par ao2208 ] &nbsp;BONJOUR, Voici mon probleme : Le bouton "envoyer"&nbsp;recharge la page panier.php donc les valeurs ds les text area disparaissent&nbsp;auriez v opener et POST [ par kangun ] Bonjour tlm!!je suis à al recherche (désespérément) d'une solution pour envoyer un formulaire à la page parent (le opener) qui l'a ouvert, pour traite Récupérer valeur post ou get [ par Flyer ] Comment je peut faire pour récuprer les valeurs des variables transmisent à une autre page par l'intermédiaire d'un post ou un get ?Ex:Page 1 envoie à empecher clic multiple sur un lien pour lea soumission d'un formulaire [ par jesaispo ] Bonjour,Dans le cadre de mon travail je suis confronter a un probleme :je dois empecher des clic multiples sur un lien qui envoie un formulaire.proble Methode POST - Poster une variable sans validation du formulaire [ par ultimatePuta ] Bonjour &#224; tous,J'aimerai savoir si il est possible de "POSTER" une variable javascript sans valider un formulaire. En effet je dois r&#233;cup&#2 Executer un script a partir d'un lien [ par raven44 ] J'ai un lien sur un de mes formulaire et de ce lien, je voudrais qu'il m'execute un script situé sur un autre formulaire !! Que dois-je mettre dans l


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.