<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.alti.info/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Alt-I, des informations alternatives - Informatique, Cultures alternatives et Geekeries saupoudrées d'Ajax. - AJAX</title>
  <link>http://www.alti.info/</link>
  <description>Alt-I, des informations alternatives. Podcast causant d'informatique généraliste et de cultures alternatives avec un soupçon de XHTML, CSS, AJAX, Javascript, et autres outils web…</description>
  <language>fr</language>
  <pubDate>Mon, 08 Sep 2008 18:28:30 +0200</pubDate>
  <copyright>Creative Commons By-NC-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Extensions Firebug</title>
    <link>http://www.alti.info/post/2008/07/09/Extensions-Firebug</link>
    <guid isPermaLink="false">urn:md5:db5439e0cf6b20ad8e65c60fb310dd5e</guid>
    <pubDate>Wed, 09 Jul 2008 13:46:00 +0200</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Développement</category>
        <category>AJAX</category><category>debug</category><category>developpement</category><category>Firebug</category><category>Firefox</category><category>Internet</category><category>JavaScript</category><category>logiciel</category><category>PHP</category><category>web2.0</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://dascritch.net/&quot; hreflang=&quot;fr&quot;&gt;Dascritch&lt;/a&gt; m'a indiqué ce matin un &lt;a href=&quot;http://www.softwareishard.com/blog/firebug/list-of-firebug-extensions/#more-16&quot; hreflang=&quot;fr&quot;&gt;article très intéressant listant les meilleurs extensions pour Firebug&lt;/a&gt;. Pour rappel, Firebug est une extension Firefox incontournable pour tout développeur, facilitant grandement le debug dans le développement web.&lt;/p&gt;


&lt;p&gt;On y retrouves des extensions très pratiques telles que&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&quot;http://www.janodvarko.cz/firecookie&quot;&gt;Firecookie&lt;/a&gt; qui permet de lister tout les cookies de la page en cours et de les éditer&lt;br /&gt;
&lt;img src=&quot;http://www.softwareishard.com/images/posts/firebug-extensions/firebug-extlist-firecookie-thumbnail.png&quot; alt=&quot;FireCookie&quot; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;http://www.firephp.org/&quot;&gt;FirePHP&lt;/a&gt;, &lt;a href=&quot;http://www.alti.info/post/2008/06/19/PHP-en-feu-firebug-firephp-firefox&quot;&gt;dont je parlais il y a peu&lt;/a&gt;, permet de logguer des informations dans la console Firebug à partir d'un script coté serveur, sans modifier le contenu de la réponse envoyée au navigateur. Les logs étant passés dans le header de la page. Nickel pour débugger de l'ajax.&lt;br /&gt;
&lt;img src=&quot;http://www.softwareishard.com/images/posts/firebug-extensions/firebug-extlist-firephp.png&quot; alt=&quot;Firebug&quot; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;http://xrefresh.com/rainbow&quot;&gt;RainbowForFirebug&lt;/a&gt; coloriera le code javascript dans votre console Firebug.&lt;br /&gt;
&lt;img src=&quot;http://www.softwareishard.com/images/posts/firebug-extensions/firebug-extlist-rainbow-thumbnail.png&quot; alt=&quot;Rainbow For Firebug&quot; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;http://billwscott.com/jiffyext/&quot;&gt;Jiffy&lt;/a&gt; calculera le temps d'éxécution de chacune de vos fonctions Javascript.&lt;br /&gt;
&lt;img src=&quot;http://www.softwareishard.com/images/posts/firebug-extensions/firebug-extlist-jiffy-thumbnail.png&quot; alt=&quot;Jiffy&quot; /&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;L'article en recense encore plein d'autres, mais c'était celles qui me paraissaient les plus intéressantes. Bon débug &lt;img src=&quot;/themes/Alt-I/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2008/07/09/Extensions-Firebug#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2008/07/09/Extensions-Firebug#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/306</wfw:commentRss>
    					<div id="subscribetocomments_block">
						<h3>Abonnement aux commentaires</h3>
						<p>
							<a href="http://www.alti.info/subscribetocomments&amp;post_id=306">
								<!-- # If the subscriber is logged in -->
																<!-- # If the subscriber is not logged in -->
																	S'abonner pour recevoir les commentaires suivants par email															</a>
						</p>
					</div>
				  </item>
    
  <item>
    <title>Menu en colonne en Javascript</title>
    <link>http://www.alti.info/post/2008/02/10/Menu-en-colonne-en-Javascript-MenuCol</link>
    <guid isPermaLink="false">urn:md5:064ed3aabc6d7fb10273d8334fd82cc5</guid>
    <pubDate>Tue, 12 Feb 2008 12:55:00 +0100</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Développement</category>
        <category>accessibilité</category><category>AJAX</category><category>concept</category><category>developpement</category><category>ergonomie</category><category>free</category><category>GPL</category><category>GUI</category><category>JavaScript</category><category>Mac OS X</category><category>open source</category><category>programmation</category><category>projet</category><category>téléchargement</category>    
    <description>&lt;p&gt;&lt;a href=&quot;http://www.nicolas-guilhou.com/&quot; hreflang=&quot;fr&quot;&gt;Xylpho&lt;/a&gt; voulait pour son site, un menu en colonne comme le fait Mac OS X&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.alti.info/images/Scrinchoutes/Menu_Colonne_Mac_OS_X_piti.png&quot; alt=&quot;Menu Colonne Mac OS X&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Ce menu devait être à la fois accessible, référençable et dynamique. Donc, pas de flash&amp;nbsp;! Javascript à la rescousse. Je lui ai donc codé une classe JS qui construit un menu en colonne à partir de listes imbriquées…&lt;/p&gt;    &lt;p&gt;En gros, tout le plan du site est intégré dans la page et structuré avec des ul et des li imbriqués&amp;nbsp;:&lt;/p&gt;

