IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Event.observe baisse de performance ? [Fait]


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut Event.observe baisse de performance ?
    Bonjour,

    Je voulais savoir s'il pouvait y avoir une différence de performance entre un
    Event.observe(obj, "click", function fun()) et un simple <a id="toto" onclick="fun();"/>

    Quand je parle de performance, je parle de mémoire utilisé par le navigateur.

    Merci d'avance pour vos réponses.

  2. #2
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    non pas spécialement de perte de performance , puisque l'action ne sera détecté qu'en cas de click ( dans ton cas ... )

    le Event.observe , est utile lorsque tu utilises la même méthode sur X objet , si tu dois utiliser ta méthode sur un seul objet alors reste sur le onclick

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    Erf, tu n'aimes pas le mot problème dans les titres de post
    Avec mes excuses alors !

    Merci pour ta réponse

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Si je peux me permettre d'être un peu tatillon, tout comme les css ont permis de séparer le contenu de la mise en forme, le "inobstrusive js" tend à séparer le contenu du comportement, il est donc plus dans l'air du temps d'éviter les onclick dans les balises et de leur préférer les Event.observe dans des fichiers séparés.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 397
    Points : 430
    Points
    430
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Si je peux me permettre d'être un peu tatillon, tout comme les css ont permis de séparer le contenu de la mise en forme, le "inobstrusive js" tend à séparer le contenu du comportement, il est donc plus dans l'air du temps d'éviter les onclick dans les balises et de leur préférer les Event.observe dans des fichiers séparés.
    L'ère du temps.

    Pour le reste, vu l'utilisation des event.observe par rapport aux onclick, je pense que le onclick a encore de beaux jours devant lui.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    Citation Envoyé par tusssss Voir le message
    L'ère du temps.

    Pour le reste, vu l'utilisation des event.observe par rapport aux onclick, je pense que le onclick a encore de beaux jours devant lui.
    Qu'est ce que tu veux dire par la ?

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    J'imagine qu'il veut dire, et je le suivrais bien volontiers sur cette voie, que l'objet event de javascript est tellement différencié entre les navigateurs que la seule option raisonnable est encore pour le moment de gérer les onclicks dans le script html sauf si l'utilisation de frameworks tels que prototypes peut se justifier.

    En résumé, c'est presque pire que l'utilisation des css il y a 15 ans !

    Ceci dit, vu le code que tu as donné, tu sembles utiliser prototype et dans ce cas, il me semble que le Event.oserve (dont tu remarqueras que tu peux le syntaxer obj.oserve('click', fonction) ) est mieux adapté.

  8. #8
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    enfin bon moi ce que j'en dis ...
    pour une appli perso être utiliser par-ci par la , le bon vieux onclick est d'actualité, si demain on tape sur une appli pro qui va toucher des milliers d'utilisateur on pourra commencer a regarder l'optimisation et "l'ère du temps" ...

    Juste également quand vous dites que les events sont utiliser de différente manière selon les navigateurs, sans faire mon rabat joie ni autre un script compatible FF + IE couvre 95% des utilisateurs ( voir plus ... ) donc les chiffres parlent d'eux même

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    Juste une chose encore:
    Sur un objet de ma page sur lequel je mets un Event.observe, est ce que le fait de ne pas arréter l'observation quand l'objet n'est plus sur la page peut altérer les performances?

    Je parle d'un cas surtout quand j'ai beaucoup d'éléments que j'observe sur une page.

  10. #10
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    non plus , si l'objet n'existe pas , aucun évènement ne lui sera attaché a tester :

    -> créer un event observe sur un objet inexistant
    -> créer ton objet via le dom
    -> test l'évènement

    on attend ton retour

  11. #11
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    ok compris

    Donc pour finir le Event.observe n'alourdit pas la charge mémoire du navigateur. Ok.

    Alors toute derniere question: Pourquoi si je laisse Netvibes ouvert un temps conséquent dans mon navigateur, la charge mémoire augmente, augmente et augmente ?

  12. #12
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    il y a t-il des éléments flash sous netvibes ?
    ton navigateur est-il firefox ?

    si la réponse est oui aux deux question ça répond tout seul a la question => normal problème de fuite mémoire sous firefox avec les éléments flash ( voire balise object )

  13. #13
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    Oh bah non.
    Tu ne connais pas Netvibes ?
    Aggrégateur de flux RSS.
    Site quasi tout javascript

  14. #14
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    si je connais netvibes , c'est un service de page de démarrage
    mais dans les news/modules que tu affiches il y avait peut-être du flash...

    sinon le fait qu'il charge les news régulièrement , il les montent peut-être en mémoire ...

  15. #15
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    http://javascript.crockford.com/memory/leak.html

    Alors oui, attacher des évènements prend de la mémoire sur Internet Explorer !

  16. #16
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    est ce que le_chomeur peut répondre ?

  17. #17
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    oui me voila ^^

    alors je vais faire une synthèse de ce que j'ai pu apprendre suite a ce sujet et mes recherches :

    Les fuites mémoire , apparaissait sous IE6 et windows xp lors de l'utilisation circulaire sur un objet exemple , je créer un objet , à l'intérieur duquel j'assigne une méthode a un objet ( cela ressemble a ton cas en plus ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function assignerSouris(monElement)
    {
    monElement.attachEvent( "onmouseover", voirSouris);
     
    	function voirSouris() 
    	{
    		//Le code ici
    	}
    }
    les préconisations sont de passer par un évènement extérieur a l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function assignerSouris(monElement)
    {
        monElement.attachEvent( "onmouseover", voirSouris);
    }
    function voirSouris() 
    {
    //Le code ici
    }
    Autre préconisation : relâcher les évènements lorsqu'il ne sont plus nécessaires ( les onmouseover etc une fois effectuer , et les réaffecter au commencement de l'action. ) ce qui peut paraitre logique puisqu'un mouseout n'interviendra qu'après un mouseover , donc si vous devez gérer les deux évènement , attacher le second à l'exécution du premier.

    d'autre cas plus spécifique , concernant le DOM , qui selon moi sont a éviter en toute logique !

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //On récupère un élément présent dans la page :
    var unDiv = document.getElementById('unDiv');
     
    //Admetons que monObjet, est un objet js avec ses méthode et ses propriétés
    monObjet.unDivPrive = unDiv; 
    //Puis pour x raison on doit affecter l'objet précédemment créer a un objet de type DOM
    unDiv.unObjet = monObjet;
    Nous avons un appel circulaire qui causera une fuite mémoire /!\

    en dehors de mes recherches , j'ai pus constater qu'en général les problèmes de mémoire apparaissait beaucoup plus souvent sur firefox qui gérait mal son garbage collector a la fermetuire d'une page ( notament celles contenant beaucoup de FLASH ) , je n'ai jamais eu de problème particulier sous ie6 ou 7 concernant des montés en mémoire ( attention a ne pas confondre avec le taux d'utilisation du processeur !! )

    voici un utilitaire sous firefox , permettant de détecter ces fameuses fuite mémoire due , comme vous l'aurez compris à une bonne pratique de programmation , et également a une gestion de la mémoire pas toujours optimisé sous certain navigateur

    https://addons.mozilla.org/fr/firefox/addon/2490

    Allez hop au boulot

  18. #18
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    non plus , si l'objet n'existe pas , aucun évènement ne lui sera attaché a tester :
    Sous ie tout du moins, tant que l'evenement n'est pas détaché et même si l'objet a été détruit, il reste en mémoire, et ce même si tu changes de page, ce qui peut provoquer de grosses fuites de mémoire si tu as beaucoup d'evènements.

    Pour ma part, j'utilise tant que possible les evenements onXXX, et les gestionnaire DOM-2 seulement quand je ne peux pas faire autrement. L'avantage du onXXX, c'est que pour détacher un évenement, t'as juste à le mettre à null (ex : madiv.onclick = null), donc c'est extrêmement simple.
    Pour détacher un evenement DOM-2, il te faut passer la même référence de la fonction qui a servi a créer ton listener, et ca, c'est pas toujours évident, d'où de plus gros risques de memory leak...

    Edit: je viens de regarder avec IE, sous Netvibes j'ai pas vu de memory leaks, mais me semble que je l'avais déja fait ya quelques mois, j'en avais vu quelques unes, donc ils ont du corriger le tir.
    Par contre, pour gmail, j'en trouve 126...

  19. #19
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2003
    Messages : 353
    Points : 361
    Points
    361
    Par défaut
    Merci pour toutes ces réponses !

  20. #20
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    DoubleU , de plus sous ie7 elles ont étés corrigés

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Prototype] Réaffecter un Event.observe
    Par vence dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 26/05/2008, 11h17
  2. Event.observe sur IE
    Par moumoune65 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/07/2007, 11h45
  3. [Prototype] Appel Event observe
    Par sorenson2 dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 17/07/2007, 12h02
  4. event.observe ne fonctionne pas sous IE
    Par mikees dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/06/2007, 18h48
  5. Réponses: 8
    Dernier message: 11/04/2006, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo