deniscope

Aller au contenu | Aller au menu | Aller à la recherche

Mot-clé - javascript

Fil des billets - Fil des commentaires

2013 nov. 9

La fin de javascript ?

Aujourd'hui javascript est un langage incontournable pour la construction d'un site web même modeste. De plus en plus utilisé, possédant une grosse communauté de développeurs, javascript a le vent en poupe et on trouve maintenant de nombreux frameworks l'utilisant. Et pourtant. Pourtant, si on regarde quelques années en arrière, javascript était déjà présent dans les pages internet. Plutôt alors réservé aux développeurs expérimentés, il était souvent délaissé au profit de technologies lourdes (java ou flash) pour rendre "dynamique" une page. L'internet grandissant, les navigateurs ont également évolué. Ce qui prenait plusieurs kilos de lignes de code javascript avant, peut aujourd'hui s’exécuter en quelques instructions. Cela a pris du temps, le marketing aidant, on a même pu nommer les différentes périodes de cette évolution (DHTML, Ajax, Web2.0...) et petit à petit des choses se sont mises en place. Ces choses vont toutes dans le même sens : une mise en œuvre plus rapide et plus soignée du modèle MVC (Model View Controler).

Aujourd'hui toujours, javascript a beaucoup de mal à trouver sa place dans le système MVC. Trop souvent employé pour le 'V', heureusement rarement pour le 'M', il ne devrait apparaitre que dans le 'C', et encore. La prochaine grande évolution du web ne semble laisser que peu de place à un langage tel que javascript. Déjà HTML5/CSS3 remplacent avantageusement certains frameworks d'animation d'éléments visuels. Combien de temps faudra-t-il au web pour pouvoir se passer de javascript ?

La grande force d'un langage client puissant et d'une "bidouillabilité" exceptionnelle est qu'elle permet de faire une foultitude de choses d'une foultitude de manières. Mais le développement du web est aussi (et avant tout) un milieu réservé à des professionnels. Avec l’essor de l'internet mobile, les périphériques se multiplient et donc les clients web qui poussent vers une normalité des pratiques car il est toujours plus facile d'interpréter une norme selon ses spécificités (petit écran, tactile, noir et blanc...) plutôt que de compiler un code souvent complexe pour finalement seulement se rapprocher du comportement voulu. C'est pourquoi, même s'il sera toujours amusant à utiliser, le javascript devrait, en toute logique, disparaitre peu à peu de nos clients web.

2009 juil. 9

Les petits secrets de nos navigateurs: Partie 5

BrowserShot printscreen

Se réveiller après la bataille

Le secret numéro 1 a déjà révélé un comportement étrange après l'événement onload. Le secret numéro 5 n'en est pas moins étonnant. Plantons le décors.

L'histoire se passe après l'événement onload, et c'est l'histoire d'un tag SCRIPT généré et inséré au DOM. L'histoire raconte que le script contenu dans le tag SCRIPT en question n'est pas automatiquement exécuté comme on pourrait s'y attendre.

Regardons de plus près un exemple avec le test 5, pour simplifier il peut se découper en trois étapes:

  1. Appel d'une méthode pour mettre un fond rouge
  2. L'événement onload appel une méthode
  3. La méthode construit un tag SCRIPT qui contient la même méthode que le point 1 mais avec un fond vert

Le test contient deux façons différentes de construire le tag SCRIPT, à gauche en écrivant littéralement le tag dans la propriété innerHTML d'un tag DIV et à droite en utilisant la méthode createElement. Pour résumer, si le carré est vert c'est que le tag SCRIPT a été exécuté, s'il reste rouge c'est qu'il ne l'a pas été.

Et là, que peut-on voir de nos petits yeux, encore embrumés d'une telle découverte, que les résultats sont pour le moins inconstant (voir le récapitulatif BrowserShots sur l'image ci-dessus). Certains navigateurs font très bien leur boulot et obtiennent les deux carrés verts, pendant que d'autres n'en ont qu'un seul voir pas du tout. On peut noter, pour ce secret, une nette différence (ils sont opposés) entre les deux gros concurrents leader du marché, Firefox et Internet Exporer.

Maintenant, quant à expliquer le phénomène, je me contenterais de faire comme pour les autres secrets, c'est à dire de seulement le constater.

2009 juin 25

Créer un cercle en CSS

J'ai récemment écrit une méthode pour faire un cercle en javascript et CSS:

/**
 * Draw a circle in the given color and Element
 * @param radius radius of the circle
 * @param color color of the circle 
 * @param id id of the Element where the circle will be drawed 
 **/
