CFAJAXPROXY将脚本放入head标签,而不是打开和关闭head标签之间

时间:2012-03-21 14:54:57

标签: coldfusion coldfusion-9 coldfusion-8

我们正在使用ColdFusion 8。

我们正在使用CFAJAXPROXY。我们刚刚发现ColdFusion在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>

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

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

3 个答案:

答案 0 :(得分:1)

我不相信你应该在head标签上添加ID。这不是正确的HTML语法。

答案 1 :(得分:1)

如何将<cfajaxproxy>插入页面?您是否在Application.cfc中使用<cfinclude>自定义标记或方法?无论如何,有几件事情浮现在脑海中。如果您只是将<cfajaxproxy>放入已存在的包含文件中(即:

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

),那么也许你可以在当前版本之上插入一个新的<head>标签(没有id=)。虽然我不知道它可能有什么副作用,但我已经测试了它并且它对<cfajaxproxy>有效。如果您将另一个<head>标记放在当前标记之下,或者如果您尝试嵌套它们或类似的任何内容,那么将不会工作。 CF似乎正在做的是寻找第一次出现<head,推进一个字符,然后插入JS代码。另一种方法可能是使用包含<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>

答案 2 :(得分:1)

与Facebook应用程序存在同样的问题,HEAD标记上需要有“前缀”属性。

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

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

<强>已更新

我在ColdFusion 10中使用&lt; head id =“test”prefix =“test”&gt;进行了测试。

ColdFusion在关闭'&gt;'后注入了脚本标签HEAD标签。所以这显然是CF8和CF9的一个错误。