2010-05-04 2 views
2

Je suis curieux de savoir ce que pensent les gens de cette situation. La raison pour laquelle je voudrais charger javascript paresseux est en raison de la performance. Le chargement de javascript à la fin du corps réduit le blocage du navigateur et aboutit à des chargements de pages beaucoup plus rapides.div divisés pour "javascript paresseux" loading? Sécurité possible/autres problèmes?

Mais il y a une certaine automation que j'utilise pour générer le html (django spécifiquement). Cette automatisation a la commodité de permettre la construction de formulaires avec des "Widgets" qui produisent le contenu dont ils ont besoin pour rendre le widget entier (extra javascript, css, ...). Le problème est que le widget veut sortir javascript immédiatement au milieu du document, mais je veux assurer toutes les charges javascript à la fin du corps.

Lorsque le widget suivant est ajouté à un formulaire, vous pouvez le voir rend quelques <script>...</script> tags:

class AutoCompleteTagInput(forms.TextInput): 
    class Media:              
     css = { 
      'all': ('css/jquery.autocomplete.css',) 
     }            
     js = (
      'js/jquery.bgiframe.js', 
      'js/jquery.ajaxQueue.js',        
      'js/jquery.autocomplete.js', 
     )  

    def render(self, name, value, attrs=None):   
     output = super(AutoCompleteTagInput, self).render(name, value, attrs) 
     page_tags = Tag.objects.usage_for_model(DataSet) 
     tag_list = simplejson.dumps([tag.name for tag in page_tags], 
            ensure_ascii=False) 
     return mark_safe(u'''<script type="text/javascript">     
      jQuery("#id_%s").autocomplete(%s, { 
       width: 150,           
       max: 10, 
       highlight: false, 
       scroll: true, 
       scrollHeight: 100, 
       matchContains: true, 
       autoFill: true    
     });        
     </script>''' % (name, tag_list,)) + output 

Ce que je propose est que si quelqu'un utilise un <div class=".lazy-js">...</div> avec quelques css (.lazy-js { display: none; }) et quelques-uns javascript (jQuery('.lazy-js').each(function(index) { eval(jQuery(this).text()); }), vous pouvez forcer efficacement tous javascript pour charger à la fin de chargement de la page:

class AutoCompleteTagInput(forms.TextInput): 
    class Media:              
     css = { 
      'all': ('css/jquery.autocomplete.css',) 
     }            
     js = (
      'js/jquery.bgiframe.js', 
      'js/jquery.ajaxQueue.js',        
      'js/jquery.autocomplete.js', 
     )  

    def render(self, name, value, attrs=None):   
     output = super(AutoCompleteTagInput, self).render(name, value, attrs) 
     page_tags = Tag.objects.usage_for_model(DataSet) 
     tag_list = simplejson.dumps([tag.name for tag in page_tags], 
            ensure_ascii=False) 
     return mark_safe(u'''<div class="lazy-js">     
      jQuery("#id_%s").autocomplete(%s, { 
       width: 150,           
       max: 10, 
       highlight: false, 
       scroll: true, 
       scrollHeight: 100, 
       matchContains: true, 
       autoFill: true    
     });        
     </div>''' % (name, tag_list,)) + output 

tous les détails de Nevermind de ma mise en œuvre spécifique (les médias spécifiques impliqués), je Je suis à la recherche d'un consensus sur la question de savoir si la méthode d'utilisation de javascript par chargement paresseux par le biais d'une balise cachée peut poser des problèmes de sécurité ou d'autres connexes? L'une des parties les plus pratiques à ce sujet est qu'il suit plutôt bien le principe DRY car il n'est pas nécessaire de hacker une charge paresseuse spécifique pour chaque instance de la page. Cela "fonctionne" simplement.

MISE À JOUR: Je ne sais pas si django doit être sortie juste avant la fin de la </body> la capacité de la file d'attente des choses (par héritage de modèle de fantaisie ou quelque chose?)?

+0

Qu'est-ce qu'un chargement paresseux? –

+0

Le '

...
' est chargé paresseusement à la fin du chargement de la page dans un 'eval (...) ' – dlamotte

+0

Bien que je n'ai aucune idée de tout cela, si votre question a transformé en une question Django, vous voudrez peut-être faire une nouvelle question. @ Austin Cheney, le chargement paresseux est comme moi pointant vers un lien sur lequel vous cliquez quand vous en avez besoin plutôt que d'écrire une réponse ici, comme ceci: http://en.wikipedia.org/wiki/Lazy_loading –

Répondre

1

Je préférerais un outil qui me permet de « append » contenu dans le flux de sortie (ou ) ajouter à un tampon, qui sera émis à la fin de la page, juste avant la balise </body>.

Je ne sais pas quels outils commerciaux supportent cela (ou django?) Mais c'est comme ça que j'ai construit mes frameworks. En ce qui concerne votre sécurité/autres problèmes ... le script traitera chaque fois qu'il est lu (sauf si vous produisez une balise de script avec l'attribut defer (dans les navigateurs IE/plus récents)), sauf si elle est déplacée physiquement, cela ne change pas le comportement ou le rend "paresseux".

En ce qui concerne la sécurité, extraire le contenu de l'étiquette de script et appeler le eval() ouvre la possibilité d'exécuter quelque chose que vous n'aviez pas prévu. (peu probable, mais possible)

+0

Donc le framework que vous utilisez vous permet de mettre en file d'attente des choses à la fin du corps tout en écrivant le document html principal? – dlamotte

+0

Votre ligne "Security wise" est exactement le type d'information que je cherchais. – dlamotte

+0

Correct. Je peux ajouter au buffer 'body' ... ou un buffer' footer' ... Donc si pendant le traitement "page" je veux inclure un script, je l'ajoute juste à mon "footer" ... juste avant le est rendu, je prends n'importe quoi dans le tampon 'footer' et je le sort. – scunliffe

0

The problem is that the widget wants to output javascript immediately into the middle of the document, but I want to ensure all javascript loads at the end of the body.

Je ne voudrais pas utiliser ce widget. Le script côté client fourni de manière dynamique par le client est un désastre qui va rompre la sécurité sans que vous ou votre utilisateur soyez plus sage. Comment sauriez-vous si ce code a été compromis, par exemple?

+0

Voulez-vous dire que le seul trou est quand javascript côté client (évidemment en dehors de mon contrôle) est introduit? Je suppose, si c'est le seul trou, alors je suis d'accord. Peut-être qu'il n'y a pas de problèmes de sécurité? Je suis si novice en matière de programmation Web que je veux m'assurer que je ne suis pas en train d'ouvrir des trous que je ne connais pas. – dlamotte

+0

Vous pourriez être d'accord avec cela seulement parce que c'est invisible pour vous. Vos clients, cependant, ne seraient pas si bien s'ils étaient au courant de vos pratiques bâclées permettant aux pirates d'effectuer le vol d'identité. Si c'était pour une entreprise et que vous étiez conscient des risques lors de l'écriture du code, vos utilisateurs vous poursuivraient probablement pour récupérer les dommages subis. En moyenne, cela représentait 11,3 millions de dollars par incident en 2008, selon le volume XIV du Symantec Internet Security Threat Report. Que voulez-vous parier que ce chiffre est probablement plus élevé maintenant? –