Perso Web PMI Prog Réseaux sociaux Développement Etudes OS Sécurité Infographie Mobiles Référencement iPhone Apple Scrum

Mot-clé - JavaScript

Fil des billets - Fil des commentaires

27 nov. 2008

Utilisation du Frameworks JavaScript Mootools : L'Accordéon

Par Jean-Christophe Duvivier à 19:28

Mots Clés Frameworks, JavaScript, Mootools,

Icone Mootools

J'ai rédigé ce tuto afin de faire découvrir le Frameworks JavaScript Mootools aux non connaisseurs. Il permet de présenter les bases de l'utilisation de cet outil, ce qui va vous permettre par la suite d'intégrer des éléments dynamiques dans vos applications.

Pour ce tuto, nous allons mettre en place un système d'accordéon tel que vous pouvez le voir ici : Mootools Accordion.

Vous allez commencer par récupérer tous les éléments nécessaires pour bosser ici : Mootools Accordion Pack.

Je vous laisse dézipper le tout sur votre PC et tester l'index. Alors ? Ça marche ? Effectivement, le pack est opérationnel.

Pour fonctionner, votre application a besoin de 4 fichiers :

  • mootools.js
  • demo.js
  • demo.css
  • index.html

Détaillons-les un peu :

Le fichier mootools.js

C'est LE fichier de base de Mootools. Il y recense toutes les variables et fonctions nécessaires au bon fonctionnement de vos applications. Dans le cas de l'accordéon, c'est ce bout de code qui est concerné :

var Accordion = new Class({
 
	Extends: Fx.Elements,
 
	options: {/*
		onActive: $empty,
		onBackground: $empty,*/
		display: 0,
		show: false,
		height: true,
		width: false,
		opacity: true,
		fixedHeight: false,
		fixedWidth: false,
		wait: false,
		alwaysHide: false
	},
 
	initialize: function(){
		var params = Array.link(arguments, {'container': Element.type, 'options': Object.type, 'togglers': $defined, 'elements': $defined});
		this.parent(params.elements, params.options);
		this.togglers = $$(params.togglers);
		this.container = $(params.container);
		this.previous = -1;
		if (this.options.alwaysHide) this.options.wait = true;
		if ($chk(this.options.show)){
			this.options.display = false;
			this.previous = this.options.show;
		}
		if (this.options.start){
			this.options.display = false;
			this.options.show = false;
		}
		this.effects = {};
		if (this.options.opacity) this.effects.opacity = 'fullOpacity';
		if (this.options.width) this.effects.width = this.options.fixedWidth ? 'fullWidth' : 'offsetWidth';
		if (this.options.height) this.effects.height = this.options.fixedHeight ? 'fullHeight' : 'scrollHeight';
		for (var i = 0, l = this.togglers.length; i < l; i++) this.addSection(this.togglers[i], this.elements[i]);
		this.elements.each(function(el, i){
			if (this.options.show === i){
				this.fireEvent('active', [this.togglers[i], el]);
			} else {
				for (var fx in this.effects) el.setStyle(fx, 0);
			}
		}, this);
		if ($chk(this.options.display)) this.display(this.options.display);
	},
 
	addSection: function(toggler, element, pos){
		toggler = $(toggler);
		element = $(element);
		var test = this.togglers.contains(toggler);
		var len = this.togglers.length;
		this.togglers.include(toggler);
		this.elements.include(element);
		if (len && (!test || pos)){
			pos = $pick(pos, len - 1);
			toggler.inject(this.togglers[pos], 'before');
			element.inject(toggler, 'after');
		} else if (this.container && !test){
			toggler.inject(this.container);
			element.inject(this.container);
		}
		var idx = this.togglers.indexOf(toggler);
		toggler.addEvent('click', this.display.bind(this, idx));
		if (this.options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});
		if (this.options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});
		element.fullOpacity = 1;
		if (this.options.fixedWidth) element.fullWidth = this.options.fixedWidth;
		if (this.options.fixedHeight) element.fullHeight = this.options.fixedHeight;
		element.setStyle('overflow', 'hidden');
		if (!test){
			for (var fx in this.effects) element.setStyle(fx, 0);
		}
		return this;
	},
 
	display: function(index){
		index = ($type(index) == 'element') ? this.elements.indexOf(index) : index;
		if ((this.timer && this.options.wait) || (index === this.previous && !this.options.alwaysHide)) return this;
		this.previous = index;
		var obj = {};
		this.elements.each(function(el, i){
			obj[i] = {};
			var hide = (i != index) || (this.options.alwaysHide && (el.offsetHeight > 0));
			this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]);
			for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]];
		}, this);
		return this.start(obj);
	}
 
});