&lt;a href=&quot;http://www.alti.info/post/2008/02/10/#&quot; onclick=&quot;document.getElementById('codeHTML').style.display = 'block'; return false;&quot;&gt;
Voir le code HTML
&lt;/a&gt;
&lt;pre id=&quot;codeHTML&quot; style=&quot;display: none;&quot;&gt;
&amp;lt;ul id=&quot;menuCol&quot;&amp;gt;
	&amp;lt;li&amp;gt;
		2005
		&amp;lt;ul&amp;gt;
			&amp;lt;li&amp;gt;
				July
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						27
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=4&quot;&amp;gt;
									Joulie Interface
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				September
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						29
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=11&quot;&amp;gt;
									Version Texte
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				October
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						29
						&amp;lt;ul&amp;gt;
							&amp;lt;li class=&quot;selected&quot;&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=18&quot;&amp;gt;
									Qjelt Octobre en VideoCast
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				November
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						08
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=19&quot;&amp;gt;
									www.alti.info
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				December
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						08
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=20&quot;&amp;gt;
									OW Pick !!!
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;



&lt;p&gt;Ensuite, ma classe Javascript va masquer et afficher les bons ul selon les clicks sur les li. Le menu se crée en créant un nouvel objet de la sorte&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&amp;gt;
//&amp;lt;![CDATA[
	var test = new MenuCol.Menu('menuCol');
	MenuCol.Item.open();
//]]&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/pre&gt;



&lt;p&gt;La statique open() permet d'initialiser le menu sur le li qui contient la classe 'selected' afin de revenir sur le menu correspondant après un chargement de page.&lt;/p&gt;


&lt;p&gt;Tout ceci fonctionne grâce au script MenuCol.js, que je rends disponible sous licence GPLv3. Faites en ce que voulez, mais souvenez vous de citer mon nom.&lt;/p&gt;

