Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何包含包含coldfusion代码的外部javascript文件?_Javascript_Coldfusion_Script Tag - Fatal编程技术网

如何包含包含coldfusion代码的外部javascript文件?

如何包含包含coldfusion代码的外部javascript文件?,javascript,coldfusion,script-tag,Javascript,Coldfusion,Script Tag,我有几个coldfusion文件使用相同的javascript代码。我想将javascript分离成一个.js文件,并将其包含在每个文件中,这样我就不必重复多次。因此,我将javascript代码分离到一个名为“myPage.js”的文件中,并在“myPage.cfm”中包含一个脚本标记- <script language="javascript" src="myPage.js"></script> 问题在于,javascript中散布着一些coldfusion代码

我有几个coldfusion文件使用相同的javascript代码。我想将javascript分离成一个.js文件,并将其包含在每个文件中,这样我就不必重复多次。因此,我将javascript代码分离到一个名为“myPage.js”的文件中,并在“myPage.cfm”中包含一个脚本标记-

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

问题在于,javascript中散布着一些coldfusion代码,这些代码使用
s等注入值,而这些代码不再被正确翻译,可能是因为它试图将其作为纯javascript读取。是否有任何方法可以拥有一个外部js文件,但表明我希望它也使用coldfusion来解释它


我发现的一种解决方法是将javascript放入coldfusion文件而不是名为“myPageJavascript.cfm”的javascript文件中,将所有javascript代码包围在
标记中,然后使用cfinclude将该javascript包含在所有页面中。这很好,但在我看来,它不像包含js文件那样直观。。。这种情况下的标准做法是什么?有没有办法将其实现为一个外部js文件,或者我应该坚持使用我的coldfusion模板文件?

如果您将coldfusion代码移回获取它的位置,在那里您可以使用它来设置一些JavaScript变量,只留下纯JavaScript,然后在外部JavaScript文件中使用这些变量。这将是最简单的解决办法。更高级的是在外部JavaScript文件中定义函数,这些函数将从ColdFusion生成的HTML中的脚本标记中调用。

我建议您在js include之前创建一个脚本块,其中包含include js文件中要使用的所有变量。在您的情况下,将放入js文件中的cfoutput变量移动到主文件中

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

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

var sourceName=#Application.name#
在myPage.js文件中,可以使用变量sourceName,该变量具有coldfusion变量的实际值。这样就可以帮助您分离coldfusion代码和js代码

如果有很多变量要移出,请考虑创建对象类型变量,并在其中添加所有变量。


注意:添加带有脚本标记的js将有助于缓存和提高页面性能。因此,不要将js文件作为cfm文件加载

其他答案更优雅、更高效,但简单的解决方法是将文件扩展名从
.js
更改为
.cfm
,如下所示:

<script language="javascript" src="myPage.cfm?id=#createUuid()#"></script>
在这种情况下,当传递相同的URL参数时,实际上可以利用缓存


总的来说,这种方法比重构代码来保持
.js
文件的“纯净”要省力得多,同时在
块中预先输出它所依赖的变量

一开始我喜欢@Orangepips的答案,而不是@Anooj的答案,这是因为在以后的维护中,每次在CFM中包含
时,都需要单独的Javascript块

然而,经过几分钟的思考,结合这两个答案就可以很容易地消除这个问题。这为您提供了模块化,以便于今天的开发和将来的维护,并且作为一种最佳实践,您可以隔离和缓存静态Javascript,从而降低CF页面请求大小和响应速度

基本上,您应该创建一个基于CF的facade,在每次需要Javascript功能时都可以包含或调用它。在我的示例中,我将facade设置为一个可调用函数,您可以将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>

为了识别来自服务器的内容,并让CF函数toScript正确呈现变量,包括结构和数组,我使用以下方法:

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

var cf={};
writeOutput(toScript(application.applicationname,'cf.app');
writeOutput(toScript(cgi.remote_addr,'cf.url');
提交给:

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

var cf={};
cf.app=“Lucee”;cf.url=“149.79.80.135”;
现在在您的external.js中,您只需使用cf.app、cf.url。。。等等


有时在get上传递URL结构或在post上传递表单结构非常方便。

+1了解最正确的方法。也就是说,我相信客户端也会缓存一个.cfm或任何扩展名,从
标记的
src
属性引用的文件。这是我一直使用的方法,一段包含所有变量/数据并由coldfusion填充的代码,以及一个包含所有函数的单独js文件。考虑到答案的“纯度”,我同意(将.js文件保留为纯js)…但将js代码卸载到单独的文件中的目的是为了模块化(便于将来的维护)。在每次调用之前都需要一个带有var分配的JS块似乎不像orangepips的应答那样容易维护。初始开发意味着您必须将该JS块复制并粘贴到调用JS的每个文件中。将来的更改(如添加新变量)这意味着必须在每种情况下隔离和更改复制粘贴的块,而不是在单个CFM中进行单个更改。此外,我建议在.CFM:
@Sergii:with
中包含此标题。我同意这样做是正确的,但在这种情况下有什么好处?我假设客户将始终处理something引用自
标记本身,而不需要http头来做正确的事情。我现在记不清了,但我想我在接受这种基于CFML的scr时遇到了问题
<cfinclude template="udf.cfm">
<cfoutput>#doSomething("view 1", "http://myurl/view1")#</cfoutput>
<cfoutput>#doSomething("view 2", "http://myurl/view2")#</cfoutput>
<cfargument name="newVar" required="false" default="" /> 
<cfif len(arguments.newVar)>
var newVar = "#arguments.newVar#";
</cfif>
// keep JS backwards compatible
if ( newVar != undefined) {
    // new var was passed in, do something with it
}
// else, not passed in 
<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>