如何使自定义标签中的代码块仅在第一次调用该标签时运行?

Posted

技术标签:

【中文标题】如何使自定义标签中的代码块仅在第一次调用该标签时运行?【英文标题】:How can I make a block of code in a custom tag only run the first time the tag is called? 【发布时间】:2010-10-18 09:52:43 【问题描述】:

我正在创建一组 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 文件每页只应包含 一次。在第一次使用这些自定义标签中的一个之后,我希望后续调用同一页面上的同一标签以避免重复

<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>

【问题讨论】:

【参考方案1】:

使用请求范围。

【讨论】:

好的,我想我的做法已经尽善尽美,尽管使用 Request 而不是 Caller 是有意义的。我想我希望有一个 之类的东西。【参考方案2】:

您的解决方案并不遥远。

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

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

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

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

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

【讨论】:

【参考方案3】:

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

此代码将起作用:

<cfif thisTag.ExecutionMode eq "start">

【讨论】:

我知道。这不是我所指的。这就是我想要的:Script tag incl here,但不在这里也不在这里。褪色框>。看到了吗? 啊,我明白你的意思了。我认为您实施它的方式没有任何问题。我可能会使用请求范围而不是调用方范围,但这比任何东西都更偏好。 +1 表示请求范围。我会将变量命名为 __include_[sanitized_file_name]。 我们开始了:我添加了“请求范围”答案,因此人们可以实际上投票支持它。 :) 另外,我会使用 Request.CustomTagData.Layout.FadingBox 之类的东西,而不是做那些丑陋的下划线。

以上是关于如何使自定义标签中的代码块仅在第一次调用该标签时运行?的主要内容,如果未能解决你的问题,请参考以下文章

Swift presentViewController 完成块仅在调试中工作而不在发布中调用

如何使自定义 UIView 可访问?

如何仅在标签中的特定单词上显示工具提示?

如何仅在钻取饼上显示数据标签?

Jquery轮播滑块仅在悬停时循环并在鼠标离开时停止?

如何通过预处理主题功能将树枝文件中的块限制为内容类型中的某些页面?