Brico-Info - le blog de Bruno CATTEAU

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

Balise - javascript

Fil des billets - Fil des commentaires

mardi 12 juin 2007

Tester un safari sans Mac

Après quelques recherches sur le sujet "utiliser un Mac quand on en a pas..." J'ai exposé mon problème sur le forum de Macbidouille.

Mes pistes de recherche :

- 1. Emulation d'un Mac sur PC (pour l'instant je galère, mais ça va peut etre se décoincer), projet PearPC, via Virtual server et via VMWare...
- 2. Recherche d'un service de "location en ligne" d'un Mac, genre à l'heure, je paie puis je me branche dessus par VNC ou autre, et je l'utilise pour tester mon appli. Mais je ne sais pas si ça existe
- 3. enfin, l'achat d'un Mac, mais vous comprennez bien que acheter un mac pour l'utiliser 2 heures par mois, ça fait drole...

Voilà le résultat de mes recherches :

 - 1. L'émulation d'un Mac sur PC, ca ne marche pas sur Virtual server, PearPC, le problème c'est la carte réseau et via VMWare, c'est hyper lent, et en quelques minutes, ça plante
 - 2. Service trouvé (après un certain temps de recherche : les mots clés sont : "remote access service for cross-platform testing of web designs.") browsercam, permet d'avoir un accès en VNC à toutes les config possible pour faire du test sur le web http://www.browsercam.com/Features.aspx. Je n'ai pas testé le service, mais j'ai l'impression que c'est pas mal.
 - 3. Je n'ai pas acheté de Mac...
 - 4. Lors de mes recherches, une autre piste est apparue, une émulation de Safari uniquement (plutôt que de faire tourner le Mac entier... Un safari sur PC, c'est le projet getswift, mais à croire qu'il a été interdit par Apple, j'ai eu un mal fou à le trouver... (il faut chercher "swift_0.2.msi "  sur google) Ce n'est pas encore au point en tout cas...
 - 5. Enfin, deux bonnes volontés du forum Macbidouille m'ont ouvert leur porte via VNC pendant quelques heures le temps de regler mes problèmes de compatibilité : cool ! Merci à Gauvichounet et à Art !

 - 6 [UPDATE 12 juin 2007] Safari pour Windows, Apple l'a fait ! http://apple.com/safari J'ai testé, ce n'est pas concluant, j'ai l'impression qu'on a le droit actuellement à un nouveau navigateur avec un nouveau problème de compatibilité. Esperons qu'ils vont corriger ça !

Mes problèmes de compatibilité Javascript étaient :

  • Utilisation d'un id identique pour plusieurs div différentes (c'est mal !)
  • L'utilisation d'une ruse qui ne marche pas sous MAC setMinutes(540) mets 9:00 sous PC et 0:54 sous MAC, il faut faire le modulo et la partie entière et utiliser setHours() et setMinutes() sinon, ca plante.
  • Enfin un probleme de style sur la popup etait du à un margin-left que le safari n'apprecie que moyennement...
         //sepStyle += 'margin-left: 32px;';
         sepStyle += 'position:relative;left: 32px;';

     


mardi 5 décembre 2006

Le prototypage...

Lors de la formation AJAX, on aborde cette facette du Javascript peu connue.

Une définition du Prototypage est : ''un prototype est une instance d'une classe qui possède des attributs et des méthodes par défaut qui sont utilisés si les instances de la classe ne les redéfinissent pas''. En Javascript, on peut tout prototyper.

Pour faire ces exemples, vous pouvez utiliser le shell qui  vous permet de faire de la ligne de commande en Javascript dans le contexte de la page en cours.

La syntaxe du prototypage est la suivante :

//Définition d'une classe
Voiture = function(marque, modele) {
  this.marque= marque;
  this.modele= modele;
}

//Exemple :
voiture1 = new Voiture('BMW', 'Classe 1');

//On rajoute une méthode qui s'ajoute à tous les objets Voiture en prototypant la classe Voiture 
Voiture.prototype.demarre = function() {
  return 'Vrooom';
}

//essai
voiture1.demarre()
>>Vrooom

Si une méthode demarre() avait été définie dans la classe Voiture, elle n'aurait pas été écrasée par la méthode ajouté par prototype.

Nous allons maintenant prototyper l'objet natif Array du Javascript

Array.prototype.compte = function(){
  return this.length;
}

//définition d'un tableau
tableau = ['choux','carotte','poireau']
>>choux,carotte,poireau

//Appel de  la methode ajoutée
tableau.compte()
>>3

//Appel de la proprieté length
tableau.length
>>3
 
Prenons un cas un peu plus tordu (c'est au final l'objet de ce post...)
 
coll = document.getElementsByTagName('*')
>>[object HTMLCollection]
 
coll.length
>>90

coll.compte()
>>TypeError on line 1: coll.compte is not a function
 
En effet, getElementsByTagName ne retourne pas un tableau, contrairement à ce qu'indique Aptana dans sa documentation contextuelle, mais un Dom Collection
 
//on demande le type de coll
coll.constructor.name
>>Object
 
//on demande le type de tableau
tableau.constructor.name
>>Array
 
Les deux sont différents. Nous allons donc essayer de prototyper les Object :
 
Object.prototype.compte = function(){ return this.length;}
>>function () { return this.length; }
 
