Gularu.fr

Cueillir l'actu, l'insolite du web et d'autres trucs

  • Une pensée pour le Coucou et cette victoire des blogueurs...

    En dehors de la victoire, j’ai eu une pensée pour le Coucou avant hier, je me disais qu’il n’aura pas vu la fin du règne. Surtout, je me suis dit que les valeurs que je porte, celle de dire que l’Homme est au centre de tout, je les trouvais chez ce grand mec, une grande [...]

Publié le 9 juin 2008

wiifriend

JavaScript pour les nuls – de A à Z

Commençons par le commencement.

L’Ajax est l’ensemble de deux choses : du JavaScript et des requêtes ajax (pas de rechargement de page). Le JavaScript sert à lancer les requêtes selon l’action réalisée par l’utilisateur.
Téléchargez Firebug et développez sous Firefox, les requêtes ajax sont visibles avec ce plugin.
Nous partons du principe que vous savez coder proprement une structure xHTML. Nous utiliserons le framework Prototype pour simplifier le code.

INSTALLATION
Voir http://www.gularu.fr/blog/?p=165

CODE
Tous les codes présents ci-dessous sont codés dans le langage javascript donc présent entre les balises

<script type="text/javascript">
et
</script>

SEPARER LE PHP, LE JS et LE CSS
Un bon codeur est un codeur qui sépare bien son css (feuille de style séparées), son code php et les actions JS (par un fichier JS à part appelé dans le head). C’est dans cette vision qu’à été développé Prototype donc nous le ferons.

LES EVENTS
Lorsqu’une action type est réalisée par un internaute, elle prendra la forme d’un objet appelé Event. C’est un événement. Par exemple, un clic est un événement.
Il faut savoir que le navigateur ne gère pas tout seul ces événements (sauf le clic sur un lien par exemple) et il faut donc mettre un écouteur sur les éléments qui doivent réagir. Un écouteur, c’est comme un détecteur de mouvements : sans mouvement, il ne se passe rien. Lorsqu’un mouvement est détecté, un événement est créé : la lumière est allumée.

Pour créer un événement :

new Event.observe("logo","click", function(evt) {
	alert("Vous avez cliqué sur le logo") ;
}) ;

Pour des raisons de mémoire, il faut écrire le new, sinon il y a des pertes inutiles de performance. On crée donc un objet Event. Cet objet possède plusieurs fonctions toutes prêtes à être utilisées qui sont présentes dans le framework prototype. Ce sont des fonctions que l’on appelle « méthode ». La méthode pour créer un écouteur se nomme « observe ». Il prend en paramètre l’id de l’élément, le type d’événement et la fonction à lancer quand le type d’événement est rencontré sur l’id précisé.

Il y a plusieurs types d’événements possibles avec prototype :
click : au click
change: au changement de valeur (sur un select par exemple)
focus: au focus sur un champ de texte par exemple
mouseover : au survol sur l’élément
mouseout : lorsque l’on quitte le survol de l’élément
submit : lorsque l’utilisateur valide le formulaire (par un click sur le bouton valider ou envoyer ou même lorsqu’il fait entrée pour valider son formulaire)

LES REQUETES AJAX
Maintenant que nous avons une méthode qui va écouter notre action, nous pouvons lancer une requête AJAX en conséquence.
Une requête AJAX, c’est comme un rechargement de page sauf que cela recharge une partie de la page en cours.
Vous comprendrez bien donc que les paramètres de la méthode seront au minimum la page PHP appelée pour chercher les infos demandées et peut-être la cible de cet appel (voir ci-dessous).

Il y a deux méthodes pour réaliser une requête AJAX avec prototype :
Updater : cette méthode va réaliser l’appel et va afficher le résultat dans la div dont l’id est fourni.
Request : cette méthode va réaliser l’appel mais rapatrie juste les données, on ne définit pas la cible de l’appel. Utilisé par exemple si vous avez un test à faire sans conséquence sur la page du visiteur.

Updater prend en paramètres l’id de destination pour le résultat, l’url de la page php appelée et enfin les options facultatives.
Request prend juste l’url de la page php et les options.

Pour créer une requête:

new Ajax.Updater("multipleVideo", "xhr/xhr_rechercher.php", {
	method: 'post',
	parameters :"type=2",
	evalScripts: true
});