Je vous conseille de ne pas trop toucher à ce fichier, sauf si vous vous y connaissez ;)

Ensuite vient le fichier demo.js

window.addEvent('domready', function() {
 
	//create our Accordion instance
	var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
		opacity: false,
		onActive: function(toggler, element){
			toggler.setStyle('color', '#41464D');
		},
		onBackground: function(toggler, element){
			toggler.setStyle('color', '#528CE0');
		}
	});
 
	//add click event to the "add section" link
	$('add_section').addEvent('click', function(event) {
		event.stop();
 
		// create toggler
		var toggler = new Element('h3', {
			'class': 'toggler',
			'html': 'Common descent'
		});
 
		// create content
		var content = new Element('div', {
			'class': 'element',
			'html': '<p>A group of organisms [...] </p>'
		});
 
		// position for the new section
		var position = 0;
 
		// add the section to our myAccordion using the addSection method
		myAccordion.addSection(toggler, content, position);
	});
});

Un code un peu plus digeste que le précédent. Détaillons-le :

windows.addEvent('domready', function())

Cette méthode permet d'exécuter la fonction dès que l’arbre dom est chargé. Elle est nécessaire dans tous vos scripts liés au Frameworks Mootools.

var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
		opacity: false,
		onActive: function(toggler, element){
			toggler.setStyle('color', '#41464D');
		},
		onBackground: function(toggler, element){
			toggler.setStyle('color', '#528CE0');
		}
	});

Ici on déclare une nouvelle instance de la classe Accordion en spécifiant les éléments html qui vont interagir avec le JavaScript. En l'occurence, les éléments h3 de classe toggler et les éléments div de classe element. On définit ensuite la couleur du texte des éléments dans les deux états : activé et non activé.

//add click event to the "add section" link
	$('add_section').addEvent('click', function(event) {
		event.stop();
 
		// create toggler
		var toggler = new Element('h3', {
			'class': 'toggler',
			'html': 'Common descent'
		});
 
		// create content
		var content = new Element('div', {
			'class': 'element',
			'html': '<p>A group of organisms [...] </p>'
		});
 
		// position for the new section
		var position = 0;
 
		// add the section to our myAccordion using the addSection method
		myAccordion.addSection(toggler, content, position);
	});

Ce code permet d'ajouter une nouvelle section suite à un clic sur un élément d'id add_section. Cet ajout de section se caractérise par l'ajout d'un élément h3.toggler et d'un élément div.element. Ce bout de code n'a pas vraiment d'importance dans l'utilisation d'un accordéon classique.

Ensuite vient le fichier demo.css

#accordion {
	margin:20px 0px;
}
 
h3.toggler {
	cursor: pointer;
	border: 1px solid #f5f5f5;
	border-right-color: #ddd;
	border-bottom-color: #ddd;
	font-family: 'Andale Mono', sans-serif;
	font-size: 12px;
	background: #D2E0E6;
	color: #528CE0;
	margin: 0 0 4px 0;
	padding: 3px 5px 1px;
}
 
div.element p, div.element h4 {
	margin:0px;
	padding:4px;
}
 
blockquote {
	padding:5px 20px;
}

Rien de bien particulier. C'est ici que se paramètre le style de votre application.

Enfin, le fichier index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<link rel="stylesheet" href="demo.css" type="text/css" />
	<script type="text/javascript" src="../mootools.js"></script>
	<script type="text/javascript" src="demo.js"></script>
	<title>Accordion Demo</title>