coll.compte()
>>90
 
Mais sous Internet Explorer, ça ne fonctionnera pas car le script n'a pas accès à ces objets là.
Et comme dirait Nico : "Les types des DOM ne sont pas dans l'arbre d'héritage du JS"...
 

jeudi 9 novembre 2006

Le début de la célébrité...

Voici une capture d'un article qui est passé dans "Le monde informatique" n°1133 du 3 novembre 2006. L'article confronte plusieurs visions des formations AJAX (le titre le résume bien). Les formations AJAX que nous dispensons sont plus sur le savoir faire, l'argument est qu'il faut s'être cogné l'objet XmlHttpRequest avec ses methodes et ses proprietés au moins une fois et bien comprendre les syntaxes du javascript qui peuvent être très très simplifiées avant d'aller plus loin. Et seulement après, on peut s'amuser avec les frameworks.

 

 

vendredi 20 octobre 2006

Tests sur les nouvelles versions des navigateurs

En cette periode de sortie des nouvelles versions de Internet Explorer et Firefox, j'ai voulu vérifier ce que l'on dit (IE c'est nul, Opéra, il parait que c'est hyper rapide, etc...)

J'ai testé un ensemble de petits scripts javascript téléchargeables ici. En gros, le principe est de faire en boucle plusieurs fois une même action pour mettre en evidence une lenteur ou une rapidité relative... A noter que ce n'est peut etre pas l'action en elle même qui crée une lenteur, mais peut être la succession de cette action. L'exemple typique est d'executer 10 000 fois document.getElementById('id_div').innerHTML += 'toto'; ...

Les navigateurs séléctionnés sont les suivants :

                                                          
Opera 9.0  Firefox 1.5  Firefox 2.0  Internet Explorer 6  Internet Explorer 7

 Voilà le tableau des résultats (les temps ont été pondérés pour être comparables)

  innerHTML += innerHTML = objet image getElementById getElementById innerHTML DOM
Opera 9 4,483 1,83 3,2 4,56 1,748 6,72
FF 1.5 11,83 7,407 5,92 6,28 7,936 10,78
FF 2.0 8,875 5,625 10,62 5 5,688 8,59
IE 6  3,437 9,705 3,44 9,4 12,752 6,88
IE 7 3,922 9,189 4,7 9,4 11,124 5,31

et en image :

Mes conclusions :

  • La nouvelle version de Internet Explorer et de Firefox est meilleure que l'ancienne (on pouvait l'esperer...) (Sauf sur lacréation de l'objet image pour IE7, mais c'est peut être mon test qui est à remettre en cause...)
  • Opera est plus rapide, c'est plus qu'une idée reçue, c'est vrai... (ou au moins vérifié par Bruno CATTEAU...). Par contre, ils ont encore des progrès à faire au niveau des CSS...
  • Firefox n'est pas si rapide que ça par rapport à Internet Explorer, mais dans le chargement de la page, il accèpte d'afficher le début d'un tableau ou d'un div même s'il n'a pas rencontré la balise de fermeture, ce qui augmente l'impression de vitesse, et c'est ça le plus important. Opera a l'air de jouer beaucoup sur ce dernier point, on le voit même dans mon script test_innerHTML.html.
  • Au niveau de la gestion des erreurs, Firefox est très loin devant, surtout quand il est associé à l'extention Firebug. C'est certainement pour ça qu'il est tant apprecié des développeurs AJAX (en plus de mieux respecter les standards). Développer une application AJAX avec Internet Explorer c'est comme reparer un magnétoscope dans le noir (désolé, je n'ai pas trouvé mieux...).
  • Si vous êtes utilisateur, j'ai envie de vous conseiller Opera.
  • Si vous êtes développeur, vous devez déjà utiliser Firefox... et testez vos applis sur le moins bon des navigateurs pour voir si la pire version est acceptable. Eviter d'utiliser innerHTML += dans une boucle doit devenir une habiture...

 

lundi 2 octobre 2006

Problème de focus...

Si vous cherchez des infos sur la façon de contourner l'erreur javascript suivante, vous êtes au bon endroit :

Error: [Exception... "'Permission denied to get property
XULElement.selectedIndex' when calling method:
[nsIAutoCompletePopup::selectedIndex]"  nsresult: "0x8057001e
(NS_ERROR_XPC_JS_THREW_STRING)"  location: "JS frame :: filename> :: onmouseover :: line 1"  data: no]

Cette erreur est apparue chez moi au moment de donner le focus à un champ que je venais de créer (par les DOM ou par un innerHTML). C'est un bug connu chez Firefox qui n'est pas bloquant.

Après recherche et lecture des pages suivantes :
 - http://groups.google.ca/group/netscape.public.mozilla.dom/browse_thread/thread/821271ca11a1bdbf/46c87b49c026246f?lnk=st&q=+focus+nsIAutoCompletePopup+selectedIndex&rnum=1#46c87b49c026246f
 - https://bugzilla.mozilla.org/attachment.cgi?id=143270

Voilà les solution pour contourner le problème :

Sous Firefox, il faut ajouter la proprieté autocomplete="off" au champ sur lequel on veut faire le focus,

Sous Internet Explorer, il faut laisser le navigateur respirer avant de trouver le champ pour lui donner le focus : setTimeout(function(){$('saisie').focus();},100);

 

- page 1 de 3