Archive for mai, 2010

Parce qu’on n’a pas toujours le document au format qui nous convient, ou parce qu’on a parfois besoin de repasser par des chaînes de caractères pour passer des arguments ou stocker des variables, différents outils de conversion sont mis à disposition du développeur.

Conversion en passant par JSON

Certains types peuvent être convertis en passant par JSON : le texte, les objets, les tableaux, les nombres…

Du type javascript au texte : il faut utiliser JSON.stringify
Exemple : JSON.stringify([1,2,3]) => « [1,2,3] »

Du texte vers un type javascript : il faut utiliser JSON.parse
Exemple : JSON.parse(« [1,2,3] ») => [1,2,3] (où 1, 2 et 3 sont des entiers)

Conversion d’un document DOMDocument ou XMLDocument

Deux outils sont à disposition : XMLSerializer (du document vers string) et DOMParser (de string vers un document).

XMLSerializer : DOMDocument vers une chaîne de caractères
Exemple : s = new XMLSerializer(); var documentString = s.serializeToString(document);

DOMParser : Conversion d’une chaîne de caractères vers un objet DOMDocument
Exemple : p = new DOMParser(); var doc = p.parseFromString(‘<html><body>coucou</body></html>’, ‘text/xml’);

Compatibilité

Ces APIs sont compatibles avec, entre autres, Safari 4.0+, Chrome, Firefox 3.5+, et peut-être IE… 😉

Il peut être parfois nécessaire d’utiliser une iframe, pour accéder par exemple à des cookies sur un autre site, se logguer, etc. Le problème est que si vous utilisez une iframe sur un domaine différent, le navigateur va vous renvoyer une erreur.

iframe et sécurité

Lorsque les domaine ou port diffèrent entre les deux frames, le navigateur va refuser la communication. En effet, imaginez que vous puissiez afficher une iframe cachée dans votre page, pour ensuite y récupérer des informations sensibles.

Exemple : dans mon site example.org, je mets une iframe vers mabanque.com et je récupère les informations bancaires de l’utilisateur de mon site (si celui-ci est déjà loggué sur le site de la banque).

La solution

Pour autoriser la communication entre les frames, il faut utiliser le protocole de communication entre les fenêtres.

Cette communication se fait par évènement : une fenêtre envoie à l’autre un objet1, qui le reçoit en ajoutant un handler sur l’évènement « message ».

Exemple

Dans notre exemple, l’iframe enverra un message à la fenêtre principale.

Fenêtre principale :

  1. // On rajoute un handler d'évènement
  2. function onMessage(e)
  3. {
  4.   // Vous pouvez vérifier l'origine de la fenêtre avec e.origin
  5.   document.getElementById('div-test').innerHTML = "Réception du message " + JSON.stringify(e.data);
  6. }
  7. window.addEventListener("message", onMessage, true);

Fenêtre iframe

  1. var dstWindow = window.parent;
  2. // Vous pouvez choisir le domaine vers lequel vous acceptez d'envoyer un message (ici, tous les domaines)
  3. dstWindow.postMessage([1,2,3], '*');

div-test pour la réception du message


1 : en fonction du navigateur, vous ne pourrez passer que des chaînes de caractères (Firefox 3.6 par exemple – Chrome supportant les objets). Pour pallier ce défaut, vous pouvez utiliser JSON.stringify et JSON.parse pour passer des objets comme des chaines ou des variables. Pour tout ce qui est DOM, ce n’est pas possible de faire passer les handler d’évènement définis dans la fenêtre source.

La question du jour : comment copier du texte en javascript.

En théorie

On va utiliser les objets suivants : la sélection DOM, et un Range.

La sélection DOM consiste en un objet, présent dans HTML5, qui permet de gérer les sélections de texte à l’intérieur d’un document.

Le range est un intervalle, qui permet de définir une zone continue dans un document.

En pratique, mis bout à bout

En pratique : on crée un range, on fait pointer la sélection dessus (en veillant à supprimer la sélection actuelle), et on exécute la commande « copy » pour copier la sélection dans le presse-papier.

  1. var r = document.createRange();
  2. r.selectNode(mon_element_a_selectionner);
  3. var s = window.getSelection();
  4. s.empty();
  5. s.addRange(r);
  6. document.execCommand('Copy');

Exemple : copier le code javascript (ne fonctionne qu’avec un navigateur compatible HTML5)

Les notifications

Introduit parmi les nouvelles fonctionnalités de l’HTML5, les notifications permettent aux sites web (que vous autorisez) de vous informer d’une activité sur un site. C’est comme les notifications de MSN messenger, quand une fenêtre apparaît en bas à droite de l’écran.

L’API supporte deux fonctions pour créer des notifications : soit à partir d’une URL, soit à partir d’une icône, d’un titre et d’une description. Utiliser une URL d’un fichier HTML permet d’avoir beaucoup plus de possibilités, au niveau de l’interaction comme au niveau de l’affichage (gras, images, liens, etc).

Utilisation dans chrome

Pour l’instant, chrome est le seul navigateur à supporter ce standard (sous Linux, hein !).

Voici un petit exemple de script (plus de détails dans la doc de chrome) :

  1. function showNotification()
  2. {
  3.   // Création de l'objet, puis affichage
  4.   var notification = webkitNotifications.createHTMLNotification('http://monurldenotification.com/');
  5.   notification.show();
  6. }
  7.  
  8. function sendNotification()
  9. {
  10.   var auth = webkitNotifications.checkPermission();
  11.   if (auth == 0) showNotification(); // Autorisé
  12.   else if(auth == 1) webkitNotifications.requestPermission(sendNotification); // Demande la permission
  13.   else { } // Refusé
  14. }
  15.  

Les limites

Malheureusement, il n’est pas possible de faire tout ce qu’on veut . Voici quelques limitations encore valables à ce jour :

  • Impossible de dialoguer entre la desktop notification et le script qui l’a ouverte ;
  • Impossible de spécifier une adresse du type data:text/html,<h1>test</h1>

A améliorer donc, afin d’avoir une réelle possibilité d’intégration dans des applications (type chat, …).