<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://blog.roxing.net/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>blog.roxing.net</title>
	<link>http://blog.roxing.net/</link>
	<description>weblog roxing.net - astuces spip, php, bash, linux &amp; more</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://blog.roxing.net/spip.php?id_mot=64&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>blog.roxing.net</title>
		<url>https://blog.roxing.net/local/cache-vignettes/L144xH37/siteon0-6ddb5.png?1727125340</url>
		<link>http://blog.roxing.net/</link>
		<height>37</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>[SPIP] Masquer les emails des auteurs</title>
		<link>https://blog.roxing.net/spip-masquer-les-emails-des-auteurs</link>
		<guid isPermaLink="true">https://blog.roxing.net/spip-masquer-les-emails-des-auteurs</guid>
		<dc:date>2017-03-14T17:07:33Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>php</dc:subject>
		<dc:subject>spip</dc:subject>
		<dc:subject>astuce</dc:subject>
		<dc:subject>email</dc:subject>
		<dc:subject>masquer</dc:subject>

		<description>
&lt;p&gt;Pour certains, l'email est une donn&#233;e priv&#233;e qui peut d&#233;j&#224; r&#233;v&#233;ler certaines informations sur son propri&#233;taire. &lt;br class='autobr' /&gt;
Ainsi, nombreux sont les administrateurs de sites SPIP soucieux de pouvoir pr&#233;server la confidentialit&#233; des auteurs dans l'espace priv&#233;, en ne divulgant leur adresse email qu'aux seuls webmestres. &lt;br class='autobr' /&gt;
Pour passer outre une fastidiese surcharge des squelettes du priv&#233;, j'avais propos&#233; une solution sur le forum, et je la retranscris ici, pour qu'elle gagne en visibilit&#233; : &lt;br class='autobr' /&gt;
D&#233;clarer (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/billets" rel="directory"&gt;billets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/php" rel="tag"&gt;php&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/spip-49" rel="tag"&gt;spip&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/email" rel="tag"&gt;email&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/masquer" rel="tag"&gt;masquer&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Pour certains, l'email est une &lt;strong&gt;donn&#233;e priv&#233;e&lt;/strong&gt; qui peut d&#233;j&#224; r&#233;v&#233;ler certaines informations sur son propri&#233;taire.&lt;/p&gt;
&lt;p&gt;Ainsi, nombreux sont les administrateurs de sites SPIP soucieux de pouvoir pr&#233;server la confidentialit&#233; des auteurs dans l'espace priv&#233;, en ne &lt;strong&gt;divulgant leur adresse email qu'aux seuls webmestres&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour passer outre une fastidiese surcharge des squelettes du priv&#233;, j'avais propos&#233; une &lt;a href=&#034;http://forum.spip.net/fr_174451.html#forum265117&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;solution sur le forum&lt;/a&gt;, et je la retranscris ici, pour qu'elle gagne en visibilit&#233; :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D&#233;clarer un traitement automatique sur le champ #EMAIL :&lt;/strong&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='5' class='spip_cadre spip_cadre_block' dir='ltr'&gt;# ./config/mes_options.php $GLOBALS['table_des_traitements']['EMAIL']['auteurs'] = 'camoufler_email(%s, $Pile[1][&#034;id_auteur&#034;])';&lt;/textarea&gt;
&lt;p&gt;&lt;strong&gt;D&#233;clarer les autorisations :&lt;/strong&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='25' class='spip_cadre spip_cadre_block' dir='ltr'&gt;#./squelettes/mes_fonctions.php // voir une fiche auteur : &#234;tre admin ou bien il s'agit de sa propre fiche function autoriser_auteur_voir($faire, $type, $id, $qui, $opt) { if ( ($qui['statut'] == '0minirezo') or ($qui['id_auteur'] == $id) ) { return true; } else return false; } // masquer un email si on est pas autoris&#233; function camoufler_email($email,$id) { include_spip('inc/autoriser'); // on camoufle sauf autorisation if (!autoriser('voir','auteur', $id)) { $email = spip_substr($email,0,3) . &#034;*****&#034;; } return $email; }&lt;/textarea&gt;
&lt;p&gt;Pour passer outre ce traitement automatique, on pourra toujours utiliser la syntaxe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#EMAIL*&lt;/code&gt; dans son squelette si besoin.&lt;/p&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://forum.spip.net/fr_174451.html#forum265117" class="spip_out"&gt;http://forum.spip.net/fr_174451.htm...&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>[SPIP] Appeler le contenu d'un fichier distant directement &#224; l'int&#233;rieur d'un squelette</title>
		<link>https://blog.roxing.net/spip-appeler-contenu-distant-interieur-squelette</link>
		<guid isPermaLink="true">https://blog.roxing.net/spip-appeler-contenu-distant-interieur-squelette</guid>
		<dc:date>2016-12-19T02:23:24Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>php</dc:subject>
		<dc:subject>spip</dc:subject>
		<dc:subject>css</dc:subject>
		<dc:subject>astuce</dc:subject>
		<dc:subject>scssphp</dc:subject>
		<dc:subject>BOM</dc:subject>

		<description>
