BOîTES DE DIALOGUE

illus

script : msg v2.1
langage : javascript
catégorie : module
usage : Créez des messages d'interface : messages d'alerte et infobulles personnalisés, preloaders, formulaires modaux, etc.
tags : ergonomie

Concept

Ce script vise à proposer des alternative plus souples et plus esthétiques à deux choses :

  • la fonction javascript alert()
  • les infobulles

Il vous permet ainsi de designer ces éléments à votre guise, grâce au css, et d'y intégrer tout le html que vous voulez.

Applications

fenêtre modale

Il est souvent pratique de mettre en évidence une information ou un formulaire, voire même d'empêcher l'accès au reste de la page. essayer

validation de formulaire

Pourquoi ne pas faire des alert() un peu plus jolies, quand vous vérifiez le contenu d'un formulaire ?

veuillez entrer un mot de 8 lettres au moins : essayer

annoncer un chargement

Très pratique par exemple dans les cas d'envois de formulaires par Ajax.
A la fin du chargement, on peut en plus, selon la réponse, afficher un autre message, de confirmation ou d'erreur. essayer

infobulle

En plaçant la boîte de message à proximité de la souris, on obtient une belle alternative à l'infobulle ordinaire. essayer
(Mais s'il s'agit là du seul usage que vous souhaitez faire de ce script, voyez plutôt du coté de bubulle, plus simple)

Et rien ne vous empèche de créer des infobulles persistantes. essayer

notification discrète

Pour passer une message sans trop s'imposer. (ici, en bas à droite de la page)essayer

Code

la base

On commence par importer le script et la feuille de styles dans la page.
Il s'agit de placer le code suivant quelques part entre les balises <head> et </head> :

<script type="text/javascript" src="msg/msg.js"></script>
<link rel="stylesheet" media="all" href="msg/msg.css" />

Ensuite, pour ouvrir une boîte de message sans options particulières, on se contente d'ajouter un événement onclick à l'élément de son choix, comme suit :

document.getElementById("un_element").onclick = function() {
	msg.open("Salut tout le monde !");
	return false;
};

(N'oubliez pas le return false si vous ne voulez pas que votre navigateur vous renvoie en haut de la page.)

Ce qui nous donne : Dîtes bonjour
Simple, non ?

des options ?

Pour un usage affiné, le script accepte de nombreuses options.
On peut ainsi choisir la position de la boîte et son apparence. On peut lui donner un titre, faire qu'elle se referme automatiquement, etc. On peut également charger le contenu du message par ajax.
Les options sont passées comme second paramètre de la méthode. Elles doivent être structurée sous forme d'objet, selon ce principe :

{
	option_1 : valeur_1,
	option_2 : valeur_2,
	option_n : valeur_n
}

Ainsi, nous pourrons ouvrir un message avec options de la façon suivante :

document.getElementById("un_element").onclick = function() {
	var options = {
		"title": "Bonnes mani&egrave;res",
		"button": "La ferme"
	};
	msg.open( "Il faut dire bonjour. C'est plus poli." , options);
	return false;
};

Essayez : dîtes bonjour.

La liste des options (et méthodes) disponibles est présentée dans le tableau ci-dessous.

Méthodes et Options

Méthodes

open([content[, options]]) ouvre une nouvelle boîte de message annonçant content, avec les options options
mixed content (optionnel)
le message à afficher.
content accepte trois type de valeurs :
- une chaine : dans ce cas, on affichera tout simplement le contenu de la chaîne.
- un objet HTML :  le contenu de cet objet sera alors copié dans le message. (?)
- null : si content n'est pas renseigné, le dernier message sera réaffiché. (Certaines des options du dernier message seront remplacées par d'autres, appropriées à un simple rappel.)
object options (optionnel)
les options de la boîte de message.
Les options disponibles sont listées plus bas.
close() ferme la boîte de message active.
preset(settingName[,content[, options]]) enregistre un paramétrage sous le nom de settingName
string settingName
le nom sous lequel enregistrer le paramétrage.
string content (optionnel)
le message par défaut pour ce paramétrage.
(pour plus de détail, voir la méthode open)
object options (optionnel)
les options par défaut pour ce paramétrage.
Les options disponibles sont listées plus bas.
reload(settingName[,content[, options]]) ouvre une nouvelle boîte de message, sur la base des préréglages enregistrés sous le nom de settingName. Ces préréglages peuvent être écrasés par les valeurs de content et options options
string settingName
le nom des préréglages à recharger.
string content (optionnel)
le message à afficher à la place de celui prédéfini.
(pour plus de détail, voir la méthode open)
object options (optionnel)
les options de la boîte de message devant remplacer celles prédéfinies.
Les options disponibles sont listées plus bas.
replaceAlert() si cette méthode est appelée, tous les appels de la fonction native alert() renverront à msg.reload('alert');