</head>
<body>
	<h1>Accordion</h1>
	<h2>Introduction</h2>
	<p>
		The Accordion gives you a fancy way to only show the really needed content.
	</p>
	<hr />
	<div>
		<a id="add_section" href="#">add section</a>
	</div>
	<div id="accordion">
		<h3 class="toggler">History</h3>
		<div class="element">
			<h4>Common ancestor</h4>
			<p>The first suggestion [...]</p>
			<blockquote>"Could one not say [...]</blockquote>
			<h4>The Origin of Species</h4>
			<p>In 1859, Charles Darwin's [...]</p>
			<blockquote>[P]robably all [...]</blockquote>
			<p>The famous closing [...]</p>
		</div>
 
		<h3 class="toggler">Evidence of universal common descent</h3>
		<div class="element">
			<h4>Common biochemistry and genetic code</h4>
			<p>All known forms [...]</p>
			<img src="images/phylogenetic_tree.png" width="340" height="230" align="right" alt="" />
			<p>The universality [...]</p>
			<h4>Phylogenetic trees</h4>
			<p>Another important [...]</p>
		</div>
 
		<h3 class="toggler">Examples of common descent</h3>
		<div class="element">
			<h4>Artificial selection</h4>
			<p>Artificial selection [...]</p>
			<img src="images/biglittledog.jpg" width="180" height="151" align="right" alt="" />
			<h4>Dog breeding</h4>
			<p>An obvious [...]</p>
		</div>
	</div>
</body>
</html>

Ce fichier recense 3 éléménts capitaux :

<div id="accordion">
</div>

C'est dans cette div que devront figurer tous vos élements dynamiques. Ne l'oubliez pas ;)

<h3 class="toggler">
</h3>

C'est en cliquant sur ces éléments que vous allez déclencher l'action (affichage ou masquage de la DIV).

<div class="element">
</div>

Ce sont les éléments qui seront masqués ou affichés

Enfin, un détail très important, n'oubliez pas de déclarer le DOCTYPE de votre document ainsi que de faire figurer le paramètre xmlns dans votre balise HTML :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

On s'en tiendra là pour cette première approche. Je vous conseille vivement d'aller fouiner sur le site de Mootools afin de tester dans un premier temps toutes les démos, afin de les mettre en application et ainsi maitriser ce Frameworks qui a de l'avenir ;)

18 nov. 2008

Google Analytics et les liens sortants

Par Jean-Christophe Duvivier à 22:12

Mots Clés Analytics, Google, JavaScript,

Malgré le nombre astronomique de fonctionnalités que propose Google Analytics (tellement astronomique que vous ne vous servez que de 20% de ces fonctionnalités), vous vous êtes rendu compte que cet outil n'est pas si performant que ça.

En effet, concernant les statistiques liées à l'exploration des pages de votre site, Google Analytics est de loin le meilleur sur le marché, mais concernant les pages externes, que vous mentionnez depuis votre site, il ne fournit aucune information.

Alors comment connaitre les statistiques relatives aux liens externes de votre site ? Savez-vous que Google Analytics le permet ? Voici l'explication :

Dans chacun de vos liens externes, il vous faut rajouter un appel à une fonction JavaScript qui permettra de renseigner Google Analytics :

<a href="http://www.site_externe.fr" onclick="javascript: pageTracker._trackPageview ('/sortant/site_externe');">

Pour consulter vos statistiques liées aux liens sortants, rien de plus simple. Rendez-vous dans "Contenu > Pages les plus consultées". Vous n'avez plus qu'a filtrer les liens sortants grâce à la zone de saisie :

Liens sortants

Il est bon de noter que cette méthode ne prend pas en compte les clics effectués avec la roulette de la souris, ou les "clic droit > ouvrir dans un nouvel onglet". Mais il faut l'avouer, elle reste très efficace pour connaitre le trafic extérieur que votre génère votre site ;)

12 nov. 2008

Gestion d'une Google Map avec PHP

Par Jean-Christophe Duvivier à 12:40

Mots Clés Google, GoogleMaps, JavaScript, PHP,

Nous voilà en route pour un tutoriel sur l'utilisation et la gestion d'une Google Map en ne manipulant que du code PHP. C'est pas génial ?! Vous le savez surement, et ça coule de source, l'API GoogleMaps est, à la base, géré principalement par du JavaScript. Etant donné que certains développeurs ont un peu de mal avec ce langage, et que celui utilisé par l'API GoogleMaps n'est pas du JavaScript de base, des classes PHP on vu le jour. Elles sont nombreuses sur la toile, nous allons nous intéresser à l'une d'entre elles : N/X API to Google Maps.

