【问题标题】:CFAJAXPROXY is putting script into the head tag, not between the open and close head tagsCFAJAXPROXY 将脚本放入头标签中,而不是在打开和关闭头标签之间
【发布时间】:2012-06-08 11:22:13
【问题描述】:

我们正在使用 ColdFusion 8。

我们正在使用 CFAJAXPROXY。我们刚刚发现 ColdFusion 在 head 标签中插入的标签有问题。它在具有如下 head 标签的页面上运行良好:

<head>
    <title></title>
</head>

但是,它不适用于 head 标签中有 ID 的页面,如下所示:

<head id="SomeID">
    <title></title>
</head>

CFJAXPROXY 将脚本插入到 head 标签内,而不是打开和关闭 head 标签,这会炸毁页面,如下所示:

<head <script type="text/javascript"></script>
    <title></title>
</head>

如果从 head 标签中删除 ID,问题会立即消失。

问题是这是否是一个已知的 CFAJAXPROXY 错误?有没有办法告诉 CFAJAXPROXY 将脚本放在头部区域而不是头部标签中?

【问题讨论】:

  • 使用coldfusion-9 标记,因为它也发生在那里。

标签: coldfusion coldfusion-9 coldfusion-8


【解决方案1】:

您如何将&lt;cfajaxproxy&gt; 插入页面?您是在使用&lt;cfinclude&gt;、自定义标记还是 Application.cfc 中的方法?无论如何,我想到了几件事。如果您只是将&lt;cfajaxproxy&gt; 放入已经存在的包含文件中(即:

<html>
<cfinclude template="stuff.cfm" />
<head id="head1">
</head>
...

),那么也许您可以在当前标签上方插入一个新的&lt;head&gt; 标签(没有id=)。我已经测试过了,就&lt;cfajaxproxy&gt; 而言它可以工作,尽管我不知道它可能有什么副作用。如果您将另一个 &lt;head&gt; 标签放在当前标签下方,或者您尝试嵌套它们或类似的东西,它不会起作用。 CF 似乎正在做的是寻找第一次出现的&lt;head,推进一个字符,然后插入 JS 代码。另一种方法可能是使用包含&lt;head 的虚假标签(这也“有效”):

<fake<head>
</fake<head>

当然,该标签不是合法的 XML,因此如果您使用 XMLParse() 或类似的方法解析模板,可能会搞砸。

更新:这是您可以使用的另一种方法,它可能有效。我试过了,但不知道它是否适用于复杂的代码。您将在 Application.cfc 的 onRequest() 方法中执行以下操作。我不知道它会对您的处理时间产生什么影响:

<cffunction name="onRequest" access="public" returntype="void" output="true">
    <cfargument name="target_page" type="string" required="true" />

    ...

    <cfsilent>
    <!--- Grab the requested page. --->
    <cfsavecontent variable="local.target_page">
        <cfinclude template="#arguments.target_page#" />
    </cfsavecontent>

    <!--- Replace bad <head> tag with good one --->
    <cfset local.target_page = REReplace(local.target_page, "(<head[^>]*>)", "<head>") />
    <cfajaxproxy ... />
    </cfsilent>
    <cfoutput>#local.target_page#</cfoutput>

    <cfreturn />
</cffunction>

【讨论】:

  • 大卫,你说:“CF 似乎在做的是寻找第一次出现的 ”很有趣。我会试一试。谢谢!!!
  • @EvikJames,我希望它有效。如果不是,我想出了一个使用 onRequest() 的解决方案(请参阅更新的答案)。
【解决方案2】:

我认为您不应该在 head 标签中添加 ID。这不是正确的 HTML 语法。

【讨论】:

  • 我同意。不过,我们有 1,000 多个站点,如果没有一些实时投资,我们真的无法更改它们。这显然是 ColdFusion 做错了。在我们开始修复网站之前,我正在寻找一个 ColdFusion 解决方案。
  • @EvikJames,我不认为 ColdFusion 做错了什么,它是在做一些不方便的事情。
  • html 5 有 id 作为全局属性,所以可以添加到 HEAD 标签中。如果它不是 HTML 5 文档类型,那么它不应该存在。也就是说,ColdFusion 看起来确实因为 id 属性而错误地解析了 HEAD 标记。看起来没有报告错误,所以我建议发布一个:bugbase.adobe.com
  • @EvikJames,我收回我之前说的话。这是一个错误,当您使用&lt;head &gt; 而不是&lt;head&gt; 时,它甚至无法正常工作。这让我知道 CF 只是在寻找 &lt;head,推进一个字符(不管那个字符是什么),然后插入代码。它会影响具有id 属性的&lt;head&gt; 标记,但这不是问题的根本原因。
  • @StephenMoretti,我今天报告了这个错误:bugbase.adobe.com/index.cfm?event=bug&id=3146932
【解决方案3】:

在使用 Facebook 应用时遇到同样的问题,需要在 HEAD 标记上添加“前缀”属性。

在使用 CFAJAXPROXY 之前,我使用名为 CFAjax 的第三方解决方案来进行 AJAX 调用。

http://www.indiankey.com/cfajax/

更新

我在 ColdFusion 10 中使用

进行了测试。

ColdFusion 在 HEAD 标记的结束“>”之后注入脚本标记。所以这显然是 CF8 和 CF9 的错误。

【讨论】:

  • 也许这在 ColdFusion 10 中得到了修复,但我对此表示怀疑。
  • 我在家里的开发盒上安装了 CF 10。我今晚晚些时候可能会试试这个,看看会发生什么。我会发布我的发现。
  • CFAJAXPROXY 在版本 10 中工作,即使 HEAD 标签有附加参数
  • 又是一个花费 1 万美元以上升级的好理由!
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2022-12-05
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 2018-04-03
相关资源
最近更新 更多