Options

className string
nom de classe css à attribuer à la boîte de message.
Valeurs acceptées : "error", "success", ou tout autre nom de classe que vous aurez vous-même défini.
null
style object
description javascript de styles css à donner à la boîte qui contient le message.
Exemple : { width:"200px", backgroundColor:"#faaab9" }
{ }
delay integer
délai (en secondes) avant la fermeture du message.
Pour que le message ne disparaisse pas automatiquement, attribuer une valeur de 0 à cette option.
0
modal boolean
permet de bloquer l'accès au reste de la page en plaçant un voile par dessus tout ce qui n'est pas dans la boîte de message.
false
modalColor string
si l'option modal est activée, cette option-ci détermine la coloration de l'écran. Accepte tout code de couleur reconnu en css.
"#ffff"
(blanc)
modalOpacity float
si l'option modal est activée, cette option-ci détermine l'opacité de l'écran. La valeur doit être comprise entre 0 et 1, avec 0=transparent, et 1=opaque
0.7
title string titre de la boîte de message.
Pour que la boîte n'ait pas de titre du tout, il suffit de régler cette option sur null.
null
context string code html à disposer autour du message.
Le contenu du message est représenté par le masque $msg$.
Cette option est intéressante surtout pour les réglages enregistrables. (voir la méthode preset().)
Exemple : citation&nbsp;: <blockquote>$msg$</blockquote>
null
button string texte du bouton de fermeture.
Une valeur null indique de ne pas mettre de bouton du tout.
"ok"
position string position de la boîte de message dans la fenêtre.
L'option prend en compte une valeur pour la position horizontale, et une autre pour la position verticale. Ces deux valeurs doivent être séparées par deux points (:), de la façon suivante : "horizontal:vertical"
Accepte les valeurs suivantes :
"mouse" :
pour position relative à celle de la souris.
"c" ou "m" :
commande le centrage de la boîte de message :
- à l'horizontale : "c" pour "center".
- à la verticale : "m" pour "middle".
valeur numérique :
toute valeur numérique indiquera un écart (en pixels) par rapport à un bord de la fenêtre.
- à l'horizontale, les valeurs positives seront calculées par rapport au bord gauche, et les valeurs négatives par rapport au bord droit.
- à la verticale, les valeurs positives seront calculées par rapport au haut de la fenêtre, et les valeurs négatives par rapport au bord droit.
-ainsi, "50:-100" positionnera la boîte de message à 50 pixels du bord gauche de la fenêtre, et à 100 pixels du bas.
Si la position verticale est manquante, "m" sera attribué par défaut.
Si la position horizontale est manquante, "c" sera attribué par défaut.