Pour la télécharger, ils vous suffit de vous rendre sur l'excellent site de PHP Classes, une immense bibliothèque de classes PHP qui vous simplifiera grandement la vie. L'enregistrement est nécessaire pour pouvoir accéder aux fichiers, cela ne prend que quelques secondes et cela vous fera gagner des jours ;) La classe est donc disponible ici : www.phpclasses.org

Une fois téléchargée, nous allons nous intéresser de près à cette classe. Pour ceux qui l'ont parcouru rapidement, vous aurez pu constater que ce sont des méthodes qui génèrent le code JavaScript nécessaire à l'affichage de la carte. Il nous suffit donc d'utiliser ses méthodes pour obtenir ce que l'on souhaite. Vous avez placé votre classe à la racine ou dans un répertoire de votre site ? Alors c'est parti !

La première chose à faire est de récupérer une clé (API Key) gentiment délivrée par Google à cette adresse : Google Maps API Key. Une fois que vous aurez lu l'intégralité de la page, vous devrez renseigner le champ "My web site URL". Il faut saisir l'adresse dans laquelle se trouvera votre GoogleMaps. Si elle est à la base : http://www.monsite.fr/, si elle est dans le répertoire toto : http://www.monsite.fr/toto. Il ne faut surtout pas la changer de place après l'obtention de votre clé, ou alors il vous faudra redemander une clé valide à Google.

Commencez par ouvrir votre classe php, et recherchez-y la ligne suivante (ligne 37 en principe) :

<?php define(GoogleMapsKey, '<your api key here>'); ?>

Remplacez <your api key here> par votre clé valide.

Créez ou ouvrez un fichier PHP dans lequel figurera votre carte. Nous allons commencer par une version de base pour bien assimiler les méthodes.

<?php
require "nxgooglemapsapi.php"; // Inclusion de la classe
$api = new NXGoogleMapsAPI(); // Création d'une instance de la classe
$api->setWidth(800); // Définition de la largeur de la carte
$api->setHeight(600); // Définition de la hauteur de la carte
?>
 
<html>
  <head>
    <?php echo $api->getHeadCode(); ?>
  </head>
  <body onLoad="<?php echo $api->getOnLoadCode(); ?>">
    <?php echo $api->getBodyCode(); ?>
  </body>
</html>

Je pense que les commentaires suffisent à la bonne compréhension du script : après avoir créé une instance de la classe, on utilise une méthode chargée de fixer la largeur de la carte et une autre chargée de fixer sa hauteur. Dans le code HTML qui suit, on fait juste appel à des méthodes chargées d'écrire le code javascript nécessaire dans le HEAD, le BODY et les paramètres du BODY.

Et si nous procédions à une utilisation plus poussée de cette classe ? C'est parti !

<?php
require "nxgooglemapsapi.php"; // Inclusion de la classe
$api = new NXGoogleMapsAPI(); // Création d'une instance de la classe
$api->setWidth(800); // Définition de la largeur de la carte
$api->setHeight(600); // Définition de la hauteur de la carte
$api->setZoomFactor(16); // Définition du zoom
$api->addControl(GLargeMapControl); // Ajout des contrôleurs
$api->addControl(GMapTypeControl); // Ajout des types de vue
$api->addControl(GOverviewMapControl); // Ajout de la carte miniature
?>
 
<html>
  <head>
    <?php echo $api->getHeadCode(); ?>
  </head>
  <body onLoad="<?php echo $api->getOnLoadCode(); ?>">
    <?php echo $api->getBodyCode(); ?>
  </body>
</html>

Quelques explications s'imposent pour ces nouvelles méthodes :

$api->setZoomFactor(16);

Permet de définir la valeur du zoom. Plus le zoom est important, plus la localisation sera précise. La valeur maximum est 17.

$api->addControl(GLargeMapControl);

Permet d'ajouter des contrôleurs pour régler le zoom, et se déplacer sur la carte. Il existe deux types de contrôleurs de tailles différentes. Ceux-ci sont les plus importants. Pour avoir les contrôleurs réduits, il suffit d'utiliser le code suivant :