function drawCircle(radius, color, id){
    var circle = document.getElementById(id);
    if (!circle) return;
    circle.style.width  = (2 * radius) + 'px';
    circle.style.height = (2 * radius) + 'px';
    var index = 0;
    for (index = 0; index < (2 * radius); index ++){
        var line = document.createElement('p');
        line.appendChild(document.createTextNode(' ')); 
        line.style.border = 'none';
        line.style.borderSpacing = '0px';
        line.style.padding = '0px';
        line.style.height = '1px';
        line.style.fontSize = '0px';
        line.style.backgroundColor = color;
        var r = Math.abs(radius - index);
        var width = 2 * Math.round(Math.sqrt(radius * radius - r * r));
        line.style.margin = '0px ' +  (radius - width / 2) +
                            'px 0px ' + (radius - width / 2) + 'px';
        line.style.width = width + 'px';
        circle.appendChild(line);
    }
}

Comme un exemple vaut toujours mieux que mille explications. En voici un:

<div id = "circle"></div>
<script>
      drawCircle(100,  'magenta', 'circle');
</script>

Ce qui donne:

L'utilité de la chose est limitée j'en conviens.

Mise à jour: J'ai reçu des milliers de plaintes me disant que ceci n'est pas un cercle mais un disque. Force m'est de constater que vous avez raison. Voici donc une méthode avec l'exemple qui va bien pour créer un cercle (cette fois).

/**
 * Draw a circle in the given color and Element
 * @param radius radius of the circle
 * @param color color of the circle 
 * @param id id of the Element where the circle will be drawed 
 **/
function drawCircle(radius, color, id){
    var circle = document.getElementById(id);
    if (!circle) return;
    circle.style.width  = (2 * radius) + 'px';
    circle.style.height = (2 * radius) + 'px';
    var index = 0;
    for (index = 0; index < (2 * radius); index ++){
        var line = document.createElement('p');
        line.appendChild(document.createTextNode(' '));
        line.style.borderLeft = 'solid 1px '+color;
        line.style.borderRight = 'solid 1px '+color;
        line.style.borderTop = 'none';
        line.style.borderBottom = 'none';
        line.style.borderSpacing = '0px';
        line.style.padding = '0px';
        line.style.height = '1px';
        line.style.fontSize = '0px';
        var r = Math.abs(radius - index);
        var width = 2 * Math.round(Math.sqrt(radius * radius - r * r));
        line.style.margin = '0px ' +  (radius - width / 2) +
                            'px 0px ' + (radius - width / 2) + 'px';
        line.style.width = width + 'px';
        circle.appendChild(line);
    }
}

Voici l'exemple:

<div id = "circle2"></div>
<script>
      drawCircle(100,  'magenta', 'circle2');
</script>

Ce qui donne:

L'utilité en n'est pas vraiment accrue.

2009 avr. 27

Les petits secrets de nos navigateurs: Partie 1

Si Champollion m'était conté.

browsershot1.jpg On a tous nos petits secrets, des comportements inavouables que la décence nous fait cacher aux yeux du grand public. Mais voilà, Internet n'est pas constitué seulement du grand public et, immanquablement, tout secret finit par être percé et exploité. Regardons de plus prêt une méthode javascript largement utilisée sur le web: document.write.

Si je me fis à cette documentation en ligne, il est dit:

Do not use the write method or the writeln method on the current document after the document has finished loading unless you first call the open method, which clears the current document window and erases all variables.

Comme je suis taquin, j'ai écrit une petite page pour vérifier cette information. Cette page est constituée de deux pages tests. Chaque page test est constituée d'un gros carré rouge et d'un appel à une méthode qui écrit un gros carré vert. Seul l'appel à cette méthode n'est pas placé au même endroit. Voici le code de la méthode:

 function beGreen(){
     document.write('<div style = "width: 100%; height: 100%; background: green" />');
     document.close();
 }

La première page test appelle la méthode document.write juste après le chargement de la page.

window.onload = beGreen;

L'effet est immédiat, le gros carré vert apparait.

La seconde page test est un peu plus complexe. Le code est également situé dans l'événement onload mais ressemble à ca:

window.onload = function(){    var obj=document.createElement("script");obj.src="onload.js";document.body.appendChild(obj);}

On construit un élément SCRIPT dont la source sera onload.js qui lui contient exclusivement un appel à la méthode beGreen. L'effet n'est pas si immédiat, mais le gros carré vert apparait tout de même, mais... Mais le gros carré vert n'apparait curieusement pas avec tous les navigateurs.

En utilisant l'excellent service en ligne BrowserShots sur la page test, vous obtenez les résultats présentés sur l'image ci-dessus (vous pouvez cliquer sur l'image pour la voir en plus grand). Que passa? Il y a encore du rouge avec les navigateurs Internet Explorer? Pour des raisons qui m'échappent Internet Explorer se refuse à écraser le document sur la seconde page test. Alors pourquoi? Et bien, pour tout dire, je n'en sais rien...