2010-02-11 68 views
16

什么是停止ColdFusion输出的空​​白区域的正确方法?White Space/Coldfusion

我知道有cfcontentcfsetting enableCFoutputOnly。什么是正确的方法来做到这一点?

+0

你试图解决什么问题?额外的空白空间本身并不会造成真正的伤害,至少不是我所知道的。 – Jay 2010-02-11 13:36:51

回答

1

如果没有<cfsilent><cfsetting enablecfoutputonly="yes">能满足你,那么你是可能过度设计这个问题。

当您完全出于美学原因而提出要求时,我的建议是:忽略空白,不会造成任何伤害。

+3

空白是比干净的代码更多的问题。 doctype之前的空格会导致验证错误。看似美观,但如果你的客户想要/需要有效的网站,这实际上是一个问题。纯文本Web服务返回之前或之后的空白也会造成不便。在XML返回中导致空白可能导致错误,例如“在prolog中不允许的内容”。这两个结果都需要用户操作结果才能使用。在我看来,这是一个sl web的网络服务。 – Travis 2010-02-11 11:47:22

+0

@ Travis:是的,的确如此。尽管如此,这些特定的问题可以通过现有的方法完美解决。混合CF和HTML导致的空白问题远不是一个问题,可以单独使用,恕我直言。 – Tomalak 2010-02-11 11:56:50

+0

在大多数情况下,我同意它可以被忽略。 Howerver,我有几个坚持严格验证的客户(​​有趣的一面是,即使他的最新网站看起来像1991年的东西)。尝试这样做时,空白会造成严重破坏;不只是在文档类型之前,而是遍布整个文档。其中大部分不是因为CF,而是因为编码人员在代码中存在空格,请参阅我对答案的贡献。 – Travis 2010-02-11 12:15:53

0

我发现,即使使用各种可能的方法来消除空白,您的代码仍可能有一些不需要的空格或换行符。如果您仍然遇到这种情况,您可能需要为预期输出牺牲良好的代码。

,而不是例如:

<cfprocessingdirective supressWhiteSpace = "true"> 
<cfquery ...> 
... 
... 
... 
</cfquery> 
<cfoutput> 
Welcome to the site #query.userName# 
</cfoutput> 
</cfprocessingdirective> 

您可能需要代码:

<cfprocessingdirective supressWhiteSpace = "true"><cfquery ...> 
... 
... 
... 
</cfquery><cfoutput>Welcome to the site #query.UserName#</cfoutput></cfprocessingdirective> 

这不是CF加入空格,但是格式化你的CF.当你添加空格

HTH

+0

哦,我的。可读性和易于理解的格式良好的代码必须比HTML输出代码中的某些额外空白更重要。现在来吧。 – Jay 2010-02-12 13:33:38

+1

查看Tomalak的回答。在大多数情况下,是的,但绝对不是必需的,Jay。这是一个可行的解决方案,当空白会弄糟你的系统,CF不处理你输入的空白​​。 doctype之前的空白将导致验证错误。看似美观,但如果你的客户想要/需要有效的网站,这实际上是一个问题。纯文本Web服务返回之前或之后的空白也会造成不便。在XML返回中导致空白可能导致错误,例如“在prolog中不允许的内容”。 – Travis 2010-02-12 18:54:40

5

您可以通过获取接入到ColdFusion Outpout缓冲区修改ColdFusion的输出。 James Brown最近在我们的用户组会议上演示了这个(Central Florida Web Developers User Group)。

<cfscript> 
    out = getPageContext().getOut().getString(); 
    newOutput = REreplace(out, 'regex', '', 'all'); 
</cfscript> 

一个很好的做法是在Application.cfc onRequestEnd()。您的结果可能是一行HTML,然后发送到浏览器。与您的网络服务器一起使用GZip,您将大大减少带宽。

0

或者,您可以确保您的整个页面存储在一个变量中,并且所有这些处理均在cfsilent标记中完成。例如

<cfsilent> 
    <!-- some coldfusion --> 
    <cfsavecontent variable="pageContent"> 
     <html> 
      <!-- some content --> 
     </html> 
    </cfsavecontent> 
    <!-- reformat pageContent if required --> 
</cfsilent><cfoutput>#pageContent#</cfoutput> 

最后,您可以在生成pagecontent之后但在输出它之前执行任何其他处理,例如,一个正则表达式来删除额外的空白或一些代码整理。

0

如果您使用CFC,这里有一个提示。

如果你不希望你的方法生成任何输出,(仅当你使用CF9脚本风格并不需要)在<cffunction><cfcomponent>使用output="false"。这将消除很多不需要的空格。

11

除了<cfsilent>,<cfsetting enablecfoutputonly="yes"><cfprocessingdirective suppressWhiteSpace = "true"><cfcontent reset="true" />。您可以使用它删除文档开头的空格。然后

HTML5文件应该像这样开头:

<cfcontent type="text/html; charset=utf-8" reset="true" /><!doctype html> 

XML文档:

<cfcontent reset="yes" type="text/xml; charset=utf-8" /><CFOUTPUT>#VariableHoldingXmlDocAsString#</CFOUTPUT> 

这样,您将无法获得 - 错误的XML文档“内容没有在序言中不允许” 。

如果从一个功能越来越不需要的空格使用output -attribute压制任何输出,并返回你的结果作为字符串 - 例如:

<cffunction name="getMyName" access="public" returntype="string" output="no"> 
    <cfreturn "Seybsen" /> 
</cffunction> 
0

如果您可以访问到服务器,并希望实现它会在每个页面请求中搜索并安装trimflt.jar。这是一个Java servlet过滤器,在发送它之前将删除所有空白和换行符。将jar放入CF的/ WEB-INF/lib目录中并编辑web.xml文件以添加过滤器。它的配置也可以删除注释,排除文件或扩展名,并保留特定的字符串。已经运行了几年没有问题。设置它并忘记它的解决方案。