$api->addControl(GSmallMapControl);
$api->addControl(GMapTypeControl);

Affiche 3 boutons qui vont permettre à l'utilisateur d'afficher la carte en format "plan", "satellite" ou bien "mixte".

$api->addControl(GOverviewMapControl);

Permet d'ajouter une miniature de la carte dans le coin inférieur droit. Cela permet de naviguer plus rapidement sur la carte.

Maintenant que tout cela est vu, nous allons passer à l'ajout d'adresses sur la carte.

<?php
require "nxgooglemapsapi.php"; // Inclusion de la classe
$api = new NXGoogleMapsAPI(); // Création d'une instance de la classe
$api->setWidth(800); // Définition de la largeur de la carte
$api->setHeight(600); // Définition de la hauteur de la carte
$api->setZoomFactor(12); // Définition du zoom
$api->addControl(GLargeMapControl); // Ajout des contrôles (zoom, déplacement...)
$api->addControl(GMapTypeControl); // Ajout des types de vue
$api->addControl(GOverviewMapControl); // Ajout de la carte miniature
$api->addAddress("49 avenue des champs élysées Paris", "Haagen-dazs Paris", true);
$api->addAddress("74 avenue des champs élysées Paris", "La Fnac", false);
?>
 
<html>
  <head>
    <?php echo $api->getHeadCode(); ?>
  </head>
  <body onLoad="<?php echo $api->getOnLoadCode(); ?>">
    <?php echo $api->getBodyCode(); ?>
  </body>
</html>

Rien de compliqué. Nous faisons appel à la méthode "addAddress" et nous renseignons dans une premier temps l'adresse (avec rue, ville, CP...), dans un deuxième temps le contenu de l'infobulle et enfin le centrage automatique. Si la valeur est "TRUE", la carte se centrera automatiquement sur l'adresse. Si la valeur est "FALSE", la carte ne sera pas centrée sur l'adresse. À noter que si plusieurs adresses ont l'attribut "TRUE", la carte se centrera sur la dernière adresse ajoutée. De plus, il est possible de faire appel à une méthode de centrage par latitude/longitude :

$api->setCenter('latitude','longitude');

Pour en revenir à l'infobulle, il vous est possible d'y insérer du texte, mais aussi du code HTML avec insertion d'images etc.

Pour terminer ce tutoriel, nous allons implémenter une fonction de recherche sur notre carte avec zone de saisie et renseignement de la latitude et de la longitude.

<?php
require "nxgooglemapsapi.php"; // Inclusion de la classe
$api = new NXGoogleMapsAPI(); // Création d'une instance de la classe
$api->setWidth(800); // Définition de la largeur de la carte
$api->setHeight(600); // Définition de la hauteur de la carte
$api->setZoomFactor(17); // Définition du zoom
$api->addControl(GLargeMapControl); // Ajout des contrôleurs
$api->addControl(GMapTypeControl); // Ajout des types de vue
$api->addControl(GOverviewMapControl); // Ajout de la carte miniature
$api->addAddress("49 avenue des champs élysées Paris", "Haagen-dazs Paris", true);
$api->addAddress("74 avenue des champs élysées Paris", "La Fnac", false);
?>
 
<html>
  <head>
    <?php echo $api->getHeadCode(); ?>
  </head>
  <body onLoad="<?php echo $api->getOnLoadCode(); ?>">
    <?php echo $api->getBodyCode(); ?>
    <form>
      <input type="text" value="" name="address" id="address" />
      <input type="button" value="Rechercher" onClick="moveToAddressDMarker(document.getElementById(’address’).value) ;" />
      x : <input type="text" value="" id="coordX" />
      y : <input type="text" value="" id="coordY" />
    </form>
  </body>
</html>

x représente donc la latitude, et y la longitude. On sort légèrement de la programmation en PHP je vous l'accorde, mais ça reste très abordable ;)

J'en reste là pour ce tuto, je vous laisse l'adapter à vos besoins ;)

23 oct. 2008

Plugins et outils indispensables aux développeurs web

Par Jean-Christophe Duvivier à 11:08

