Как я могу включить внешний файл JavaScript, который содержит код Coldfusion? - PullRequest
7 голосов
/ 28 февраля 2011

У меня есть несколько файлов Coldfusion, в которых используется один и тот же точный код JavaScript. Я хочу разделить javascript на файл .js и включить его в каждый из файлов, чтобы мне не приходилось повторять все несколько раз. Итак, я разделил код javascript на файл с именем «myPage.js», а в «myPage.cfm» я включил тег сценария -

<script language="javascript" src="myPage.js"></script>

Проблема в том, что в javascript есть какой-то код Coldfusion, который вводит значения с использованием <cfoutput> s и тому подобное, и это больше не переводится правильно, вероятно, потому что он пытается прочитать его как чистый javascript. Можно ли каким-то образом получить внешний файл js, но указать, что я хочу, чтобы он также использовал coldfusion для его интерпретации?

Один из найденных обходных путей - поместить javascript в файл coldfusion вместо файла javascript, который называется «myPageJavascript.cfm», окружить весь код javascript тегом <script type="text/javascript">, а затем использовать cfinclude для включите этот JavaScript на всех страницах. Это прекрасно работает, но не кажется мне таким интуитивным, как включение файла js ... Какова стандартная практика для подобных ситуаций? Есть ли способ реализовать это как внешний файл js, или я должен просто придерживаться моего файла шаблона coldfusion?

Ответы [ 5 ]

8 голосов
/ 28 февраля 2011

Другие ответы более элегантны и эффективны, но самый простой выход - это изменить расширение файла с .js на .cfm следующим образом:

<script language="javascript" src="myPage.cfm?id=#createUuid()#"></script>

createUuid() предназначен для предотвращения кэширования, предполагая, что вывод файла будет отличаться, скорее всего, в зависимости от переменных из области действия session. Клиент загружает это как JavaScript, в то время как сервер обрабатывает это как ColdFusion. То же самое можно сделать и с таблицами стилей.

Теперь, если ваш JavaScript зависит от значений с вызывающей страницы, вы можете передать их по URL:

<script language="javascript" src="myPage.cfm?name1=value1&name2=value2"></script>

В этой ситуации вы на самом деле можете использовать преимущества кэширования при передаче одинаковых параметров URL.

В целом, этот подход может потребовать гораздо меньше усилий, чем рефакторинг кода, чтобы сохранить файл .js в «чистом виде», при этом выводя переменные, от которых он зависит, заранее в блоке <script/>.

6 голосов
/ 28 февраля 2011

Я бы посоветовал вам создать блок сценария до включения js, который содержит все переменные, которые будут использоваться внутри включаемого файла js. В вашем случае переместите переменную cfoutput, которую вы поместили в js-файл, в основной файл

    <script type='text/javascript'>
    var sourceName = <cfoutput>#Application.name#</cfoutput>
    </script>

    <script src="js/myPage.js" type="text/javascript"/>

В файле myPage.js вы можете использовать переменную sourceName, которая имеет действительное значение из переменной coldfusion. таким образом, помогая вам отделить код Coldfusion и JS-код.

Если вам нужно переместить много переменных, рассмотрите возможность создания переменной типа объекта и добавьте в нее все эти переменные.

ПРИМЕЧАНИЕ. Добавление js с тегом script поможет ему кешировать и повысить производительность страницы. Так что не загружайте файл js как файл cfm

3 голосов
/ 28 февраля 2011

Было бы более эффективно, если бы вы переместили код ColdFusion туда, откуда вы его взяли, где вы бы использовали его для установки некоторых переменных JavaScript и оставили только чистый JavaScript, который затем использовал бы эти переменные во внешних файлах JavaScript. Это были бы самые простые решения. Что-то более продвинутое - определить функции во внешних файлах JavaScript, которые будут вызываться из ваших тегов сценария в HTML-коде, созданном ColdFusion.

1 голос
/ 02 марта 2011

Сначала мне понравилось то, что @ Orangepips ответил на @ Anooj's, - это простота будущего обслуживания, а не отдельный блок Javascript каждый раз, когда вы включаете <script> в свои ОВЛХ.

Однако, после нескольких минут размышлений об этом, это легко устранить, объединив два ответа. Это дает вам модульность для простоты сегодняшней разработки и будущего обслуживания, которое вы ищете - PLUS как лучший метод дает вам изоляцию и кэширование статического Javascript, чтобы уменьшить размер запроса CF-страницы и скорость ответа.

По сути, вы должны создать фасад на основе CF, который вы будете включать или вызывать каждый раз, когда вам нужна функциональность Javascript. В моем примере я сделал фасад вызываемой функцией, в которую можно передавать параметры JS (как намекало @Orangepips), чтобы жестко контролировать, какие переменные передаются в JS.

(Кроме того, я рекомендую помещать все встроенные JS в переменные, а затем помещать их в CFHEADER, чтобы убедиться, что это в заголовке страницы.)

dosomething.js

<script type='text/javascript'>
    <!-- assert vars were passed in -->
    if ( source == undefined )
         alert("Developer error: source not defined.");
         return;
    }
    if ( urlpath == undefined )
         alert("Developer error: urlpath not defined.");
         return;
    }

    <!-- do some js stuff --->
    alert('source: ' + source + ", urlpath: " + urlpath );
</script>

udf.cfm:

<cffunction name="doSomething" output="true" returntype="void">
    <cfargument name="source" required="true" /> 
    <cfargument name="urlpath" required="true" /> 

    <cfsavecontent variable="header">
    <script type="text/javascript">
        <!-- var init -->
        <cfoutput>
            var source = '#arguments.source#';
            var urlpath = '#arguments.urlpath#';
        </cfoutput>
    </script>
    <script language="JavaScript" type="text/javascript" src="dosomething.js"></script>
    </cfsavecontent>
    <cfhtmlhead text="#header#">
</cffunction>

application.cfm

<cfinclude template="udf.cfm">

view1.cfm:

<cfoutput>#doSomething("view 1", "http://myurl/view1")#</cfoutput>

view2.cfm:

<cfoutput>#doSomething("view 2", "http://myurl/view2")#</cfoutput>

Любые будущие изменения становятся проще благодаря выделению кода (JS отделен от фасада, определяющего JS-var, отделен от отдельных представлений, вызывающих его). Например. добавив переменную, вы можете сделать ее обратно совместимой, чтобы все существующие представления продолжали работать.

Изменения udf.cfm:

<cfargument name="newVar" required="false" default="" /> 
<cfif len(arguments.newVar)>
var newVar = "#arguments.newVar#";
</cfif>

Изменения dosomething.js:

// keep JS backwards compatible
if ( newVar != undefined) {
    // new var was passed in, do something with it
}
// else, not passed in 
0 голосов
/ 19 июня 2019

Чтобы определить, что пришло с сервера, и чтобы функция CF toScript правильно отображала переменные, включая структуры и массивы, я использую этот метод:

<script>
    var cf = {};
    <cfscript>
        writeOutput(toScript(application.applicationname,'cf.app'));
        writeOutput(toScript(cgi.remote_addr,'cf.url'));
    </cfscript>
</script>

отображает:

<script>
    var cf = {};
    cf.app="Lucee";cf.url="149.79.80.135";
</script>

и теперь в вашем внешнем .js вы просто используете cf.app, cf.url ... и т. Д.

Иногда бывает очень удобно передавать структуру URL в get или структуру FORM в сообщении.

...