2

我在 ColdFusion 9 的变量中存储了以下 HTML。我需要在 4th 之后插入一个新的表格行</tr>。即在提交按钮之前。

<form name="form1" id="form1" action="" method="post">
    <table>
    <tr style="visibility:hidden;display:none;"><td> <input type="hidden" id="ref1" name="ref1" value="1" > </td></tr> 
    <tr style="visibility:hidden;display:none;"><td> <input type="hidden" id="ref2" name="ref2" value="2" > </td></tr> 
    <tr>
        <th style="text-align:left;">Name&nbsp;*&nbsp;</th>
        <td><input type="text" name="foo" id="foo" size="30" maxlength="50" value=""></td>
    </tr>
    <tr>
        <th title="Please enter plain text or HTML." style="cursor:help;text-align:left;">Comment&nbsp;*&nbsp;</th>
        <td><textarea name="bar" id="bar" cols="40" rows="10" ></textarea></td>
    </tr>
    <tr>
        <th colspan="1"></th>
        <td>
            <input style="width:80px" type="submit" value="Submit">
            <input style="width:80px" type="button" value="Cancel">
        </td>
    </tr>
</table>

ReReplace 似乎是要走的路,但我无法正确使用正则表达式。另一种选择是拆分字符串并在中间使用我的新 HTML 重建它。任何建议,将不胜感激。

4

2 回答 2

5

正则表达式是错误的工具——你需要一个 HTML 解析器。

以下是使用JSoup的方法:

<cfsavecontent variable="InputHtml">
    [insert code from question]
</cfsavecontent>

<cfsavecontent variable="NewRow">
    <tr><th>whatever</th><td>stuff</td></tr>
</cfsavecontent>

<!--- Read "Creating Objects From Jar Files" --->
<cfset jsoup = createObject('java','org.jsoup.Jsoup') />

<cfset HtmlDom = jsoup.parse(InputHtml) />

<cfset HtmlDom.select('tr:eq(4)').after( NewRow ) />

<cfoutput>
    <pre>#XmlFormat(HtmlDom.body().html())#</pre>
</cfoutput>

您可以在JSoup Selector API中查看支持哪些选择器的详细信息

如果您不知道/关心表格中有多少行,您可以...

HtmlDom.select('table>tbody').append( NewRow )

...只需在最后添加新行。


从 Jar 文件创建对象

如果您复制并粘贴上面的代码很可能不会立即运行,因为您的服务器不知道 JSoup - 您需要下载 Jar 文件并将其放在合理的位置。

对于 CF9,您需要将 jsoup-1.6.3.jar 复制到您的 {coldfusion}/lib 目录中,然后重新启动服务器。

对于 CF10,您可以this.JavaSettings在 Application.cfc 中使用(如此处所述)将其放置在不同的位置。

对于 Railo 和 OpenBD,您可以将 JAR 文件的位置指定为第三个参数,例如:

<cfset jsoup = createObject('java','org.jsoup.Jsoup','lib/jsoup-1.6.3.jar') />
于 2012-08-11T21:31:44.940 回答
1

我建议使用 jQuery 执行此操作:

​$(document).ready(function(){

   $($('form tr')[3]).after('<tr><td>row</tr></tr>');

});​

容易得多。

于 2012-08-18T06:56:05.047 回答