包装您包含在内联的脚本
jQuery(函数(){ ... });
当 DOM 准备好并且脚本已下载时将执行。
另一种选择可能是创建某种自定义模板标签,例如:
{% inlinescript %}
// some javascript code.
{% endinlinescript %}
随着执行的进行,您可以使用它来聚合内联脚本。当模板被解析时,您需要聚合这些数据——这会变得很棘手,因为模板标签具有不同的上下文,而这是您希望将其存储在自定义变量中的全局上下文中,例如inline_scripts
.
我将看看 Djangowith ... as ..
在默认模板库中实现各种构造的方式,以了解如何将您自己的变量添加到上下文中。
然后在页面底部,您可以执行 {{ inline_scripts }}。
最简单的解决方案是jQuery.ready(function(){}) / jQuery(function(){ })
(这两种方法是同义词)。
或者你可能想重新考虑雅虎的建议。内联 javascript 有一些积极的方面 - 它可以减少 FOUC / FOUBC(不行为内容的 Flash)。雅虎往往有点迂腐——(看看 YUI API ;)。如果您需要重写应用程序的某些部分以获得适度可察觉的性能改进,那可能不值得。
要进行脚本聚合(最初基于 django-snippets 上的捕获):
@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 ''
用法:
{% 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 }}