Наиболее эффективным решением вашей проблемы, вероятно, будет в том числе динамического контента встраиваемого в самом документе.
Когда вы копируете функцию test(arg)
в Javascript-файл, я полагаю, вы также копируете #genstr#
? Таким образом, он выглядит в файле js точно так же, как и у вас выше?
Это изделие так, как планировалось. .js не обрабатывают холодный синтез, и если вы посмотрите на консоль разработчика, вероятно, вы получите синтаксическую ошибку.
Вы можете либо сохранить его в строке документа, либо изменить расширение файла js на .cfm.
На данный момент ваш файл js_main.cfm
(пример) будет обрабатываться, как и любой другой файл, запрашиваемый обозревателем, и он упадет с верхних и нижних колонтитулов, если ваша обработка запросов сделает это, поэтому это вызовет больше ошибок. Вам необходимо защитить эти файлы от этого. Вы можете сделать это с некоторыми cfifs в файле приложения, как
<!--- This checks the path to make sure it doesn't contain livemedia. --->
<cfif not listfind(cgi.script_name,"livemedia","/")>
... do includes
</cfif>
Или вы можете сделать, как я бы, вероятно, и заблокировать эти файлы в папке только для сервировки JS, CSS файлы с расширением кубометра в минуту с их собственным приложением .cfc/cfm, чтобы переопределить глобальный файл сайта, если я столкнулся с ситуацией, когда я почувствовал, что динамически связанный js/css был действительно лучшим вариантом.
Затем вы можете сделать так, как показано в OP и релейных переменных на стороне клиента, если вам действительно нужно. В качестве альтернативы вы можете назвать два «приложения» одинаковыми, и, хотя это делает обмен данными очень простым, я должен все же посоветовать вам внимательно следить за тем, что вы сообщаете, и вы открываете и гарантируете надлежащую защиту подзадачи.
И да, как предложили другие, #SerializeJSON()#
- это современный подход к копированию серверной переменной/объекта на клиентскую сторону.
Например ..
<cfset CFStruct = {big = "little", red = "blue", subArray = ["A","B","C","D"]} />
<script>
<cfoutput>JSObj = #SerializeJSON(CFStruct)#;</cfoutput>
</script>
<!--- While I use shorthand to form the struct and subArray, that's only for speed,
structs, arrays, queries, etc formed in any fashion work just fine. --->
Создает JSObj
с элементами big, red, subArray
(который имеет дочерние элементы A, B, C, D
).
Тем не менее, независимо от того, какой метод вы выберете (wddx
или SerializeJSON()
), они не будут работать в .js-файле.
Я должен упомянуть, что существует другая возможность разрешить серверу анализировать файлы .js, но это будет намного больнее, чем того стоит. Многим случаям, когда вы используете простой файл js, будет мешать.
Обратите внимание, что ваши файлы называются с помощью боковых тегов клиента как <script>
и <link>
являются полностью Seperate запросы. Они не будут использовать области url, form, request, variables
. Однако они могут совместно использовать области cookies
и client
и session
, если оба приложения имеют одинаковое имя.
И, наконец, замечательная вещь о внешнем контенте, который вызывается через теги html, независимо от расширения, заключается в том, что он обычно кэшируется по умолчанию. Это замечательно для полосы пропускания и даже для быстрой загрузки страниц, пока не появится сценарий, в котором вы хотите последовательно загрузить не кешированную копию.
По этой причине, когда вы чувствуете, что вам нужно динамически генерировать то, что вы хотите придерживаться во внешнем файле, у вас есть несколько методов.
- Вы можете установить no-cache в заголовке (CF или Htaccess могут это сделать).
- Вы можете предоставить случайное число в строке запроса вызова скрипта.
<script src="/livemedia/js_main.cfm?randomizer=#randrange(1,1000000)#"></script>
- Возможно, файл не нуждается в обновлении каждый раз для каждого пользователя, возможно, просто для того, чтобы каждый пользователь должен видеть другую копию. Вы все равно присоединяете строку запроса, потому что несколько пользователей могут входить с одного компьютера. Это, однако, было бы специфичным для пользователя.
<script src="/livemedia/js_main.cfm?#session.username#"></script>
- Пересмотреть, как ваша страница компилирует и хранит данные, которые должны быть встроены в страницу на странице.
Если вы прикрепляете что-то к строке запроса файла javascript, вы должны перенести статическое содержимое файла в отдельный файл, который не нуждается в регенерации каждый раз. Нет необходимости перезагружать 15 функций javascript с каждым запросом страницы, потому что 1 содержит динамический контент.
Если вы хотите отправить данные javascript, JSON может быть лучшим решением, потому что оно более широко поддерживается, чем WDDX –