&lt;p&gt;R&#233;cemment, j'ai eu besoin d'incorporer le contenu d'un fichier distant &#224; l'int&#233;rieur d'un squelette de feuille de style. En l'occurence, il s'agissait de r&#233;cup&#233;rer un fichier CSS dans sa derni&#232;re version (fr&#233;quemment mise &#224; jour) et d'&#233;tendre certaines r&#232;gles CSS via des directives @extend de SCSS &#224; d'autres &#233;l&#233;menst de mon choix. &lt;br class='autobr' /&gt;
Pour complexifier encore la chose, le document source question d&#233;bute par un BOM [1] qui faisait planter le compilateur SCSSphp. &lt;br class='autobr' /&gt;
Mais &#224; SPIP vaillant, rien (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/billets" rel="directory"&gt;billets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/php" rel="tag"&gt;php&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/spip-49" rel="tag"&gt;spip&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/css" rel="tag"&gt;css&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/scssphp" rel="tag"&gt;scssphp&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/bom" rel="tag"&gt;BOM&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;R&#233;cemment, j'ai eu besoin d'&lt;strong&gt;incorporer le contenu d'un fichier distant &#224; l'int&#233;rieur d'un squelette&lt;/strong&gt; de feuille de style. En l'occurence, il s'agissait de r&#233;cup&#233;rer un fichier CSS dans sa derni&#232;re version (fr&#233;quemment mise &#224; jour) et d'&#233;tendre certaines r&#232;gles CSS via des directives &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;@extend&lt;/code&gt; de SCSS &#224; d'autres &#233;l&#233;menst de mon choix.&lt;/p&gt;
&lt;p&gt;Pour complexifier encore la chose, le document source question d&#233;bute par un BOM&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb2-1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; id=&#034;nh2-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt; qui faisait planter le compilateur &lt;a href=&#034;https://github.com/leafo/scssphp&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;SCSSphp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais &#224; SPIP vaillant, rien d'impossible, sans quitter le squelette, en 2 lignes de code s'il vous plait :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='11' class='spip_cadre spip_cadre_block' dir='ltr'&gt;[(#HTTP_HEADER{Content-type:text/css[; charset=(#CHARSET)]})] [(#VAL{url_abs_to_css}|recuperer_url{#ARRAY{transcoder,true}}|table_valeur{page}|texte_script)] .formulaire_spip { @extend .form--fancy; } /* etc ... */ #FILTRE{scss_compile}&lt;/textarea&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb2-1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh2-1&#034; class=&#034;spip_note&#034; title=&#034;Notes 2-1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;&lt;a href=&#034;http://stackoverflow.com/questions/3255993/how-do-i-remove-%C3%AF-from-the-beginning-of-a-file&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://stackoverflow.com/questions/3255993/how-do-i-remove-%C3%AF-from-the-beginning-of-a-file&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>keepalive.sh : Relancer une commande en boucle</title>
		<link>https://blog.roxing.net/keepalive-sh-relancer-une-commande-en-boucle</link>
		<guid isPermaLink="true">https://blog.roxing.net/keepalive-sh-relancer-une-commande-en-boucle</guid>
		<dc:date>2016-11-20T09:10:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>bash</dc:subject>
		<dc:subject>script</dc:subject>
		<dc:subject>astuce</dc:subject>
		<dc:subject>youtube-dl</dc:subject>

		<description>
&lt;p&gt;Une petite astuce pour relancer en boucle une commande jusqu'&#224; ce que le processus se termine en mani&#232;re attendue :
&lt;br class='autobr' /&gt;
# !/bin/bash # keepalive.sh
&lt;br class='autobr' /&gt;
until $1 ; do echo &#034;Processus termin&#233; avec exit code $ ?. On relance...&#034; &gt;&amp;2 sleep 1 done
&lt;br class='autobr' /&gt;
exit 0 &lt;br class='autobr' /&gt;
&#192; l'usage (une fois que le fichier est dans le $PATH) :
&lt;br class='autobr' /&gt;
keepalive.sh &#034;youtube-dl -f hls-best http://www.tf6.ch/concours-super-menuisier.html&#034; &lt;br class='autobr' /&gt;
Pratique, si le t&#233;l&#233;chargement connait des rat&#233;s, plus besoin de le (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/bash" rel="tag"&gt;bash&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/script-50" rel="tag"&gt;script&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/youtube-dl" rel="tag"&gt;youtube-dl&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Une petite astuce pour relancer en boucle une commande jusqu'&#224; ce que le processus se termine en mani&#232;re attendue :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='10' class='spip_cadre spip_cadre_block' dir='ltr'&gt;#!/bin/bash # keepalive.sh until $1; do echo &#034;Processus termin&#233; avec exit code $?. On relance...&#034; &gt;&amp;2 sleep 1 done exit 0&lt;/textarea&gt;
&lt;p&gt;&#192; l'usage (une fois que le fichier est dans le $PATH) :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;keepalive.sh &#034;youtube-dl -f hls-best http://www.tf6.ch/concours-super-menuisier.html&#034;&lt;/textarea&gt;
&lt;p&gt;Pratique, si le t&#233;l&#233;chargement connait des rat&#233;s, plus besoin de le relancer soi-m&#234;me.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>KeePassX, Openbox et clavier fr_FR</title>
		<link>https://blog.roxing.net/keepassx-openbox-et-clavier-fr</link>
		<guid isPermaLink="true">https://blog.roxing.net/keepassx-openbox-et-clavier-fr</guid>
		<dc:date>2016-08-13T11:32:06Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>bash</dc:subject>
		<dc:subject>linux</dc:subject>
		<dc:subject>astuce</dc:subject>
		<dc:subject>openbox</dc:subject>
		<dc:subject>keyboard</dc:subject>
		<dc:subject>keepassx</dc:subject>

		<description>