Mots Clés Ajax, CSS, DOM, Firefox, HTML, IE, JavaScript, Outils, Plugin, SeaMonkey,

Je vais vous présenter les Outils et les Plugins que j'utilise quotidiennement et qui représentent pour moi, le minimum vital à tout développeur web. Sans plus attendre, les voici :

1. Plugin Web Developer

S'il n'y en avait qu'un, ce serait celui-ci. Ce Plugin Firefox (également développé sur SeaMonkey) est une mallette à Outils très complète qui permet de répondre à nos besoins les plus récurrents. Voici les grands axes :

  • CSS : Possibilité de voir, désactiver et modifier les CSS d'un site web etc.
  • Formulaire : Possibilité de voir les mots de passe, de convertir la méthode de traitement etc.
  • Image : Possibilité de désactiver les images, d'afficher leurs dimensions, leur poid etc.
  • Informations : Possibilité de voir les id, les classes, les codes couleurs etc.
  • Et d'autres fonctionnalités : outils de validation, de redimensionnement etc.

Pour le télécharger en français, rendez-vous ici : Plugin Web Developer - Fr
Et pour la version anglaise c'est ici : Plugin Web Developer - En

2. Plugin Firebug

Logo Firebug

S'il y en avait un deuxième, ce serait celui-ci. Ce Plugin est un débuggeur évolué pour Firefox . Je vais reprendre la présentation de Geckozone :

FireBug vous permet d'explorer par clavier ou souris les coins les plus reculés du DOM. Tous les Outils dont vous avez besoin pour fureter, produire et controler votre JavaScript, CSS, HTML et Ajax sont rassemblés ensemble à travers une seule extension, incluant un débuggeur, une console d'erreur, une ligne de commande, et une variété d'inspecteurs intéressants…

Un rapide aperçu des fonctionnalités de FireBug :

  • Un débuggeur JavaScript pour naviguer pas à pas dans le code une ligne à la fois,
  • Un icône de barre d'état qui permet de voir rapidement s'il y a une erreur dans la page web,
  • Une console qui montre les erreurs JavaScript et CSS,
  • Messages de Log de JavaScript dans votre page web sur la console
  • Une ligne de commande JavaScript
  • Un espion du trafic XMLHttpRequest,
  • Un inspecteur de source HTML, styles associés, évenements, mise en page et le DOM.

Pour le télécharger en anglais, rendez-vous ici : Plugin Firebug - En

3. Plugin IE Tab

Une harmonisation de l'interprétation du code entre les différents navigateurs étant loin d'être prévue, ce petit outil devient indispensable. Il vous permet d'ouvrir une page IE dans un onglet Firefox.

Pour le télécharger en anglais, rendez-vous ici : Plugin IE Tab - En

4. Plugin Colorzilla

Ce petit plugin servira surtout aux designers web étant donné qu'il permet de récupérer le code hexadécimal d'une couleur par simple survol du curseur. Ça évite la manipulation contraignante du PRINTSCREEN > CTRL + V > PHOTOSHOP.

Pour le télécharger en anglais, rendez-vous ici : Plugin Colorzilla - En

5. Logiciel Multiple IE

Logo Internet Explorer

L'interprétation du code entre les différentes versions de IE étant sensiblement différente, il est souvent utile de contrôler ses applications sur différentes version de IE (la 6.0 et la 7.0 par exemple), ce qu'il implique qu'il faille contrôler son application sur 2 ordinateurs différents. Ce petit logiciel vous permet d'installer 5 versions de IE (IE3, IE4.01, IE5, IE5.5 et IE6) en plus de celle que vous possédez déjà (dans l'idéal : la 7.0).

Pour le télécharger en anglais, rendez-vous ici : Logiciel Multiple IE - En

Si vous vous servez d'autres plugins/outils/logiciels/sites web qui vous semblent utiles pour les développeurs web, n'hésitez pas à les citer à la suite de cet article ;-)

Propulsé par Dotclear - Hebergé par PlanetHoster - Thème Green Mantis par jchristophe
© jchristophe.fr 2008 - 2009
Valide CSS 2.1 CSS 2.1 Valide XHTML 1.0 XHTML Strict 1.0 Flux RSS RSS