Connexion

HTML5 - L'attribut draggable

Après avoir évoqué l'attribut contentEditable d'HTML5, je vous propose cette fois de nous intéresser à l'API de drag and drop de cette prochaine version.

Présentation

L'attribut draggable peut être associé à n'importe quel élément HTML et placé à trois valeurs: 'false' (par défaut) , 'true' afin de rendre le déplacement possible et enfin 'auto' dont le comportement dépendra du navigateur. Il représente la mise en application de l'API de drag and drop d'HTML5.

Avec cet API et cet attribut, il existe un certain nombre d'évènements qui sont déclenchés par les actions de l'utilisateur et qui peuvent être écoutés pour exécuter des actions:

  • dragstart (ondragstart pour l'attribut HTML): qui se déclenche lorsqu'un drag and drop d'une zone est commencé.
  • drag (ondrag pour l'attribut HTML): déclenché pendant le déplacement (et donc potentiellement à répétition...).
  • dragenter (ondragenter pour l'attribut HTML): déclenché lorsqu'un drag and drop entre au dessus de la zone concernée.
  • dragleave (ondragleave pour l'attribut HTML): déclenché lorsqu'un drag and drop quitte la zone concernée.
  • dragover (ondragover pour l'attribut HTML): déclenché lorsqu'un drag and drop se situe au dessus de la zone concernée (et donc potentiellement à répétion...).
  • drop (ondrop pour l'attribut HTML): déclenché lorsqu'un élément en cours de déplacement est relaché au dessus de la zone concernée.
  • dragend (ondragend pour l'attribut HTML): déclenché lorsqu'un drag and drop a été réalisé ou annulé.

La preuve par l'exemple

Scénario de l'exemple

Afin de rendre tout ça plus "buvable" nous allons utilisez pour l'exemple un scénario très simple basé sur ces évènements et ces actions:

  1. L'utilisateur commence le déplacement d'une "boite" depuis une source de contenu représentée par une plus grosse "boite". Du coup l'évènement "dragstart" est déclenché pour cette boite. On ne s'occupera pas de l'évènement "drag" pour la suite.
  2. Il la déplace sur la page et arrive au dessus de la "boite" cible. L'évènement "dragenter" est déclenché par la cible.
  3. En déplaçant la petite "boite" au dessus de la cible, cette dernière déclence des évènements "dragover".
  4. L'utilisateur relâche la petite "boite" sur la cible qui déclenche l'évènement "drop". Cet évènement nous servira de référence pour retirer l'objet déplacé de sa source et le placer dans la cible de façon concrête.

Le code HTML

Nous allons créer 2 div qui nous serviront de source ('src') ou de cible ('tgt'). À l'intérieur de la boite 'src' nous aurons une petite boite nommée 'box' qui pourra être déplacée dans 'src'.

<!-- just a container -->
<div class="bordered">
    <!-- our drag source container -->
    <div class="half-width source" id="src">
        <!-- our box to drag and drop -->
        <div class="box" id="box"
             draggable="true">
            Simple Box 1
        </div>
    </div>
    <!-- our drag and drop target -->
    <div class="half-width target" id="tgt"></div>
</div>

Rien de plus simple jusque là. À noter toutefois, l'utilisation de l'attribut draggable à la valeur 'true' pour autoriser le déplacement de la boite 'box'.

CSS

Juste un peu de mise en forme et un 'hack' pour le moteur WebKit (Safari entre autres) nécessaire pour activer le drag and drop (cette situation ne saurait être définitive je pense car elle ne respecte pas la norme HTML5.)

.bordered {
    border: 1px solid #888888;
}
.half-width {
    float:left;
    width:50%;
    min-height:160px;
}
.target {
    background-color:#BFFF80;
}
.source {
    background-color:#FFDF80;
}
.box {
    background-color:#FF8080;
    margin:5px;
    padding:5px;
    border: 1px solid #888888;
    height:100px;
    width:100px;
    text-align:center;
}
*[draggable=true] {
    -khtml-user-drag: element; /* WebKit hack */
    cursor:move;               /* a move cursor */
    -moz-user-select:none;     /* disabled content selection
                                  on mozilla browsers */
}

dragstart

Comme expliqué plus haut, l'évènement dragstart se déclenche lorsqu'un drag and drop d'une zone est commencé. Nous allons donc associer à l'évènement dragstart de la boite à déplacer, la création de notre drag and drop.

/* on associe le démarrage du drag and drop à la fonction
   dragStartHandler */
document.getElementById('box').addEventListener("dragstart", dragStartHandler, false);

function dragStartHandler(event) {
    /* autoriser les drag and drop de type "copy" */
    event.dataTransfer.effectAllowed = 'copy';
    /* transmettre en donnée de drag and drop l'id de la boite
       déplacée */
    event.dataTransfer.setData('Text', event.target.id);
    return false;
}

dragenter

Cette fois-ci nous allons associer une fonction javascript à l'entrée dans la zone cible:

/* on associe l'entrée du drag and drop sur la cible à la fonction
   dragEnterHandler */
document.getElementById('tgt').addEventListener("dragenter", dragEnterHandler, false);

function dragEnterHandler(event) {
    /* éviter le comportement par défaut du navigateur (déplacement
       de sélection) */
    event.preventDefault();
    return false;
}

dragover

Ici nous nous intéressons à ce qu'il se passe lorsqu'on survole la cible. Conformément à ce que nous avons mis dans la fonction dragStartHandler nous allons donner au déplacement la zone la capacité à recevoir les drag and drop de type 'copy':

/* on associe le survole de la cible à la fonction
   dragOverHandler */
document.getElementById('tgt').addEventListener("dragover", dragOverHandler, false);

function dragOverHandler(event) {
    /* verification de la cible au cas où l'on survole un autre
       objet */
    if (event.target != document.getElementById('tgt')) {
        return false;
    } else {
        /* on attribue l'effet de curseur qui correspond au type
           accepté plus haut */
        event.dataTransfer.dropEffect = 'copy';
        /* éviter le comportement par défaut du navigateur
           (déplacement de sélection) */
        event.preventDefault();
    }
    return false;
}

drop

Nous y voilà. L'étape finale du déplacement et l'action de "relaché" plus communément appelée "drop" va être connectée à une fonction qui déplacera la zone déplacée dans la cible.

/* on associe le 'laché' d'un élément sur la cible à la fonction
   dropHandler */
document.getElementById('tgt').addEventListener("drop", dropHandler, false);

function dropHandler(event) {
    /* on se sert de l'id transporté en donnée pour déplacer
       l'élément dans son nouveau parent DOM */
    event.target.appendChild(document.getElementById(event.dataTransfer.getData('Text')));
    /* et voila, on a finit et pour s'assurer on coupe manuellement
       la propagation de l'évènement (pas forcément nécessaire !) */
    event.stopPropagation();
    return false;
}

Le résultat

Voila donc notre exemple prêt à marcher :

Simple Box 1

Références de l'article

Commentaires: 1 | Buzz it!

Trestignel à 360°

Un petit panorama (loin d'être parfait, mais bien amélioré par un collègue tout de même) pour illustrer un petit outil en JavaScript permettant de naviguer dans un diaporama à 360°.

C'est une photo interactive si vous cherchez un peu

Les sources

Les sources de ce petit outils sont accessible depuis ce répertoire.

Commentaires: 0 | Buzz it!

HTML5 - L'attribut contenteditable

Nouvelle série de billets liée à HTML5 et aux nouveautés apportées par le W3C (organisme qui gère les normes du World Wide Web) sur le langage le plus utilisée sur internet: HTML.

Si la norme HTML5 n'est pas encore publiée de façon définitive, le Working Draft publié en Janvier 2008 est toute fois supporté (de façon plus ou moins efficace) par la majorité des navigateurs web actuels (au moins les meilleurs).

Aujourd'hui, le but de l'article est d'appréhender un nouvel attribut, 'contenteditable', proposé par cette future norme.

Présentation

L'attribut 'contenteditable' peut être associé à un élément HTML (ou balise) et placé à deux valeurs: 'false' (par défaut) et 'true' afin d'en rendre l'édition possible. Cette édition se contonnant, sans autre artifice, à une modification locale. Il ne s'agit pas d'un attribut magique qui autoriserait à lui seul à rendre une page éditable pour que les modifications apportées soient ensuites visibles par toutes les personnes chargeant la même page. Toutefois, rien empêche de se servir de cet attribut à cette fin, mais ce sera au développeur de prévoir les échanges lorsqu'un changement est réalisé sur la page.

'contenteditable' est aussi associé à une valeur et un getter IDL (Interface Definition Language) du DOM (Document Object Model):

  • 'contentEditable' qui accepte les valeurs 'true' ou 'false'
  • 'isContentEditable' qui retourne les valeurs 'true' ou 'false'

Utilisation

Rien de plus simple, puisqu'il suffit de placer l'attribut et sa valeur dans la déclaration de la balise concernée pour la rendre éditable:

<p contenteditable="true">Lorem ipsum dolor...</p>

En concret:

Lorem ipsum dolor...

Afin de se servir des changements effectués, un certains nombre d'écouteurs peuvent être positionnés. Ceux-ci, réagissants aux évènements émis, peuvent ainsi renseigner sur l'état de l'élément HTML:

  • 'focus' au moment où l'utilisateur sélectionne une zone éditable par un click.
  • 'blur' au moment où l'utilisateur quitte la zone (après édition par exemple).

Que l'on peut par exemple écouter comme suit afin d'appeler la méthode 'store' lorsque l'élément 'element' est modifié:

editable = document.getElementById('element');
editable.addEventListener("blur", store, false);

Autour de cet attribut

L'attribut 'contenteditable' présenté plus tôt dans cet article accompagne d'autres attributs relativement liés à celui-ci

designMode

L'attribut IDL designMode accepte lui aussi deux valeurs. Mais ce sont 'on' et 'off' (par défaut) pour changer. Cet attribut, normalement associé à l'élément 'document.' permet de rendre modifiable l'intégralité d'un document HTML (ou page).

document.designMode = 'true';

spellcheck

'spellcheck' permet quant à lui permet d'activer ou de désactiver la correction orthographique ou grammaticale sur un élément d'une page. Utilisant les valeurs 'true' et 'false' et associé à l'attribut 'contenteditable' il permet de créer une zone d'édition efficace dans un élément non prévu initialement à cet effet.

element.spellcheck = 'true';

Tester

Afin que vous puissiez mieux comprendre comment marchent les attributs 'contenteditable' et 'spellcheck', j'ai réalisé une petite démo très simple: Tester ces attributs.

Plus d'info sur cet attribut sur le site du W3C.

Commentaires: 3 | Buzz it!

Roc'Han Feu dévoile la programmation de la 15ème édition

Programmation de la 15ème édition du festival Roc'Han Feu

Pas beaucoup de temps libre pour fournir le blog en ce moment. Et pourtant, un paquet de projets dans les tuyaux dont le déménagement d'un gros site web sur mon serveur et des services associés à ce domaine (mail, sql, ftp etc...). Bref de quoi occuper mes soirées...

Je prends tout de même le temps d'annoncer la programmation du 15ème festival Roc'Han Feu. Que du gros à l'affiche cette année et déjà cette programmation semble beaucoup faire parler d'elle sur le net (et de manière très positive). Vivement d'y être !

Commentaires: 0 | Buzz it!

11ème Tremplin Roc'Han Feu le 27 mars 2010

Un avant-gout du festival ?

Venez découvrir celui qui aura l'honneur d’ouvrir la 15ème édition du festival Roc'han Feu !

Le 27mars à partir de 19h30 à Rohan pour 8€, billets en vente sur place ou sur www.rochanfeu.com... on compte sur vous !

L'équipe de Roc'han Feu toujours là pour faire bouger le pays de Rohan !

L'affiche en image

Commentaires: 0 | Buzz it!

15 ans de Roc'Han Feu en image

Ou presque... Les 13 dernières affiches des éditions du festival Roc'Han Feu ! Il ne manque donc que la toute première (1996).

Commentaires: 0 | Buzz it!

Changer de logiciel pour un type de fichier sous gnome

Ce matin, petite (grosse en fait, mais ça fait moins pro si je l'avoue ;-) mise à jour de mon laptop sur Archlinux. Tout ce passe pour le mieux ensuite jusqu'à ce que je remarque que Nautilus veut absolument ouvrir mes fichiers 'texte' (*.txt) avec la commande suivante:

wine editor.exe

Mouais... c'est pas que cet éditeur est minable, mais bon, il y en a des meilleurs et j'ai déjà une préférence pour Geany (Vim en mode texte mais ce n'est pas le problème). Du coup je fais un clique droit, je lance avec le logiciel de mon choix l'édition de mes fichiers, mais bon, c'est vite casse pied...

La solution se trouve dans le fichier suivant: ~/.local/share/applications/mimeapps.list qu'il suffit d'adapter à son besoin. Chez moi ça sera donc:

[Added Associations]
x-content/audio-cdda=vlc.desktop;
x-content/video-dvd=vlc.desktop;
x-content/audio-player=vlc.desktop;
image/png=eog.desktop;gimp.desktop;
application/vnd.ms-excel=calc.desktop;geany.desktop;
application/pdf=acroread.desktop;
image/svg+xml=inkscape.desktop;
video/x-msvideo=vlc.desktop;
text/directory=gedit.desktop;userapp-thunderbird-D4J81U.desktop;
text/plain=geany.desktop;gedit.desktop;

Et j'ai viré toutes les mentions du type:

wine-extension-chm.desktop
wine-extension-hlp.desktop
wine-extension-htm.desktop
wine-extension-html.desktop
wine-extension-ini.desktop
wine-extension-rtf.desktop
wine-extension-txt.desktop
wine-extension-wri.desktop
wine-extension-xml.desktop

... qui sont arrivées là par je ne sais quel vilaine manipulation.

L'occasion de mieux comprendre mon système et d'apprivoiser au mieux l'ouverture de mes fichiers et extensions ;-)

Et bien sur la source de cette info: sur ubuntuforums.org.

Commentaires: 0 | Buzz it!

Cowboy sous la neige

Je ne résiste pas à mettre cette photo de Cowboy sous la neige ;-)

Il n'est pas beau ce gros chien?

Commentaires: 0 | Buzz it!

OpenVolunteer v0.2, second public stable release

OpenVolunteer logo

It's not a tradition, but this post will be in english unlike all the others in this blog.

The reason is that i've just release a new version of OpenVolunteer. The 0.2 released is now available for your foundation, organization or collectivity and will provide a lot of improvements in volunteers management.

Hosting

The project is hosted on google code and the plateform provides a SVN repository, Wiki, and a bug tracker. See more on Project hosting site

Changelog

Most of the changes of this new version are listed here:

New functions

  • Django v1.1 support
  • Specific forms for content management
  • Delete and add content function included in interface
  • New welcome page (lighter)
  • Comment thread for event details
  • New installation tutorials according to the facilitations made in code
  • Error management improved (404 and error codes)
  • CSV export for event answers and volunteer lists
  • Social security number and birth place indications added for volunteer data
  • Three choices answers (yes/no/maybe)
  • Mailling links
  • New logo and icons

Fixed issues

  • Vcard charset issue with outlook
  • Filtering of event on date
  • CSS optimizations
  • ...

Commentaires: 0 | Buzz it!

Roc'Han Feu, c'est la rentrée

Affiche 21 Novembre 2009

C'était il y a peu la rentrée de l'association Roc'Han Feu. Le concert d'automne est le point d'orgue de cette première partie de saison qui s'annonce bien remplie avec une nouvelle date en Février.

Dans un premier temps, on va déjà se régaler avec le plateau qu'on vous propose le 21 novembre à la Salle de la Belle Etoile :

  • WIMP (une ouverture locale)
  • Maïon & Wenn (et les garçons)
  • Bikini Machine (rien que ça)
  • DJ Fresh (pour le feux d'artifice final)
Pensez vite à réserver vos place car samedi est proche !

Commentaires: 0 | Buzz it!