null
(ce qui revient à "c:m")
onOpen function
fonction callback à exécuter à l'ouverture du message.
null
onClose function
fonction callback à exécuter à la fermeture du message.
null
remember booleran
permet d'indiquer au script s'il doit mémoriser le contenu et les options du message (pour une éventuelle reproduction du même message par msg.open(null);)
false
ieMaxWidth integer
permet de simuler la propriété css max-width dans les navigateurs pourris originaux. Accepte uniquement des valeurs en pixels (ni % ni em). Ne pas préciser  "px".
Exemple : 400
400
ajaxContent string
permet de charger par ajax le contenu du message.
Il suffit pour cela d'indiquer l'adresse url du contenu à charger.
En attendant que la requête ait reçu une réponse, le message indiqué dans le paramètre content sera affiché.
null

Téléchargement

Vous  trouverez tout ce qu'il vous faut dans ce zip : le script, la feuille de style, quelques icones, et les fichiers source.
Sous sa forme compressée, le script ne pèse que 6ko, plus 2ko pour les css.

compatibilité :
Internet Explorer (5.5+) Firefox Safari Opera Google Chrome
(autres navigateurs non testés)

Commentaires

  • Publier un nouveau commentaire
  • gravatar
    Merci génial !
  • gravatar
    Ufoworld@free.fr  le 28 mars 2010, à 17h14
    C'est Génial
    Mais on pourrait rajouter le truc pour bouger les fenetres en javascript :)
  • gravatar
    Salut! J'ai essayé ton script tout à fait sympa (en plus je me cassé à faire un script similaire...) Par contre je ne trouve pas ou faut il mettre mousse pr positionner l'infobulle à l'emplacement de la souris! Serait il possible de m'éclairer ? Merc
  • gravatar
    @DeD :
    msg.open( 'blabla' , {position:'mouse:mouse'} );
    Est-ce que ça règle ton problème ?
  • gravatar
    Oui c'est bon ça fonctionne ! Je te remercie et te felicite également pour tes scripts qui sont vraiment pas mal !
  • gravatar
    @Ufoworld :
    Tu dois en effet pouvoir intégrer dragOn.js
    Il faudrait que tu fasses :
    msg.open( 'blabla' , {
        onOpen : function() {
             dragOn.apply(
                  document.getElementById('msgBox'),
                  document.getElementById('msgTitle') // si tu as un titre
             );
        }
    } );
  • gravatar
    Ah ben en fait c'est par fait, ce que j'appelais timer c'était les infobulles persistantes :)

    merci beaucoup, vous m'êtes d'une grande aide !
  • gravatar
    Salut, j'ai essayé ton script mais j'ai une petit probleme dans internet explorer 8 les fenétres msg se positionne hors du champ visuelle au lieux d'etre centré.Peu tu m'aide a réglé ce probléme merci
  • gravatar
    Etonnant. Peut-être un problème dans ta page...?
    Je peux peut-être jeter un oeil à ton code, si tu as une url à me donner. Tu peux aussi me l'envoyer par email.
  • gravatar
    Merci pour l'aide mais j'en aurait pas besoins mon probléme était juste que j'avais pas mis de Doctype donc internet explorer me feussait n'importe quoi.
  • gravatar
    Bonjour
    J'ai essayé ce script vraiment intéressant et pratique. Une question cependant, j'ouvre une modal contenant un formulaire. Ce formulaire contient lui même un objet calendrier.
    La modal s'ouvre correctement, le formulaire s'affiche correctement.
    Par contre, le click sur le bouton calendrier du formulaire fait afficher le calendrier dans la fenêtre derrière, et non plus à côté du bouton calendrier de la modal.

    Comment faire pour y remédier ?

    NB : très très peu de connaissance en java script.

    Dominique
  • gravatar
    C'est sans doute une histoire de css. Il va falloir modifier la propriété z-index du calendrier ou de la modale. Cette propriété règle la profondeur des éléments.
  • gravatar
    Bonsoir Abrab. Euh excuse moi, mais je ne trouve pas la solution à mon problème de calendrier qui refuse de s'afficher dans la modal. J'ai d'abord pensé à un pb dans le calendrier, j'en ai changé pour tester.

    Mais le résultat est le même : le calendrier s'affiche, mais pas dans la modal : il s'affiche dans la partie qui est opaque ,et donc inaccessible de l'utilisateur. J'ai regardé cette histoire du z-index, mais j'avoue que je sèche (connaissance js très limité).

    Peux-tu m'en dire un peu plus stp ? Merci beaucoup.

    Dominique
  • gravatar
    Désolé Dominique, en ce moment je ne peux vraiment pas t'aider.
    z-index, c'est du css, pas du javascript. Tu pourras peut-être te renseigner via des tutoriaux (site du zéro) ou sur des forum (même site).
  • gravatar
  • gravatar
    Salut,
    Merci pour ce tuto bien pratique pour les débutants en js. J'essaye de télécharger le zip avec les sources pour essayer de comprendre le code, mais ils ne ce téléchargement pas entièrement. safari ou firefox m'indique une archive incomplète.

    Une idée ?

    Merci d'avance
  • gravatar
    Je sais, je viens tard, mais bon:
    Très bel outil, merci. Je le préfère à bubulle car pour manier de l'ajax, je peux tout inclure dans le mouseover.
    Seul souci rencontré: le positionnement de la bulle. Je l'appelle à partir de boutons positionnés dans une table après lecture de base sql. Le texte de la bulle correspond au bouton chargé. Quelque soient les paramètres passés en 'position', elle se met au centre de l'écran sous firefox et en haut à gauche sous IE8. Il semble aussi que ce paramètre n'aime pas trop les frames?
    Vu que je m'y connais pas trop en JS, toute aide serait bienvenue.
    Merci et bonnes fetes!
  • gravatar
    c'est génial votre site, est beau, pratique, didactique ! Bravo
  • gravatar
    Salut !
    J'aime le système de notifications discrètes :)
    Mais je les trouve trop ... brutales.
    Il serait plus joli de combiner Msg avec Animate, pour que la notification apparaisse puis disparaisse en fondu transparent.
    Au moment où le message s'estompe, si l'utilisateur passe la souris dessus, Animate s'arrête et le message redevient opaque.
    Il pourrait être intéressant de rajouter ça (je tenterais de le coder...)
  • gravatar
    C'est super en effet !
  • gravatar
    Non, pas Animate, Fade serait suffisant.
    Il faudrait appeler Fade en callback, à la fin de l'affichage de la notification.
  • gravatar
    Bonjour,
    Voila j'ai un problème. J'ai crée un msg avec les champs pseudo et password.
    Mais je n'arrive pas à récupérer les informations une fois que l'utilisateur à validé...

    Voici mon code :

    function FenetreConnection ()

    {
        var identifiant = "Identifiant :<input type=\"text\" value = \"\" id = \"pseudo\" name=\"pseudo\"/> <br/>";

        var mdp = "Mot de passe:<input type=\"password\" value = \"\" name=\"pass\" id=\"pass\" /></label> <br/><br/>";

        var boutonAnnuler = " <input type=\"button\" id=\"boutonAnnuler\" value=\"Annuler\" onclick = \"msg.close();\"/><br/>";

        var boutonValider = "<input type=\"button\" id=\"boutonValider\" value=\"Valider\" onclick = \" VerifierIndentification ();\"/> ";

        

        var messag = identifiant+mdp+boutonValider+boutonAnnuler;

        document.getElementById("connection").onclick = function() {

        var options = {

             "title": "Connexion",

             "button":null,

             "modal":"false",

             "modalOpacity":"0.4",

             "position":"m",

             "style":{backgroundColor:"#326FFC"},
        };

        
        msg.open( messag , options);
        

        return false;

    };

    }

    La fonction VerifierIndentification () vérifie les informations et procède aux actions souhaités si elle sont valide, sinon elle ferme le msg sans rien faire.

    J'ai essayé de récupérer les information de la même façon qu'avec les formulaire mais je n'ai jamais réussi...

    Quelqu'un pourrait il m'aider svp ?
  • gravatar
    Problème résolu :)
  • gravatar
    Bonjour, je en comprends pas comment on lance l'ouverture d'une fenetre en récupérant la fonction alert.
    ...
    replaceAlert()     si cette méthode est appelée, tous les appels de la fonction native alert() renverront à msg.reload('alert');

    J'ai dans mon code une "alert" qui normalement ouvre une fenetre contenant le message. Mais quelle est la syntaxe qui permet de récuperer cette alerte et de commander l'ouverture d'une fenetre ?
    Par exemple au lieu de :
    <replaceAlert()="msg.open('Salut tout le monde !'); return false;" href="#"> ou
    <replaceAlert('Salut tout le monde !'); return false;" href="#">

    enfin, tout ça ne fonctionne pas ...
    Quelqu'un peut m'aider ?
    Merci

    je presume qu'il faut ecrire quelque chose comme :

    <="msg.open('Salut tout le monde !'); return false;" href="#">Dîtes bonjour</a>
  • gravatar
    Bonjour,
    Je dis bravo pour le script. C'est exactement ce que je cherchai.
    Cependant, j'ai une petite question :
    J'ai un formulaire avec vérification automatique des champs (par javascript)
    Lorsque je intègre dans une fenêtre modal, la vérification ne se fait plus :(
    Le javascript n'est plus exécuté.
    Comment puis-je résoudre mon problème??
    merci
  • gravatar
    Salut à tous!
    Actuellement j'ai exactement le problème de @ACORN. J'aurai aimé qu'il me donnes un coup de main.
    Merci
  • gravatar
    Thanks for the share!
    Nancy.R
  • gravatar
    Bonjour à tous, je doit être vraiment nul mais je n'arrive pas à écrire ces lignes pour quelles fonctionne. J'ai fait:
    <html>
    <head>
    <script type="text/javascript" src="msg/msg.js">
    document.getElementById("un_element").onclick = function() {
        msg.open("Salut tout le monde !");
        return false;
    };
    </script>
    <link rel="stylesheet" media="all" href="msg/msg.css" />
    </head>
    <body>

    Ce qui nous donne : <a href="#" onclick="msg.open('Salut tout le monde !'); return false;">Dîtes bonjour</a>

    </body>
    </html>
    Merci d'avance pour votre aide.
  • gravatar
    Dans ton lien, tu enlèves le onclick="...", et tu ajoutes id="un_element". Je pense que c'est le mieux.
  • gravatar
    J'ai écris le lien comme çà:
    <a href="#" id="un_element"; return false;">
    et comme ça:
    <a href="#" onclick="un_element"; return false;">
    Mais sa ne marche toujours pas.
  • gravatar
    <a href="#" id="un_element">
  • gravatar
    Non plus.
  • gravatar
    Alors il y a peut-être une erreur dans "msg/msg.js" et "msg/msg.css".

    Tu es sûr que ces adresses sont bonnes ? Je vois que dans le zip de téléchargement le fichier javascript se trouve dans un dossier "msg.v2/", et non "msg/".

    Au fait, tu connais le concept d'url relative ? http://bit.ly/H2RZ7k
  • gravatar
    Mon fichier tout simple:
    <html>
    <head>
    <script type="text/javascript" src="msg.v2/msg.js">
    document.getElementById("un_element").onclick = function() {
        msg.open("Salut tout le monde !");
        return false;
    };
    </script>
    <link rel="stylesheet" media="all" href="msg.v2/msg.css" />
    </head>
    <body>

    Ce qui nous donne :
    <a href="#" id="un_element">Dîtes bonjour</a>

    </body>
    </html>
  • gravatar
    Est-ce que tu pourrais me passer 3 fichiers que tu fait marcher :
    -msg.js
    - msg.css
    - et fichier html qui va bien.
    Merci d'avance
    sulaffy-975@yopmail.com
  • Navré, le formulaire de commentaires est temporairement indisponible.