4

我正在创建一组 ColdFusion 自定义标签,旨在使某些布局元素的重用变得容易。我将以类似于以下方式使用它们:

<cfimport prefix="layout" taglib="commonfunctions/layouttags">

<layout:fadingbox>
    This text will fade in and out
</layout:fadingbox>
<layout:stockticker>
    This text will scroll across the screen
</layout>

为了使这些自定义标记生成的代码能够正常工作,需要将 JavaScript 文件链接到页面,如下所示:

<script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>

我更愿意在自定义标签中包含脚本,而不是让用户自己包含它。问题是 JavaScript 文件每页只应包含一次。在第一次使用这些自定义标签中的一个之后,我希望后续调用同一页面上的同一标签以避免重复 <script> 标签。我突然想到我可以做这样的事情:

<cfif NOT isDefined("Caller.LayoutTagInitialized")>
    <script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>
</cfif>
<cfset Caller.LayoutTagInitialized = 1>

...但它似乎不优雅。

我想知道,有没有更好的方法?

你将如何实现这一点?

编辑 - 澄清:

如果我上面写的没有意义,这里有一个更详细的例子:

如果我有这样的自定义标签:

<cfif ThisTag.ExecutionMode EQ "start">
    <script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>
    <div class="mytag">
<cfelse>
    </div>
</cfif>

...我有 CFML 标记像这样调用标签:

<layout:mytag>
    One
</layout:mytag>
<layout:mytag>
    Two
</layout:mytag>
<layout:mytag>
    Three
</layout:mytag>

...我希望生成如下 HTML:

<!-- Script included only the first time the tag is called -->
<script src="commonfunctions/layouttags/enablingscript.js" type="text/javascript"></script>
<div class="mytag">
    One
</div>
<!-- No <script> tag on the second call -->
<div class="mytag">
    Two
</div>
<!-- No <script> tag on the third call -->
<div class="mytag">
    Three
</div>
4

3 回答 3

6

使用请求范围。

于 2009-04-08T21:42:29.653 回答
1

自定义标签有一个名为 thistag 的内置范围。

此代码将起作用:

<cfif thisTag.ExecutionMode eq "start">
于 2009-04-08T20:19:31.523 回答
1

您的解决方案并不遥远。

萨姆说得对,当您希望在标签的开始或结束模式中出现某些内容时,您想要使用执行模式,这是您想要的一部分。

但是然后您说您希望该脚本标记仅在页面上使用的第一个标记的启动模式下输出。

这就是您将使用彼得对请求范围的建议的地方。与默认(或“变量”)范围不同,请求范围在给定请求的所有自定义标记之间共享。您建议使用调用者范围,这也可以工作,除非调用者是另一个自定义标签,在这种情况下,调用者范围将只是自定义标签中的本地范围。请求范围(自 CF 4.01 以来一直存在)是您的最佳选择。

在这种情况下,您提出的解决方案很接近:在自定义标记中,在启动模式下,当您第一次放出脚本标记时,以编程方式检查您是否已经在请求范围内创建了跟踪变量。如果没有,则取出脚本标签并创建跟踪变量。

除了将代码从使用调用者更改为请求之外,我还建议您将 CFSET 放在 IF 中。当 IF 测试失败时无需再次执行。

于 2009-04-14T20:43:46.800 回答