Envelopper les scripts que vous incluez en ligne dans
jQuery (function() {...});
Qui s'exécutera lorsque le DOM est prêt et que les scripts ont été téléchargés.
Une autre option pourrait être de créer une sorte de balise de modèle personnalisé comme:
{% inlinescript %}
// some javascript code.
{% endinlinescript %}
que vous pourriez utiliser pour agréger des scripts inline comme produit d'exécution. Vous aurez besoin d'agréger ces données lorsque votre modèle sera analysé - ce qui devient délicat car les balises de gabarit ont des contextes différents et c'est quelque chose que vous voudriez stocker dans un contexte global dans une variable personnalisée, par exemple inline_scripts
. Je regarderais la façon dont Django implémente les différentes constructions with ... as ..
dans la bibliothèque de modèles par défaut pour un exemple de comment ajouter votre propre variable à un contexte.
Ensuite, au bas de votre page, vous pouvez faire {{inline_scripts}}.
La solution la plus simple est le jQuery.ready(function(){})/jQuery(function(){ })
(Les deux méthodes sont synonymes).
Ou vous pourriez vouloir reconsidérer le conseil de Yahoo. Il y a des choses positives à propos de l'insertion de votre javascript - cela peut réduire FOUC/FOUBC (Flash du contenu non-géré). Yahoo a tendance à avoir une sorte de pédantisme - (il suffit de regarder l'API YUI;). Si vous avez besoin de réécrire des parties de votre application pour une amélioration des performances moyennement perceptible, cela pourrait ne pas valoir le coup.
Pour faire l'agrégation script (captureas initialement basé hors sur django-extraits):
@register.tag(name='aggregate')
def do_aggregate(parser, token):
try:
tag_name, args = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("'aggregate' node requires a variable name.")
nodelist = parser.parse(('endaggregate',))
parser.delete_first_token()
return AggregateNode(nodelist, args)
class AggregateNode(Node):
def __init__(self, nodelist, varname):
self.nodelist = nodelist
self.varname = varname
def render(self, context):
output = self.nodelist.render(context)
if context.has_key(self.varname):
context[self.varname] += output
else:
context[self.varname] = output
return ''
Utilisation:
{% aggregate inline_scripts %}
var foo = 'bar';
{% endaggregate %}
... template code
{% aggregate inline_scripts %}
var baz = 'bar';
{% endaggregate %}
... somewhere near the bottom of your page
{{ inline_scripts }}
C'est un modèle que j'ai commencé à adopter dans mes derniers projets, Ken. Merci pour votre réponse; Je le marque comme la réponse acceptée parce que c'est simple et cela fonctionne. Malheureusement, cela ne résout toujours pas le problème avec l'intégration de scripts dans templatetags, mais il semble qu'il n'y ait aucun moyen possible de faire cela de la façon dont les choses sont construites en ce moment. – isolationism
Cette méthode échoue si vous avez Javascript dans les modèles partiels appelés en utilisant la balise de modèle 'include'. Ces fichiers d'inclusion ne peuvent en aucun cas ajouter leur code HTML à l'un des blocs du modèle principal. – LS55321