4

我试图让 Jinja2 宏输出到调用模板的不同部分。我想这样做的原因是因为有内联 Javascript 作为宏的一部分,但我希望所有 Javascript 都在模板的末尾。我基本上想做这样的事情

{% import 'tooltip.html' as tooltip %} 
<html>
  <body>
    {% block contents %}
    {% tooltip('mytool') %}
    {% endblock %}
    <script>
      {% block javascript %}
      {% endblock %}
    </script>
  </body>
</html>

并在宏文件中

{% macro tooltip(name) %}
  <div id='{{ name }}'>
    This is my tooltip
  </div>

  {% block javascript %}
  jQuery("#{{ name }}").click(function(){//do something});
  {% endblock %}
{% endmacro %}

所以最终的结果会是这样的

<html>
  <body>
    <div id='mytool'>
      This is my tooltip
    </div>
    <script>
      jQuery("#mytool").click(function(){//do something});
    </script>
  </body>
</html>

我想要我所有的 javascript 在我的模板的末尾,但宏似乎只是在那里返回。

是否有我遗漏的东西或者这超出了标准的 Jinja2 并且需要编写扩展程序?

谢谢

4

2 回答 2

4

我不确定在 Jinja 中是否可以按照您的要求进行操作。但我确实认为另一种方法可能会奏效并提供更简单的解决方案:

而不是像生成标记一样

<div id='mytool'>
  This is my tooltip
</div>

和一个相应的 jQuery 调用,每个工具提示的 ID 都硬编码,比如

<script>
  jQuery("#mytool").click(function(){});
</script>

对于页面上的每个工具提示,为每个工具提示赋予一个class属性,并使 jQuery 功能适用于所有具有class. 这样,每个页面都可以拥有相同的 jQuery 通用位,并且无论该特定页面上出现什么工具提示都可以正常工作。

更像是:

<div id="mytool" class="tooltip">
  This is my tooltip
</div>

加上一个更通用的 jQuery 调用:

<script>
  // This will add the onclick handler to any element
  // with a class of "tooltip"
  jQuery(".tooltip").click(function(){});
</script>

这个 jQuery 代码可以包含一次,在您的“基本”模板的底部,这样它就可以在每个页面上使用,您不必弄清楚如何从 Jinja 宏写入两个单独的块。

于 2010-11-22T17:52:12.647 回答
1

你能把它分成2个功能吗?比如,一个输出标记,一个输出javascript?这将是我看到的最简单的方法。这完全取决于您的用例,但我认为这也是“正确的方式”。

于 2012-08-08T02:46:19.523 回答