&lt;a href=&quot;http://www.alti.info/post/2008/02/10/#&quot; onclick=&quot;document.getElementById('codeJS').style.display = 'block'; return false;&quot;&gt;
Voir le code Javascript
&lt;/a&gt;
&lt;pre id=&quot;codeJS&quot; style=&quot;display: none;&quot;&gt;
// Global object
var MenuCol = {};

/**
 * Flag to stop propagation of event
 * @type Boolean
 */
MenuCol._stopPropagation = false;

/**
 Shortcut to document.getElementById
 * @param {String/Element} id Element or Element's id
 * @returns Element
 */
MenuCol.get = function(id)
{
	var elmt = document.getElementById(id);
	if (elmt)
	{
		return elmt;
	}
	return id;
};

// Objects collection
MenuCols = new Array();

/**
 * Menu class
 * @constructor
 * @param {String/Element} elmt UL menu Element or it's id
 * @author Hadrien Lanneau
 */
MenuCol.Menu = function(elmt)
{
	/**
	 * Element
	 * @type Element
	 */
	this.element = MenuCol.get(elmt);
	
	/**
	 * Items inside Menu
	 * @type Array
	 */
	this.items = new Array();
	
	MenuCols.push(this);
	
	this.init();
}
MenuCol.Menu.prototype =
{
	/**
	 * Initialize
	 */
	init: function()
	{
		// Make Item object with all li children
		var lis = this.element.getElementsByTagName('li');
		for (var i = 0; lis[i]; i++)
		{
			if (lis[i].parentNode == this.element)
			{
				var item = new MenuCol.Item(
					lis[i]
				);
				item.parent = this;
				this.items.push(
					item
				);
			}
		}
	},
	/**
	 * Hide menu
	 */
	hide: function()
	{
		this.element.style.display = 'none';
	},
	/**
	 * Show Menu
	 */
	show: function()
	{
		this.element.style.display = 'block';
	}
};

MenuCol.Items = new Array();
/**
 * MenuCol.Item class
 * @constructor
 * @param {String/Element} elmt UL menu Element or it's id
 * @author Hadrien Lanneau
 */
MenuCol.Item = function(elmt)
{
	/**
	 * Element
	 * @type Element
	 */
	this.element = MenuCol.get(elmt);
	
	/**
	 * Submenu
	 * @type MenuCol.Menu
	 */
	this.submenu = null;
	
	MenuCol.Items.push(this);
	
	this.init();
}
MenuCol.Item.prototype =
{
	/**
	 * Initialize
	 */
	init: function()
	{
		// Make Menu object with all UL children
		var uls = this.element.getElementsByTagName('ul');
		for (var i = 0; uls[i]; i++)
		{
			if (uls[i].parentNode == this.element)
			{
				this.submenu = new MenuCol.Menu(
					uls[i]
				);
				this.submenu.parent = this;
				this.submenu.hide();
			}
		}
		
		// Add on click Event on element
		this.element.parent = this;
		this.element.onclick = this.onclick;
	},
	/**
	 * onclick event
	 */
	onclick: function()
	{
		// Exec only on first fire
		if (!MenuCol._stopPropagation)
		{
			// If item hasn't submenu, we don't do anything
			if (!this.parent.submenu)
			{
				return true;
			}
			
			// Hiding all sub menus of same level
			for (var i = 0; this.parent.parent.items[i]; i++)
			{
				if (this.parent.parent.items[i].submenu)
				{
					this.parent.parent.items[i].submenu.hide();
					this.parent.parent.items[i].activate(
						true,
						true
					);
				}
			}
			
			// …and their children
			for (i = 0; this.parent.submenu.items[i]; i++)
			{
				this.parent.submenu.items[i].activate(true);
				if (this.parent.submenu.items[i].submenu)
				{
					this.parent.submenu.items[i].submenu.hide();
				}
			}
			
			// Show corresponding sub menu
			this.parent.submenu.show();
			
			// And its parents
			var parent = this.parent ?
				this.parent :
				null;
			while (parent)
			{
				parent.parent.show();
				parent.activate(
					false,
					false
				);
				parent = parent.parent ?
					parent.parent.parent :
					null;
			}
			
			// Activate item
			this.parent.activate(
				false,
				true
			);
			
			// Prevents event propagation on parent's elements
			MenuCol._stopPropagation = true;
			setTimeout(
				function()
				{
					MenuCol._stopPropagation = false;
				},
				20
			)
		}
	},
	/**
	 * activate element
	 * @param {Boolean} oupa True to deactivate
	 */
	activate: function(oupa, submenu)
	{
		// Activate item
		if (!oupa)
		{
			this.element.className = 'selected';
		}
		else
		{
			this.element.className = '';
		}
		// Activate submenu
		if (submenu)
		{
			if (!oupa)
			{
				this.submenu.element.className = 'selected';
			}
			else
			{
				this.parent.element.className = '';
			}
		}
	}
};

