2011-05-30 3 views
3

Je développe une application avec phonegap. sur mon PC tout fonctionne bien mais sur mon appareil mobile c'est juste trop lent.comment rendre le code suivant plus vite?

Je pense que le problème est sur la fonction show, le navigateur Android semble vraiment besoin de long pour afficher et masquer les éléments

ce qui peut être amélioré?

function show(id){ 
    $('.view').hide() 
    //alert('show ' + id) 
    $('#'+id+'View').show() 
    scroll(0,0) 
} 


function getSoundHTML(id, myname, del){ 

    if (del != true){ 
     var imgsrc = 'plus.png' 
     var f = function(){ 
      addToCostumSounds(id) 
      alert('added to favorites') 
     } 
    }else{ 
     var imgsrc = 'minus.png' 
     var f = function(){ 
      removeFromCostumSounds(id); 
      $(this).fadeOut().next('div').fadeOut(); 
     } 
    } 

    var div = $('<div></div>').addClass('box').html(myname).css('border-color', '999999').click(function(){ 
     play(id) 
    }) 
    var img = $('<img></img>').attr('src', imgsrc).addClass('sideimg').click(f) 

    return $('<div></div>').append(img).append(div) 
} 

for(var category in categories){ 

    var f = function(category){ 
     $('#'+category+'Btn').click(function(){ 
       show(category) 

       var categoryView = $('#'+category+'View') 
       for(var key in categories[category]){ 
        var div = getSoundHTML(key, categories[category][key]) 
        categoryView.prepend(div) 
       } 
       var img = '<img src="menu.png" class="menuimg"/>' 
       categoryView.prepend(img) 
       categoryView.append(img) 
     }) 
    } 
    f(category) 
} 

le code html:

<div class="btn" id="noBtn">no _</div> 
    <div class="btn" id="thatIsBtn">that is _</div> 
    <div class="btn" id="thereIsBtn">there is _</div> 
    <div class="btn" id="thisIsBtn">this is _</div> 
    ... 


<div class="view" id="noView"></div> 
<div class="view" id="thatIsView"></div> 
<div class="view" id="thereIsView"></div> 
<div class="view" id="thisIsView"></div> 
... 
+0

Utiliser le JavaScript natif? –

+2

Vous pouvez essayer d'exécuter votre code à l'aide de JSLint (http://www.jslint.com/) pour le résoudre en premier. – isNaN1247

+0

Après avoir lu ceci une seconde fois: y a-t-il une raison pour que vous définissiez et utilisiez la fonction 'f' au même endroit? Cela semble redondant. –

Répondre

0

ok, je pense que je suis la seule façon d'améliorer la peroformance: si quelqu'un clique sur un bouton (class = « btn »), il est redirigé vers une nouvelle page nouvelle qui a toute la page en HTML et ne le construit pas avec javascript.

2

Bien qu'il ne peut pas avoir un effet sur les ordinateurs, votre manque massif de points-virgules dans les bons endroits peut avoir un effet sur les appareils mobiles.

Le moteur JavaScript doit fonctionner et essayer de déterminer où les points-virgules doivent être placés. Voir this transcript from the ECMAScript specification.

Pour être honnête, je pense que ce n'est que quelques millisecondes de gain de temps, mais c'est un point de départ pour l'instant - et de bonnes pratiques pour l'avenir.

+0

Je pense que l'analyseur JS est beaucoup plus simple à cet égard: 1 instruction sur 1 ligne = pas de problème, 2 déclarations sur 1 ligne sans séparation; = bug (FF 4.01 est d'accord avec moi là-dessus). Donc, ajouter ou supprimer des points-virgules dans le code ne devrait faire absolument aucune différence pour l'analyseur lui-même, pour autant que je puisse voir (en fait, un symbole de moins à lire qui est complètement sans importance). – Voo

+0

@Voo - ma réponse est basée sur les commentaires de Douglas Crockford dans son discours sur The Good Parts. De plus, j'ai maintenant lié à la spécification sur cette zone. – isNaN1247

+0

Je doute des points-virgules sont le problème. Les points-virgules sont également [facultatif] (http://mislav.uniqpath.com/2010/05/semicolons/) et je doute que l'insertion d'un point-virgule soit suffisante pour provoquer les blocages décrits par l'OP. –

1

Voici votre problème:

for(var category in categories){ 

    var f = function(category){ 
     ... 
     for(var key in categories[category]) 
     ... 
    } 

    f(category) 
} 

Vous avez deux questions BIG ici:

  1. vous définissez une fonction dans une boucle. Bien que cela soit parfois nécessaire, vous devriez faire de votre mieux pour éviter de définir des choses dans une boucle, sauf si vous en avez absolument besoin. Dans ce cas, vous pouvez probablement déplacer complètement la fonction f de la boucle sans casser votre code.
  2. Boucles imbriquées. Vous avez un for ... in dans une boucle for ... in. C'est en grande partie dû au premier problème que j'ai signalé, mais en général les boucles imbriquées sont un grand non-non du point de vue des performances.
+0

merci, j'ai déplacé la définition de la fonction loin de la boucle. mais je ne pouvais pas remarquer toute différence. et il n'y a pas de boucle dans une boucle. la deuxième boucle est définie dans une fonction qui est juste appelée par un clic – nomoral

+0

peut-être que je devrais utiliser plus de HTML statique au lieu de le construire avec javascript? – nomoral

+0

@nomoral: vous avez raison monsieur, bien que je reste fidèle à mes commentaires sur les boucles 'for ... in' imbriquées dans presque toutes les circonstances. –