【问题标题】:White Space / Coldfusion白色空间/冷融合
【发布时间】:2011-01-15 13:29:09
【问题描述】:

停止 ColdFusion 输出的空白的正确方法是什么?

我知道有cfcontentcfsetting enableCFoutputOnly。这样做的正确方法是什么?

【问题讨论】:

  • 您要解决的问题是什么?额外的空白本身并没有造成真正的伤害,至少我不知道。

标签: coldfusion whitespace cfml


【解决方案1】:

标签方面,有cfsilent

在管理员中有一个“启用空白管理”的设置

Futher reading on cfsilent and cfcontent reset.

【讨论】:

  • 同样还有 标签
  • @Travis - 应该是 ` ` 即用 2 p 抑制
  • @NicCottrell 感谢您纠正 5 岁的 type-o。不幸的是 edit 在旧 cmets 上不可用。
【解决方案2】:

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

当您仅出于审美原因而询问时,我的建议是:忽略空格,它不会造成任何伤害。

【讨论】:

  • 空白比拙劣的干净代码更成问题。文档类型前的空格会导致验证错误。看似美观,但如果您的客户想要/需要有效的网站,这实际上是一个问题。纯文本 Web 服务返回之前或之后的空格也会造成不便。 XML 返回中的前导空格可能会导致错误,例如“prolog 中不允许的内容”。这两个结果都需要用户操纵结果才能使用。在我看来,这是一个草率的网络服务。
  • @Travis:是的,这是真的。尽管如此,这些特殊问题仍然可以通过可用的方法完美解决。混合 CF 和 HTML 所产生的空白远没有什么问题,可以不用管,恕我直言。
  • 在大多数情况下是的,我同意它可以被忽略。然而,我有一些坚持严格验证的客户(​​有趣的是,即使他的最新网站看起来也像是 1991 年的东西)。尝试执行此操作时,空格会造成严重破坏;不仅在文档类型之前,而且在整个文档中。大部分不是因为 CF,而是因为编码员的代码中有空格,请参阅我对答案的贡献。
【解决方案3】:

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

例如,而不是:

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

您可能需要编码:

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

这不是 CF 添加空格,而是在格式化 CF 时添加空格。

HTH

【讨论】:

  • 天哪。易于阅读且易于理解的格式良好的代码必须比 HTML 输出代码中的一些额外空白更重要。现在来吧。
  • 查看 Tomalak 答案中的 cmets。在大多数情况下是的,但在绝对需要时不是,杰伊。当空格会破坏您的系统并且 CF 不处理您输入的空格时,这是一个可行的解决方案。文档类型前的空格会导致验证错误。看似美观,但如果您的客户想要/需要有效的网站,这实际上是一个问题。纯文本 Web 服务返回之前或之后的空格也会造成不便。 XML 返回中的前导空格可能会导致错误,例如“prolog 中不允许的内容”。
【解决方案4】:

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

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

在 Application.cfc onRequestEnd() 中执行此操作的好地方。您的结果可能是一行 HTML,然后将其发送到浏览器。将您的 Web 服务器与 GZip 一起使用,您将大大减少带宽。

【讨论】:

    【解决方案5】:

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

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

    最后,您可以在生成页面内容之后但在输出之前执行任何其他处理,例如一个正则表达式,用于删除额外的空格或一些代码整理。

    【讨论】:

      【解决方案6】:

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

      如果您不希望您的方法生成任何输出,请在 &lt;cffunction&gt;&lt;cfcomponent&gt; 中使用 output="false"(仅当您使用 CF9 脚本样式时才需要)。这将消除很多不需要的空格。

      【讨论】:

        【解决方案7】:

        除了&lt;cfsilent&gt;&lt;cfsetting enablecfoutputonly="yes"&gt;&lt;cfprocessingdirective suppressWhiteSpace = "true"&gt;&lt;cfcontent reset="true" /&gt;。您可以使用它删除文档开头的空格。

        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 文档的“Prolog 中不允许内容”错误。

        如果您从函数中得到不需要的空格,请使用 output-attribute 来抑制任何输出并将结果作为字符串返回 - 例如:

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

        【讨论】:

        • 这个(&lt;cfcontent reset="yes" ...) 也适用于 OpenBlueDragon (OpenBD)。
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          相关资源
          最近更新 更多