/**
 * Open menu on activated li. Will open on li with 'selected' class
 */
MenuCol.Item.open = function()
{
	for (var i = 0; MenuCol.Items[i]; i++)
	{
		if (MenuCol.Items[i].element.className == 'selected')
		{
			if (MenuCol.Items[i].submenu)
			{
				MenuCol.Items[i].element.onclick();
				
			}
			else
			{
				MenuCol.Items[i].parent.parent.element.onclick();
				MenuCol.Items[i].activate();
			}
		}
	}
}
&lt;/pre&gt;


&lt;pre&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Voici un exemple du résultat qui &lt;a href=&quot;http://www.hadrien.eu/Works/menuCol/&quot; hreflang=&quot;fr&quot;&gt;affiche les archives de ce blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hadrien.eu/telechargements.html#cadre_content&quot; hreflang=&quot;en&quot;&gt;Télécharger le script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2008/02/10/Menu-en-colonne-en-Javascript-MenuCol#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2008/02/10/Menu-en-colonne-en-Javascript-MenuCol#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/238</wfw:commentRss>
    					<div id="subscribetocomments_block">
						<h3>Abonnement aux commentaires</h3>
						<p>
							<a href="http://www.alti.info/subscribetocomments&amp;post_id=238">
								<!-- # If the subscriber is logged in -->
																<!-- # If the subscriber is not logged in -->
																	S'abonner pour recevoir les commentaires suivants par email															</a>
						</p>
					</div>
				  </item>
    
  <item>
    <title>Requêtes Ajax et Internet Explorer</title>
    <link>http://www.alti.info/post/2008/01/04/Requetes-Ajax-et-Internet-Explorer</link>
    <guid isPermaLink="false">urn:md5:233806253a5c615438102a1844bbc728</guid>
    <pubDate>Fri, 04 Jan 2008 12:05:00 +0100</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>IE SUX</category>
        <category>AJAX</category><category>developpement</category><category>IE</category><category>Microsoft</category><category>navigateur</category>    
    <description>    &lt;p&gt;J'inaugure une nouvelle catégorie &quot;&lt;a href=&quot;http://www.alti.info/category/IE-SUX&quot; hreflang=&quot;fr&quot;&gt;IE SUX&lt;/a&gt;&quot; dans laquelle j'exprimerais mes coup de gueules envers les &lt;strong&gt;malfonctions de cette bouse infâme qu'est Internet Explorer&lt;/strong&gt;. Aujourd'hui, IE et les requêtes Ajax.&lt;/p&gt;


&lt;p&gt;Un bug sur &lt;a href=&quot;http://www.over-blog.com&quot; hreflang=&quot;fr&quot;&gt;Over-blog&lt;/a&gt;&amp;nbsp;: impossible de mettre un caractère accentué à un nom de catégorie sous IE. Celui-ci envoie systématiquement le string en ISO au lieu d'UTF-8.&lt;/p&gt;