&lt;p&gt;Pour une obscure raison, la fonctionnalit&#233; Auto-Type de KeePassX (v 0.4.3), utilise une disposition de clavier diff&#233;rente que celle d&#233;finie par le syst&#232;me.
&lt;br class='autobr' /&gt;
$ localectl status System Locale : LANG=fr_FR.UTF-8 VC Keymap : n/a X11 Layout : fr X11 Model : pc105 X11 Variant : latin9 X11 Options : terminate:ctrl_alt_bksp &lt;br class='autobr' /&gt;
Du coup, la saisie auto d'un mot de passe azerty donne qwerty. &lt;br class='autobr' /&gt;
Solution : rajouter cette ligne dans /.config/openbox/autostart :
&lt;br class='autobr' /&gt;
setxkbmap fr &amp;&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/bash" rel="tag"&gt;bash&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/gnu-linux" rel="tag"&gt;linux&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/openbox-85" rel="tag"&gt;openbox&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/keyboard" rel="tag"&gt;keyboard&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/keepassx" rel="tag"&gt;keepassx&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Pour une obscure raison, la fonctionnalit&#233; &lt;strong&gt;Auto-Type &lt;/strong&gt; de KeePassX (v 0.4.3), utilise une disposition de clavier diff&#233;rente que celle d&#233;finie par le syst&#232;me.&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='7' class='spip_cadre spip_cadre_block' dir='ltr'&gt;$ localectl status System Locale: LANG=fr_FR.UTF-8 VC Keymap: n/a X11 Layout: fr X11 Model: pc105 X11 Variant: latin9 X11 Options: terminate:ctrl_alt_bksp&lt;/textarea&gt;
&lt;p&gt;Du coup, la saisie auto d'un mot de passe &lt;kbd&gt;a&lt;/kbd&gt;&lt;kbd&gt;z&lt;/kbd&gt;&lt;kbd&gt;e&lt;/kbd&gt;&lt;kbd&gt;r&lt;/kbd&gt;&lt;kbd&gt;t&lt;/kbd&gt;&lt;kbd&gt;y&lt;/kbd&gt; donne &lt;kbd&gt;q&lt;/kbd&gt;&lt;kbd&gt;w&lt;/kbd&gt;&lt;kbd&gt;e&lt;/kbd&gt;&lt;kbd&gt;r&lt;/kbd&gt;&lt;kbd&gt;t&lt;/kbd&gt;&lt;kbd&gt;y&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt; : rajouter cette ligne dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/openbox/autostart&lt;/code&gt; :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;setxkbmap fr &amp;&lt;/textarea&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>[Bash] Minuterie et Chronom&#232;tre</title>
		<link>https://blog.roxing.net/bash-minuterie-et-chronometre</link>
		<guid isPermaLink="true">https://blog.roxing.net/bash-minuterie-et-chronometre</guid>
		<dc:date>2016-04-27T14:10:36Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>bash</dc:subject>
		<dc:subject>astuce</dc:subject>
		<dc:subject>bash_aliases</dc:subject>

		<description>
