Я создаю набор пользовательских тегов 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>