&lt;p&gt;Après moulte fouilles et tentatives de debug, j'ai finalement trouvé la cause du problème. Il s'agit en fait d'un bug de l'objet ActiveX XMLHTTP de IE (6 et 7). Lorsque l'on envoie des données via une requête Ajax en &lt;strong&gt;Get&lt;/strong&gt;, IE se fait un malin plaisir à envoyer la donnée en tant que UTF-8, mais en réalité en ISO. D'où la réception d'un caractère foireux. Par contre, si les données sont envoyées en Post, aucun problème, c'est de l'UTF-8 qu'il envoit.&lt;/p&gt;


&lt;p&gt;Conclusion, &lt;strong&gt;envoyez toute vos requêtes Ajax en Post&lt;/strong&gt;. Merci Microsoft.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2008/01/04/Requetes-Ajax-et-Internet-Explorer#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2008/01/04/Requetes-Ajax-et-Internet-Explorer#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/221</wfw:commentRss>
    					<div id="subscribetocomments_block">
						<h3>Abonnement aux commentaires</h3>
						<p>
							<a href="http://www.alti.info/subscribetocomments&amp;post_id=221">
								<!-- # If the subscriber is logged in -->
																<!-- # If the subscriber is not logged in -->
																	S'abonner pour recevoir les commentaires suivants par email															</a>
						</p>
					</div>
				  </item>
    
  <item>
    <title>Ajax, navigation et accessibilité… Exemple pratique</title>
    <link>http://www.alti.info/post/2007/09/08/Ajax-navigation-et-accessibilite-Exemple-pratique</link>
    <guid isPermaLink="false">urn:md5:c8ef6605303625fed91ba0dfb5aa2d2b</guid>
    <pubDate>Sat, 08 Sep 2007 23:42:00 +0200</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Développement</category>
        <category>accessibilité</category><category>AJAX</category><category>astuce</category><category>bidouille</category><category>developpement</category><category>Internet</category><category>JavaScript</category><category>W3C</category><category>web</category><category>web2.0</category>    
    <description>    &lt;p&gt;J'ai codé à l'arrache un &lt;strong&gt;exemple pratique&lt;/strong&gt; pour illustrer mon &lt;a href=&quot;http://www.alti.info/post/2007/08/26/Ajax-navigation-et-accessibilite-onload-anchor-ancre-astuce-javascript&quot; hreflang=&quot;fr&quot;&gt;astuce concernant la navigation en Ajax accessible&lt;/a&gt;. Bon, c'est pas encore top au point, mais ça fonctionne nickel sous Firefox. Sous Safari 2, l'historique n'est pas modifié donc, pas de précédent ou suivant. Seul le rechargement de page fonctionne. Opera 9.5, seul le bouton Suivant ne fonctionne étrangement pas. Et IE, j'ai pas testé&amp;nbsp;: j'ai pas envie de lancer VMWare&amp;nbsp;: j'attends vos retours en commentaires.&lt;/p&gt;


&lt;p&gt;Donc, de quoi s'agit il&amp;nbsp;? Nous avons une liste paginée. Sont affichés la liste des articles de ce blog par lot de 10 éléments. Une pagination en dessous permet d'afficher les 10 éléments suivants grâce à Ajax. Vous constaterez que lors d'un clic sur un numéro de page, une ancre s'ajoute à l'url. Mais aucun rechargement de page ne s'effectue.&lt;/p&gt;


&lt;p&gt;Faîtes donc le test suivant&amp;nbsp;: naviguez de page en page, puis rechargez la page. Vous vous retrouverez à la même pagination où vous étiez \o/ Attention, ce n'est pas fini. Cliquez sur le bouton précédent de votre navigateur… Pas de rechargement ni de changement de page, mais vous voilà quand même à la pagination précédente, toujours en ajax :o Revenez donc en arrière deux ou trois fois, puis repartez en avant. Même principe. Tout se charge par Ajax.&lt;/p&gt;


&lt;p&gt;Voilà &lt;strong&gt;une application Ajax totalement accessible&lt;/strong&gt; et qui reste utilisable comme tout site traditionnel.&lt;/p&gt;