&lt;p&gt;Voici 2 fonctions &#224; rajouter &#224; son .bash_aliases
&lt;br class='autobr' /&gt;
function countdown() date1=$((&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt; + $1)) ; while [ &#034;$date1&#034; -ge &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt; ] ; do echo -ne &#034;$(date -u &#8212;date @$(($date1 - &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt;)) (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/bash" rel="tag"&gt;bash&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/bash_aliases" rel="tag"&gt;bash_aliases&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Voici 2 fonctions &#224; rajouter &#224; son &lt;em&gt;.bash_aliases&lt;/em&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='23' class='spip_cadre spip_cadre_block' dir='ltr'&gt;function countdown(){ date1=$((&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt; + $1)); while [ &#034;$date1&#034; -ge &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt; ]; do echo -ne &#034;$(date -u --date @$(($date1 - &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt;)) +%H:%M:%S)\r&#034;; sleep 0.1 done } function stopwatch(){ date1=&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt;; while true; do echo -ne &#034;$(date -u --date @$((&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;date +%s&lt;/code&gt; - $date1)) +%H:%M:%S)\r&#034;; sleep 0.1 done }&lt;/textarea&gt;&lt;h2 class=&#034;spip&#034;&gt;Minuterie (countdown)&lt;/h2&gt;
&lt;p&gt;Une version remani&#233;e de &lt;i&gt;sleep&lt;/i&gt; qui affiche les secondes restantes. Vous voulez un r&#233;veil &#224; la suite d'une micro sieste de 20 minutes ?!&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;countdown 60*20 &amp;&amp; mplayer ~/music/La_chevauch&#233;e_des_Valkyries.mp3&lt;/textarea&gt;&lt;h2 class=&#034;spip&#034;&gt;Chronom&#232;tre (stopwatch)&lt;/h2&gt;
&lt;p&gt;A vos marques. Pr&#234;t ? feu !&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;stopwatch&lt;/textarea&gt;
&lt;p&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; pour remettre &#224; z&#233;ro.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>[SPIP] Mettre en exergue une partie d'un titre</title>
		<link>https://blog.roxing.net/spip-mettre-en-exergue-une-partie-d-un-titre</link>
		<guid isPermaLink="true">https://blog.roxing.net/spip-mettre-en-exergue-une-partie-d-un-titre</guid>
		<dc:date>2015-07-08T17:53:12Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>php</dc:subject>
		<dc:subject>spip</dc:subject>
		<dc:subject>css</dc:subject>
		<dc:subject>astuce</dc:subject>

		<description>
&lt;p&gt;On est parfois confront&#233; au souhait d'afficher une version raccourcie d'un #TITRE d'article ; typiquement dans un menu de navigation lat&#233;ral o&#249; l'espace est pr&#233;cieux, ou bien si l'on souhaite mettre en exergue une partie seulement du titre (les n premiers mots). &lt;br class='autobr' /&gt;
Prenons l'exemple trivial d'un #TITRE un peu long : &lt;br class='autobr' /&gt;
La buvette des joyeux p&#233;tanqueurs reprend du service &#224; la fin du mois de juin. &lt;br class='autobr' /&gt;
Comment faire pour g&#233;rer toute la longueur du titre dans une mise en page o&#249; la titraille est (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/billets" rel="directory"&gt;billets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/php" rel="tag"&gt;php&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/spip-49" rel="tag"&gt;spip&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/css" rel="tag"&gt;css&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;On est parfois confront&#233; au souhait d'&lt;strong&gt;afficher une version raccourcie d'un #TITRE&lt;/strong&gt; d'article ; typiquement dans un menu de navigation lat&#233;ral o&#249; l'espace est pr&#233;cieux, ou bien si l'on souhaite &lt;strong&gt;mettre en exergue une partie seulement du titre&lt;/strong&gt; (les n premiers mots).&lt;/p&gt;
&lt;p&gt;Prenons l'exemple trivial d'un #TITRE un peu long :&lt;/p&gt;
&lt;p&gt;&lt;i&gt;La buvette des joyeux p&#233;tanqueurs reprend du service &#224; la fin du mois de juin.&lt;/i&gt;&lt;/p&gt;
&lt;div class='spip_document_62 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.roxing.net/local/cache-vignettes/L500xH449/h1_sans_filtre-ef148.png?1727221821' width='500' height='449' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Comment faire pour g&#233;rer toute la longueur du titre dans une mise en page o&#249; la titraille est imposante ?&lt;/h2&gt;
&lt;p&gt;Il existe le fameux filtre &lt;a href=&#034;http://www.spip.net/fr_article4275.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|couper&lt;/code&gt;&lt;/a&gt; qui s'av&#232;re souvent tr&#232;s efficace, quoiqu'il peut op&#233;rer une c&#233;sure malvenue, et que l'on perd une partie de l'information.&lt;br class='autobr' /&gt;
D'aucun serait tent&#233; de jouer entre les valeurs des champs #TITRE, #SURTITRE (voire #SOUSTITRE) ; par exemple, ces derniers &#233;tant une version &#233;tendue du premier. Il s'agit, je pense, d'une mauvaise solution qui implique une certaine redondance d'information, sans compter un usage fastidieux.&lt;/p&gt;
&lt;p&gt;Et donc &lt;strong&gt;l'astuce&lt;/strong&gt; je vous la donne.&lt;br class='autobr' /&gt;
En ins&#233;rant un espace ins&#233;cable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&amp;#32;&lt;/code&gt; au bon endroit :&lt;/p&gt;
&lt;p&gt;&lt;i&gt;La buvette&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&amp;#32;&lt;/code&gt;des joyeux p&#233;tanqueurs reprend du service &#224; la fin du mois de juin.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Combiner &#224; cela, un petit filtre maison &#224; mettre dans son fichier &lt;i&gt;mes_fonctions.php&lt;/i&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='8' class='spip_cadre spip_cadre_block' dir='ltr'&gt;function scinder($texte){ $txt = explode(&#034;&amp;#32;&#034;, $texte); if (is_array($txt) AND isset($txt[1])) $texte = &#034;&lt;strong&gt;&#034;.$txt[0].&#034;&lt;/strong&gt;&lt;span&gt; &#034;.$txt[1].&#034;&lt;/span&gt;&#034;; return $texte;
}&lt;/textarea&gt;
&lt;p&gt;On obtient un titre dont la premi&#232;re partie est contenue dans un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;strong&gt;&lt;/code&gt;, et la suite dans un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;span&gt;&lt;/code&gt;.&lt;br class='autobr' /&gt; D&#232;s lors on peut faire ce que l'on veut avec du CSS, sans trop de v&#233;rification de conditions ni de variantes de squelette.&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='3' class='spip_cadre spip_cadre_block' dir='ltr'&gt;h2{}
h2 strong {color: #954141;font-size: 3em}
h2 span {color:#437788;font-size: 1em}&lt;/textarea&gt;&lt;div class='spip_document_63 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.roxing.net/local/cache-vignettes/L500xH245/h1_avec_filtre_scinder-ba2c9.png?1727221821' width='500' height='245' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Libre &#224; vous d'inclure le code o&#249; vous le souhaitez dans votre squelette, au cas par cas :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[&lt;h2&gt;(#TITRE|scinder)&lt;/h2&gt;] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, si vous souhaitez l'appliquer &#224; toutes les balises #TITRE de mani&#232;re automatique, vous pouvez d&#233;finir une r&#232;gle sur la &lt;a href=&#034;http://programmer.spip.net/Traitements-automatiques-des&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;table des traitements&lt;/a&gt; dans &lt;i&gt;mes_options.php&lt;/i&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$GLOBALS['table_des_traitements']['TITRE'][]= 'scinder(%s)';&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Markers &amp; Jump : des raccourcis en bash</title>
		<link>https://blog.roxing.net/markers-jump-des-raccourcis-en-bash</link>
		<guid isPermaLink="true">https://blog.roxing.net/markers-jump-des-raccourcis-en-bash</guid>
		<dc:date>2015-03-13T00:14:07Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>bash</dc:subject>
		<dc:subject>astuce</dc:subject>
		<dc:subject>jump</dc:subject>
		<dc:subject>mark</dc:subject>

		<description>
&lt;p&gt;Une fonction qui permet de cr&#233;er/supprimer des liens symboliques facilement vers les r&#233;pertoires couramment utilis&#233;s. Classe non ? &lt;br class='autobr' /&gt;
Il faut rajouter ceci dans son /.bash_aliases :
&lt;br class='autobr' /&gt;
#Filesystem Markers &amp; Jump ########################### export MARKPATH=$HOME/.marks function jump cd -P $MARKPATH/$1 2&gt;/dev/null || echo &#034;No such mark : $1&#034;
&lt;br class='autobr' /&gt;
function mark mkdir -p $MARKPATH ; ln -s $(pwd) $MARKPATH/$1
&lt;br class='autobr' /&gt;
function unmark rm -i $MARKPATH/$1
&lt;br class='autobr' /&gt;
function marks ls -l (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/billets" rel="directory"&gt;billets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/bash" rel="tag"&gt;bash&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/jump" rel="tag"&gt;jump&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/mark" rel="tag"&gt;mark&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Une fonction qui permet de cr&#233;er/supprimer des liens symboliques facilement vers les r&#233;pertoires couramment utilis&#233;s. Classe non ?&lt;/p&gt;
&lt;p&gt;Il faut rajouter ceci dans son /.bash_aliases :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='17' class='spip_cadre spip_cadre_block' dir='ltr'&gt;#Filesystem Markers &amp; Jump
###########################
export MARKPATH=$HOME/.marks
function jump { cd -P $MARKPATH/$1 2&gt;/dev/null || echo &#034;No such mark: $1&#034;
}
function mark { mkdir -p $MARKPATH; ln -s $(pwd) $MARKPATH/$1
}
function unmark { rm -i $MARKPATH/$1
}
function marks { ls -l $MARKPATH | sed 's/ / /g' | cut -d' ' -f9- | sed 's/ -/\t-/g' &amp;&amp; echo
}&lt;/textarea&gt;
&lt;p&gt;Le code est assez explicite, mais &#224; l'usage voil&#224; ce que cela donne :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cr&#233;er un raccourci&lt;/strong&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;cd chemin/vers/mon/projet1
mark projet1&lt;/textarea&gt;
&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;jump projet1&lt;/textarea&gt;
&lt;p&gt;&lt;strong&gt;Lister les raccourcis d&#233;j&#224; cr&#233;&#233;s&lt;/strong&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;marks&lt;/textarea&gt;
&lt;p&gt;&lt;strong&gt;Supprimer le raccourci&lt;/strong&gt;&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;unmark projet1&lt;/textarea&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Bonnes pratiques JQuery</title>
		<link>https://blog.roxing.net/bonnes-pratiques-jquery</link>
		<guid isPermaLink="true">https://blog.roxing.net/bonnes-pratiques-jquery</guid>
		<dc:date>2014-09-18T14:14:52Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>javascript</dc:subject>
		<dc:subject>JQuery</dc:subject>
		<dc:subject>snippet</dc:subject>
		<dc:subject>astuce</dc:subject>

		<description>
&lt;p&gt;Charger le contenu depuis un CDN &lt;br class='autobr' /&gt;
Plut&#244;t que de stocker JQuery sur votre serveur, vous pouvez choisir un CDN notoire. Cela devrait r&#233;duire le temps de chargement de la page. &lt;br class='autobr' /&gt;
Voici une liste de CDN fournissant un acc&#232;s &#224; la biblioth&#232;que JQuery : Google CDN Microsoft CDN jQuery CDN CDNJS CDN jsDelivr CDN &lt;br class='autobr' /&gt;
Les bonnes pratiques ne concernent pas seuelement JQuery ; les &#233;l&#233;ments d'affichage - type CSS ou autre - peuvent aussi &#234;tre charg&#233;s parall&#232;lement. &lt;br class='autobr' /&gt;
Pr&#233;voir une m&#233;thode de chargement (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/billets" rel="directory"&gt;billets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/jquery" rel="tag"&gt;JQuery&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/snippet" rel="tag"&gt;snippet&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Charger le contenu depuis un CDN&lt;/h2&gt;
&lt;p&gt;Plut&#244;t que de stocker JQuery sur votre serveur, vous pouvez choisir un CDN&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb3-1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Content Delivery Network : Un content delivery network (CDN) est constitu&#233; (&#8230;)&#034; id=&#034;nh3-1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt; notoire. Cela devrait r&#233;duire le temps de chargement de la page.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#034;xml&#034;&gt;&lt;!--:( --&gt;
&lt;script src=&#034;/vendor/jquery/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voici une liste de CDN fournissant un acc&#232;s &#224; la biblioth&#232;que JQuery :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://developers.google.com/speed/libraries/devguide#jquery&#034;&gt;Google CDN&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.asp.net/ajax/cdn#jQuery_Releases_on_the_CDN_0&#034;&gt;Microsoft CDN&lt;/a&gt;&lt;/li&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://jquery.com/download/#jquery-39-s-cdn-provided-by-maxcdn&#034;&gt;jQuery CDN&lt;/a&gt;&lt;/li&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://cdnjs.com/libraries/jquery/&#034;&gt;CDNJS CDN&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.jsdelivr.com/#!jquery&#034;&gt;jsDelivr CDN&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Les bonnes pratiques ne concernent pas seuelement JQuery ; les &#233;l&#233;ments d'affichage - type CSS ou autre - peuvent aussi &#234;tre charg&#233;s parall&#232;lement.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;voir une m&#233;thode de chargement alternative en cas de d&#233;failllance du CDN&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;script&gt;window.jQuery || document.write(&#034;&lt;script src='/vendor/jquery/jquery.min.js'&gt;\x3C/script&gt;&#034;);&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;f&#233;rer les versions compress&#233;es&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!-- :( --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js&#034;&gt;&lt;/script&gt;
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class=&#034;spip&#034;&gt;Placer l'appel au script en fin de page plut&#244;t qu'en en-t&#234;te&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!doctype html&gt;
&lt;head&gt;
...
&lt;!-- :( --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
...
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;/body&gt;
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Utiliser des URLs en chemins relatif&lt;/h2&gt;
&lt;p&gt;Pas besoin de sp&#233;cifier le protocole http ou https. Le navigateur optera de lui-m&#234;me pour le protocole https s'il se trouve d&#233;j&#224; dans un environemment s&#233;curis&#233;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!-- :( --&gt;
&lt;script src=&#034;http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Raccourci pour l'&#233;v&#233;nement ready&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// Appel classique
$(document).ready(function() {
...
});
// Version rapide
$(function() {
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Garder le $ lors de la d&#233;claration d'une variable de type jQuery.&lt;/h2&gt;
&lt;p&gt;Gr&#226;ce &#224; cette convention de nommage, on distingue facilement la nature de l'objet JQuery.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
var form = $('#contactForm');
// :)
var $form = $('#contactForm');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class=&#034;spip&#034;&gt;Du bon usage de $this&lt;/h2&gt;
&lt;p&gt;La variable $this s'utilise avantageusement au d&#233;but des fonctions non d&#233;clar&#233;es, par exemple dans une boucle de type each.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('li').each(function() {
$(this).on('click', function() {
$(this).addClass('active');
});
});
// :)
$('li').each(function() {
var $this = $(this);
$this.on('click', function() {
$this.addClass('active');
});
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Certains pr&#233;f&#232;rent utiliser &lt;i&gt;that&lt;/i&gt; ou &lt;i&gt;self&lt;/i&gt;. Attention de ne pas oublier qu'il s'agit d'un objet jQuery.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Mettre en cache les objets jQuery&lt;/h2&gt;
&lt;p&gt;Si un objet jQuery est utilis&#233; plusieurs fois, le mettre en cache permet d'optimiser les performances.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('.menu li').each(function() { ... });
$('.menu li').each(function() { ... });
// :)
var $items = $('.menu li');
$items.each(function() { ... });
// on recycle :)
$items.each(function() { ... });&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Encha&#238;nement des fonctions&lt;/h2&gt;
&lt;p&gt;C'est asssur&#233;ment l'une des fonctionalit&#233;s les plus appr&#233;ci&#233;e de jQuery. On peut ainsi appeler une s&#233;rie de m&#233;thodes dans la m&#234;me foul&#233;e.&lt;/p&gt;
&lt;blockquote&gt;&#034;Write less, do more&#034;, garder en t&#234;te le slogan de jQuery&lt;/blockquote&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
var $a = $('#about');
$a.hide();
$a.addClass();
$a.fadeIn();
$a.hide();
// :)
$('#about').hide().addClass().fadeIn().hide();
// c'est mieux
// Retour &#224; la ligne et identation am&#233;liorent la visibilit&#233;
$('#about')
.hide()
.addClass()
.fadeIn()
.hide();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;D&#233;clarer un nouvel &#233;l&#233;ment&lt;/h2&gt;
&lt;p&gt;Lors de la cr&#233;ation d'un &#233;l&#233;ment, fa&#238;tes en sorte de manipuler les &#233;l&#233;ments via les m&#233;thodes jQuery plut&#244;t que d'ins&#233;rer du code HTML brut.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// Don't
var $hidden = $('&lt;input class=&#034;form-control&#034; type=&#034;hidden&#034; name=&#034;foo&#034; value=&#034;bar&#034; /&gt;').appendTo('#form');
// :)
var $hidden = $('&lt;input/&gt;')
.addClass('form-control')
.attr('type', 'hidden')
.attr('name', 'foo')
.val('bar')
.appendTo('#form');
// ou bien
var $hidden = $('&lt;input/&gt;', {
class: 'form-control',
type: 'hidden',
name: 'foo',
value: 'bar'
}).appendTo('#form');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Garder le CSS loin des manipulations de jQuery&lt;/h2&gt;
&lt;p&gt;Pas la peine de d&#233;clarer le style CSS directement &#224; un &#233;l&#233;ment. Le recours aux classes est fait pour &#231;a.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('#button').css({
'background-color': '#5cb85c',
'border-color': '#4cae4c'
});
// :)
.success {
background-color: #5cb85c;
border-color: #4cae4c;
}
$('#button').addClass('success');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Choisir le bon s&#233;lecteur&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Le s&#233;lecteur d&#233;signant l'&lt;i&gt;id&lt;/i&gt; est le plus rapide&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour retrouver un &#233;l&#233;ment du DOM en fonction de son &lt;i&gt;id&lt;/i&gt;, jQuery utilise la m&#233;thode native &lt;i&gt;document.getElementById()&lt;/i&gt; qui s'av&#232;re bien plus efficace que Sizzle.&lt;/p&gt;
&lt;blockquote&gt;&lt;a href=&#034;https://github.com/jquery/sizzle&#034;&gt;Sizzle&lt;/a&gt; is a pure-JavaScript CSS selector engine used by jQuery&lt;/blockquote&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('#wrapper #inner');
$('div#inner');
$('.wrapper #inner');
// :)
$('#inner');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Du coup, mieux vaut introduire une recherche sur un &lt;i&gt;id&lt;/i&gt;, quitte &#224; encha&#238;ner les recherches.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('#container .row');
// + rapide
$('#container').find('.row');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;S&#233;lecteurs restrictifs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il faut &#234;tre sp&#233;cifique sur le partie gauche de votre s&#233;lecteur, et moins en d&#233;but.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// pas glup
$('div.data .gonzalez');
// glup glup
$('.data td.gonzalez');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&#201;viter le recours aux s&#233;lecteurs universels&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// moins rapide
$('div.container &gt; *');
// Plus rapide
$('.container').children();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mieux vaut faire pr&#233;c&#233;der les s&#233;lecteurs pseudo-class (ex &lt;i&gt;:before&lt;/i&gt;) avec un tag ou un autre s&#233;lecteur. Car, si ce n'est pas le cas, le s&#233;lecteur universel * est implicitement employ&#233;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('.category :radio');
// :)
$('.category input:radio');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Privil&#233;giez les m&#233;thodes de tri plut&#244;t que les pseudos-s&#233;lecteurs.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lorsque cele est possible, utiliser la m&#233;thode de tri jQuery plut&#244;t que des pseudos-s&#233;lecteurs. La m&#233;thode querySelectorAll s'av&#232;re l&#224; encore plus rapide que la m&#233;thode Sizzle.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('.item:first')
// :)
$('.item').eq(0)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Pas de javascript &lt;i&gt;inline&lt;/i&gt; sur les &#233;lements HTML&lt;/h2&gt;
&lt;p&gt;Mieux vaut attacher un &#233;couteur d'&#233;v&#233;nement &#224; l'objet.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!-- :( --&gt;
&lt;button id=&#034;saveButton&#034; onclick=&#034;javascript: save();&#034;&gt;Save&lt;/button&gt;
// :)
$('#saveButton').on('click', function() {
...
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Choisir un namespace personnalis&#233; pour les &#233;v&#233;nements&lt;/h2&gt;
&lt;p&gt;Ainsi il est plus facile de d&#233;sactiver un &#233;v&#233;nement sans affecter les autres &#233;couteurs d'&#233;v&#233;nements assign&#233;s &#224; l'&#233;l&#233;ment.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$('#saveButton').on('click.bv', function() { ... });
//Plus tard, on peut retirer sans crainte l'&#233;couteur l'&#233;v&#233;nement
$('#saveButton').off('click.bv');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Ne pas passer les param&#232;tres Ajax &#034;en dur&#034;&lt;/h2&gt;
&lt;p&gt;Lorsque d'un requ&#234;te de type xmlHttpRequest, il faut utiliser le param&#232;tre &lt;i&gt;data&lt;/i&gt;, et non concat&#233;ner l'information au sein de l'URL.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$.ajax({
url: '/remote/url?param1=value1&amp;amp;param2=value2...'
}});
// :)
$.ajax({
url: '/remote/url',
data: {
param1: 'value1',
param2: 'value2'
...
}
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans le cas o&#249; les param&#232;tres &#224; transmettre sont tr&#232;s long (ex : le contenu int&#233;gral d'un article), on privil&#233;giera la m&#233;thode POST, &#224; la fois pour Ajax et le traitement c&#244;t&#233; serveur.&lt;/p&gt;
&lt;blockquote&gt;Internet Explorer 8 (and earlier) &lt;a href=&#034;http://support.microsoft.com/kb/208427&#034;&gt;limits&lt;/a&gt; 2083 characters in URL&lt;/blockquote&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://programer.tips/2014/09/best-jquery-practices.html" class="spip_out"&gt;Best jQuery practices &#183; Programmer Tips&lt;/a&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb3-1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh3-1&#034; class=&#034;spip_note&#034; title=&#034;Notes 3-1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;Content Delivery Network : Un content delivery network (CDN) est constitu&#233; d'ordinateurs reli&#233;s en r&#233;seau &#224; travers Internet et qui coop&#232;rent afin de mettre &#224; disposition du contenu ou des donn&#233;es (g&#233;n&#233;ralement du contenu multim&#233;dia volumineux) &#224; des utilisateurs.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>[Firefox] Capture &#233;cran d'une page compl&#232;te</title>
		<link>https://blog.roxing.net/firefox-capture-ecran-d-une-page-complete</link>
		<guid isPermaLink="true">https://blog.roxing.net/firefox-capture-ecran-d-une-page-complete</guid>
		<dc:date>2014-08-23T15:17:56Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>screenshots</dc:subject>
		<dc:subject>astuce</dc:subject>
		<dc:subject>firefox</dc:subject>

		<description>
&lt;p&gt;Pour faire une capture d'&#233;cran d'une page compl&#232;te dans Firefox (m&#234;me si &#231;a d&#233;passe l'&#233;cran), appelez la console d&#233;veloppeur (MAJ+F2) et tapez : screenshot &#8212;fullpage nomfichier
&lt;br class='autobr' /&gt;
Et cela va enregistrer un png de la page compl&#232;te.&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/billets" rel="directory"&gt;billets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/screenshots" rel="tag"&gt;screenshots&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/firefox" rel="tag"&gt;firefox&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Pour faire une capture d'&#233;cran d'une page compl&#232;te dans Firefox (m&#234;me si &#231;a d&#233;passe l'&#233;cran), appelez la console d&#233;veloppeur (MAJ+F2) et tapez : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;screenshot --fullpage nomfichier&lt;/code&gt;&lt;br class='autobr' /&gt;
Et cela va enregistrer un png de la page compl&#232;te.&lt;/p&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://sebsauvage.net/links/?Ks8M5w" class="spip_out"&gt;http://sebsauvage.net/links/?Ks8M5w&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