Des options sont donc disponibles, elles sont entre crochets. Method pour choisir la method PHP d’envoi, soit en POST ou en GET. Parameters, attention, en POST et en GET cette option s’écrira toujours pareil, la première variable sans « & » puis les autres avec un « & » devant, comme pour les réceptions de variable GET sur une page PHP normale. N’oubliez pas l’égal après chaque nom de variable. EvalScripts sert pour dire qu’il faudra exécuter le javascript présent dans la page PHP appelée. Par défaut, cette option est à false ! Il y a d’autres options, à vous de découvrir leur utilité avec l’API du framework prototype (http://www.prototypejs.org/api).
Respectez bien la casse du code sinon cela ne marche pas : tout en minuscule sauf lorsque la méthode comprend deux mots sémantiques du genre eval scripts > evalScripts. Egalement important les virgules ! Regardez bien, après chaque paramètre en option, on met une virgule, la dernière ne possède pas de virgule. evalScript se met généralement en dernier.

Maintenant, additionnons les deux savoirs que nous venons d’assimiler :

new Event.observe("logo","click", function(evt) {
	new Ajax.Updater("logo", "xhr/xhr_logoChange.php", {
		method: 'post',
		parameters :"type=2",
		evalScripts: true
	});
});

Ici, au clic sur le logo, nous lançons la page xhr_logoChange.php et nous mettons le résultat de cet appel dans la div avec l’id logo.

STOPPER L’EVENT
Lorsque nous lançons une action en JS sur une action déjà traité automatiquement par le navigateur, il ne faut pas oublier de stopper l’Event produit par le navigateur. Quoi ? lol. En gros, lorsque que vous mettez par exemple un écouteur sur le clic sur un lien hypertexte, le navigateur va d’abord aller sur la cible du lien avant de traiter votre code JS. De même avec un formulaire. Il faut donc stopper l’Event.

Imaginez un formulaire, vous voulez vérifier qu’un champ est rempli. Seulement si l’utilisateur clique sur envoyer, le formulaire sera envoyé et la page sera rechargée. D’où l’intérêt de mettre un petit stop Event pour empêcher l’envoi du formulaire, vous l’enverrai après les vérifications.

new Event.observe("formulaire","submit", function(evt) {
	// On stoppe l’évènement
	new Event.stop(evt);
 
	//On fait les vérifications et on envoie le formulaire
});

Pour faire les vérifications, il faut récupérer les valeurs des champs du formulaire. Prototype a encore tout prévu :

DESIGNER UN OBJET
Pour désigner un objet, il faut connaître seulement son identifiant (le champ « id »).
Exemple :

<div id="divTest"></div>
<img id="imgTest" src="images/images.gif" alt="image" />
<form id="formTest">
	<input id="login" name="login" type="text" value="" />
</form>

Pour designer un objet présent dans le DOM (la structure xHTML de la page) :

var champLogin = $("login");
// Maintenant vous avez accès à tous les paramètres de l’objet
var valueLogin = champsLogin.value ; // Valeur du champ
var idLogin = champsLogin.id ; // Id de l’objet
// Autres exemples fictifs
var checkedMajeur = champsMajeur.checked ; // Pour vérifier l'état d'une case à cocher

Maintenant si vous voulez tester si le champ n’est pas vide avant l’envoie, il vous reste donc à faire :

new Event.observe("formulaire","submit", function(evt) {
	// On stoppe l’évènement
	new Event.stop(evt);
 
	//On fait les vérifications et on envoie le formulaire
	var valueLogin = champsLogin.value ; // Valeur du champ
	if (valueLogin != "") {
		// On envoie si le champ n’est pas vide
		new Ajax.Updater("LogOk", "xhr/xhr_connexion.php", {
			method: 'post',
			parameters :"login="+valueLogin,
			evalScripts: true
		});
	}
});

Comme je vous l’ai déjà dit, le mieux c’est de séparer le JS de la page PHP. Cependant, imaginons que ce formulaire n’est présent que sur une seule page, il y aura une erreur JS qui va être créée sur les autres pages sans ce formulaire car lorsque l’id sera recherché, il ne le trouvera pas : une erreur bloquera toute la suite du code JS. (Voir utilisation de firebug).

Pour éviter cela, il suffit de faire un petit test avant de lancer le tout :

// Si le formulaire html est présent
if ($("formulaire")) {
	new Event.observe("formulaire","submit", function(evt) {
		// On stoppe l’évènement
		new Event.stop(evt);
		//On fait les vérifications et on envoie le formulaire
		var valueLogin = champsLogin.value ; // Valeur du champ
		if (valueLogin != "") {
			new Ajax.Updater("LogOk", "xhr/xhr_connexion.php", {
				method: 'post',
				parameters :"login="+valueLogin,
				evalScripts: true
			});
		}
	});
}

N’hésitez pas à mettre un commentaire, ou à me demander un renseignement, l’ajax n’est pas très difficile si l’on trouve les bonnes informations.



Partager

15 commentaires

  1. Yann dit :

    un grand merci! cela fait déjà bien des siècles que j’essaye de comprendre clairement l’ajax mais avec de la peine! là, en relisant 2 3 fois quand même, tout c’est clair! merci, avec ceci j’ai déjà réussit à faire un écouteur et un drag avec prototype et scriptaculous!

  2. Gularu dit :

    Ba heureux d’avoir rendu service !
    Le plus dur c’est le début, après ça devient un jeu et de la recherche de syntaxe ^^

  3. Campari dit :

    Comment faire pour mettre deux paramètres ??

    Merci d’avance,
    JC.

  4. Gularu dit :

    parameters :"login="+valueLogin+"&deuxVar="+deuxVar,

  5. julien dit :

    Bonjour,

    comment mettre des parametres en post sans en connaitre ni le nombre ni le nom.

    Je veux faire de l’ajax pour une validation de ligne de tableau complétement parametrable par le client.

    Merci

  6. Gularu dit :

    Tu fais une boucle du genre

    < ?php

    $nb="1";
    $param="";
    foreach ($tab as $value) {
    if ($nb>1) $param .= "&";
    $param .= "var_".$nb."=".$value;
    }

    ?>

    et tu auras tout dans params.

  7. julien dit :

    ce code serait bien aussi mais ne s’applique pas exactement à ce que je veux faire :

    $process = TRUE;
    $needed_vars = array(‘note’, ‘user’, ‘sect’, ‘redirect’, ‘action’, ‘func’, ‘arga’, ‘argb’, ‘answer’);
    foreach ($needed_vars as $varname) {
    if (empty($_POST[$varname])) {
    $process = FALSE;
    break;
    }
    }

    // We have a submitted form to process
    if ($process) {

    //(… plein d’opérations que l’on peut réunir dans une ou plusieurs fonctions et que l’on applique à chacun des éléments de $needed_vars)

    }

  8. Gularu dit :

    Je comprends pas. Peux-tu être plus clair ?

  9. julien dit :

    ok, dans mon cas général, je ne sais pas à l’avance combien de variables (à récupérer en post) mon utilisateur peut decider de mettre à jour, c’est un tableau avec des colonnes parametrables à l’infini que l’on peut créé dans une partie administration donc j’ai des difficultés à construire la chaine de data pour ajax (elle n’est jamais fixe et la variable reprend le nom du champ que l’utilisateur créé dans la base pour sa colonne).

    Avec le code fourni, je pourrai mettre ces variables dans un tableau (pour l’affichage je sais tout de memle retrouver ces champs) et faire le tests (if $process == true ) de recuperer la variable passé en post pour la mettre à jour.

    En clair, j’ai un tableau de bord php customisable et je voudrai sur un clic enregistrer les données de la ligne (champ texte, case à cocher…) sans recharger la page car cela est trop long pour l’utilisateur.
    Mais je ne sais pas construire la chaine data pour le post et en plus si je submit sur le bouton pour avoir $_POST, il me rafraichira en fin d’ajax automatiquement la page.

    Si tu as une piste je suis preneur.

    Merci

  10. Gularu dit :

    ok je vois.

    En fait ce ne sera pas fait en php mais en javascript. Je te fais un bout de code et le publie dans quelques minutes.

  11. Gularu dit :
    <table>
    	<tr><th class="titre" id="titre_1">Titre 1</th></tr>
    	<tr><td class="contenu" id="contenu_1">Contenu 1</td></tr>
     
    	<tr class="titre" id="titre_2"><th>Titre 1</th></tr>
    	<tr class="contenu" id="contenu_2"><td>Contenu 1</td></tr>
    </table>
     
    <script type="text/javascript">
    	new Event.observe(window, "load", function (evt) {
    		new Event.observe("tonFormulaire", 'submit', function(evt) {
    			$params = "";
    			$$(".titre").each(function(el) {
    				$$(".contenu").each(function(el2) {
     
    					// Là tu incrémentes tes paramètres.
                                           Aide toi de cette page, commentaire 12 : http://blog.pascal-martin.fr/post/Un-premier-appel-Ajax-avec-Prototype
     
    				});
    			});
    		});
    	});
     
    </script>
  12. julien dit :

    Merci pour cette piste.

    Je vais l’exploiter durant mes congés et j’espère au retour pouvoir publier un code fonctionnant car d’autres doivent être dans le même cas que moi.

  13. Benoit dit :

    Bonjour,
    Je n’arrive toujours pas a tout comprendre, moi ce que je cherche, c’est en fait avoir sur mon site une partie fixe qui ne se recharge pas a chaque fois puisqu’elle contient un lecteur audio flash. et je voudrais pouvoir recharger des pages en dessous a l’aide de lien.
    Je ne vois pas comment partir …
    Merci d’avance

  14. Gularu dit :

    Il existe des librairies js audio qui font cela, regardez sur ajaxrain puis tapez music.

    Laisser un commentaire