&lt;p&gt;Ah oui, ça se passe ici&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://hadrien.eu/Works/AccessibiliteAjax/&quot; hreflang=&quot;fr&quot;&gt;Exemple pratique pour rendre Ajax accessible&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La prochaine étape sera d'écrire un module pour YUI afin de faciliter l'implémentation de cette méthode.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2007/09/08/Ajax-navigation-et-accessibilite-Exemple-pratique#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2007/09/08/Ajax-navigation-et-accessibilite-Exemple-pratique#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/166</wfw:commentRss>
    					<div id="subscribetocomments_block">
						<h3>Abonnement aux commentaires</h3>
						<p>
							<a href="http://www.alti.info/subscribetocomments&amp;post_id=166">
								<!-- # If the subscriber is logged in -->
																<!-- # If the subscriber is not logged in -->
																	S'abonner pour recevoir les commentaires suivants par email															</a>
						</p>
					</div>
				  </item>
    
  <item>
    <title>Ajax, navigation et accessibilité…</title>
    <link>http://www.alti.info/post/2007/08/26/Ajax-navigation-et-accessibilite-onload-anchor-ancre-astuce-javascript</link>
    <guid isPermaLink="false">urn:md5:ff47fd0542cbf5a6ae6ae60d93ca9da7</guid>
    <pubDate>Sun, 26 Aug 2007 14:55:00 +0200</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Développement</category>
        <category>accessibilité</category><category>AJAX</category><category>astuce</category><category>developpement</category><category>web2.0</category>    
    <description>&lt;p&gt;Quand on fait un site tout en &lt;strong&gt;Ajax&lt;/strong&gt;, la problématique principale est &lt;strong&gt;l'accessibilité&lt;/strong&gt;. Quand le contenu de la page web est chargée avec Ajax, il n'y a plus de changement physique de page, donc d'url. Du coup, les boutons précédents, suivant et recharger du navigateur ne serve à rien, hormis ramener à la page d'accueil du site. Sans débattre sur l'utilité de faire un site 100% ajax, voici un moyen de ne pas perdre le fil de la navigation.&lt;/p&gt;    &lt;p&gt;Imaginons le cas pratique suivant. J'arrive sur une page avec une liste d'items et des boutons de pagination (précédent - 1 - 2 -3 - suivant). Je clique sur suivant, et seul la liste des items est chargée via ajax. Je clique 3 fois sur suivant, je suis donc à 4 chargements de listes, et je trouve enfin ce que je cherche. Sur l'item en question, un lien externe m'envoie vers une nouvelle page. Zut, c'était pas ça. Je clique sur le bouton précédent de mon navigateur… Arf… Me revoilà à la première page de pagination de ma liste d'item. Heureusement que je me souviens que j'était à la 4° page, sinon, j'aurais du me retaper tout les clics sur suivant jusqu'à reconnaitre la page où j'étais.&lt;/p&gt;


&lt;p&gt;Pour éviter ceci, je vous propose une solution toute simple. Le concept est de placer des &lt;strong&gt;paramètres&lt;/strong&gt; en tant qu'&lt;strong&gt;ancre&lt;/strong&gt; dans l'url&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Nous arrivons sur la page principale, nous sommes à l'adresse :&lt;br /&gt;
&lt;em&gt;http://www.monsiteenajax.com/liste.html&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Je clique sur suivant, l'adresse ne change pas. C'est ici qu'il faut agir. Lors du clic, je vais ajouter une ancre à l'url avec mes paramètres pour me retrouver avec une url de ce style :&lt;br /&gt;
&lt;em&gt;http://www.monsiteenajax.com/liste.html&lt;strong&gt;#page-2&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Pour ce faire, il suffit de changer la valeur de window.location. Voici une fonction qui permet de changer cette valeur&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
var changeAnchor = function(anchor)
{
	// Si l'url possède déjà une ancre
	if (window.location.href.match(new RegExp('#.*$')))
	{
		window.location = window.location.href.replace(
			new RegExp('#.*$'),
			'#' + anchor
		);
	}
	// Sinon, il suffit de l'ajouter à la fin
	else
	{
		window.location = window.location.href + &quot;#&quot; + anchor
	}
	
	return window.location;
}
&lt;/pre&gt;



&lt;p&gt;Donc, lors de l'évenement qui va déclencher la requete ajax et l'affichage de la deuxième page de la liste, je fais un petit changeAnchor('page-2') afin de changer mon ancre et garder en mémoire que je suis sur la pagination numéro 2.&lt;br /&gt;
Ainsi, si je change de page, puis que je clique sur Précédent, ça sera l'url &lt;em&gt;http://www.monsiteenajax.com/liste.html#page-2&lt;/em&gt; qui sera chargée.&lt;/p&gt;


&lt;p&gt;Ne reste plus qu'à exploiter cette fonction. C'est encore tout simple. Implémentez cette fonction&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
var getAnchor = function()
{
	return window.location.href.match(
		new RegExp('#.*$')
	);
}
&lt;/pre&gt;



&lt;p&gt;Il ne reste plus qu'à l'appeler au load de la page, et de faire les actions relatives à ce qu'elle renvoit.&lt;/p&gt;


&lt;p&gt;Reprenons notre cas. Je clique sur le lien pour avoir la pagination suivante. Cela va appeler une fonction qui va charger la liste et à la fin, elle va faire un changeAnchor('page-2').&lt;/p&gt;


&lt;p&gt;Sur le onload de la page, je met un switch sur le getAnchor pour effectuer les actions relative. Donc, là, si mon anchor contient page, il faudra afficher la page dont le numéro suit&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
window.onload = function()
{
	// Je récupère l'ancre et la splite sur le '-' car
	// j'ai décidé de séparer mes paramètres par des '-'
	var startParams = getAnchor()page.split('-');
	
	// Je teste le premier paramètre
	switch (startParams[0])
	{
		case 'page':
			// Je suis dans le cas de la pagination
			
			// Si le deuxième paramètre est setté
			if (startParams[1])
			{
				// J'apelle ma méthode d'affichage de page
				// avec le paramètre adéquat
				displayPage(
					startParams[1]
				);
			}
			break;
		
		// Je peux imaginer un autre cas
		case 'autrecas':
			doSomething();
			break;
	}
}
&lt;/pre&gt;



&lt;p&gt;Et voilà. Si je quitte cette page, puis que j'y reviens en consultant mon historique, je reviendrais à l'affichage ajax correspondant. Autre bonus, à chaque fois que l'on change l'ancre via changeAnchor(), c'est une nouvelle entrée dans l'historique du navigateur qui se crée. Donc, on peut réellement utiliser les boutons de la navigation comme pour un site traditionnel.&lt;/p&gt;


&lt;p&gt;Un autre avantage très important, c'est que le site redevient bookmarkable. L'utilisateur peut sans problème mettre en signet une page modifiée par ajax.&lt;/p&gt;


&lt;p&gt;Si vous avez des remarques ou des améliorations à proposer, n'hésitez pas &lt;img src=&quot;/themes/Alt-I/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;EDIT&amp;nbsp;: &lt;a href=&quot;http://www.alti.info/post/2007/09/08/Ajax-navigation-et-accessibilite-Exemple-pratique&quot; hreflang=&quot;fr&quot;&gt;Voici un exemple pratique&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2007/08/26/Ajax-navigation-et-accessibilite-onload-anchor-ancre-astuce-javascript#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2007/08/26/Ajax-navigation-et-accessibilite-onload-anchor-ancre-astuce-javascript#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/160</wfw:commentRss>
    					<div id="subscribetocomments_block">
						<h3>Abonnement aux commentaires</h3>
						<p>
							<a href="http://www.alti.info/subscribetocomments&amp;post_id=160">
								<!-- # If the subscriber is logged in -->
																<!-- # If the subscriber is not logged in -->
																	S'abonner pour recevoir les commentaires suivants par email															</a>
						</p>
					</div>
				  </item>
    
</channel>
</rss>