【问题标题】:Including an AJAX-retrieved select input in an HTML form with ColdFusion使用 ColdFusion 在 HTML 表单中包含 AJAX 检索的选择输入
【发布时间】:2014-02-17 17:11:04
【问题描述】:

我有一个 AJAX,它会加载一个下拉菜单,其中包含选定部门内的团队,然后是另一个包含该选定团队内的代理的下拉菜单。我希望能够提交表单并使用在最后一个下拉列表 (#form.selectAgent#) 中选择的代理来设置变量 (#empHistoryRACF#) 并运行查询。当我填写表格时,我能够看到两个带有 AJAX 查询内容的下拉列表,但它们的值没有在帖子中提交,尽管提交按钮(非 AJAXed)是。奇怪的是,我的应用程序的另一部分使用相同类型的代码执行相同的操作,并且运行良好。我尝试将应用程序的该部分注释掉,但 form.selectAgent 仍未定义。我正在使用 ColdFusion 10 和以下代码。

HTML 表单:

<form action="index.cfm" method="post" name="empHist">
<td colspan="5">
    <h2>Employee History (#empHistoryRACF#)</h2>
</td>
<td colspan="2" style="text-align: center;">
    <select name="employeeHistory" id="empHist" onchange="getTeamsHist(this.value)">
        <option value=""></option>
        <cfset length = structCount(deptStruct)>
        <cfloop from="1" to="#length#" index="i">
            <option value="#deptStruct[i]['DEPT_NAME']#">#deptStruct[i]['DEPT_NAME']#</option>
        </cfloop>
    </select>
</td>
<td style="text-align: center;">
    <div id="getTeamsHist"></div>
</td>
<td style="text-align: center;">
    <div id="getAgentsHist"></div>
</td>
<td style="text-align: right;">
    <input type="submit" name="submitHist" value="View Employee">
</td>           
</form>

getTeamsHist 和 getAgentsHist 的 AJAX:

function getTeamsHist(str) {
    var xmlhttp;

    if (str == "") {
        document.getElementById("getTeamsHist").innerHTML = "";
        return;
    }

    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    } else {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            document.getElementById("getTeamsHist").innerHTML = xmlhttp.responseText;
        }
    }

    xmlhttp.open("GET","ajax/get_teams_hist.cfm?ajaxDept=" + str, true);
    xmlhttp.send();
}

function getAgentsHist(str) {
    var xmlhttp;

    if (str == "") {
        document.getElementById("getAgentsHist").innerHTML = "";
        return;
    }

    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    } else {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            document.getElementById("getAgentsHist").innerHTML = xmlhttp.responseText;
        }
    }

    xmlhttp.open("GET","ajax/get_agents_hist.cfm?ajaxTeam=" + str, true);
    xmlhttp.send();
}

这里是 get_teams_hist.cfm:

<cfoutput>
<cfloop query="agentQuery">
    <cfloop list="#agentQuery.columnList#" index="col">
        <cfset agentStruct[currentRow]['#col#'] = evaluate(#col#)>
    </cfloop>
</cfloop>

<select name="selectAgent" id="selectAgent">
    <option value=""></option>
    <cfset length = structCount(agentStruct)>
    <cfloop from="1" to="#length#" index="i">
        <option value="#agentStruct[i]['AGENT_UID']#">#agentStruct[i]['AGENT_UID']#</option>
    </cfloop>
</select>
</cfoutput>

这里是 get_agents_hist.cfm:

<cfoutput>
<cfloop query="teamQuery">
    <cfloop list="#teamQuery.columnList#" index="col">
        <cfset teamStruct[currentRow]['#col#'] = evaluate(#col#)>
    </cfloop>
</cfloop>

<select name="selectTeam" id="selectTeam" onchange="getAgentsHist(this.value)">
    <option value=""></option>
    <cfset length = structCount(teamStruct)>
    <cfloop from="1" to="#length#" index="i">
        <option value="#teamStruct[i]['AGENT_TEAM']#">#teamStruct[i]['AGENT_TEAM']#</option>
    </cfloop>
</select>
</cfoutput>

这就是我尝试使用第二个选择中的内容的方式 - 它显示 selectAgent 未定义。如果我执行 cfdump var="#form#",它也没有显示。

<cfif isDefined('form.submitHist')>
    <cfset empHistoryRACF = form.selectAgent>
<cfelse>
    <cfset empHistoryRACF = "">
</cfif>

【问题讨论】:

    标签: html ajax forms coldfusion


    【解决方案1】:

    首先,&lt;form&gt; 标记未正确嵌套在 HTML 文档中(不应位于 &lt;tr&gt;&lt;td&gt; 之间)。这有时会导致问题——尤其是在使用 AJAX 加载的表单元素时,尤其是在 IE 中意外查看它时。尝试将您的 &lt;form&gt; 移到 &lt;table&gt; 之外,然后查看字段是否已发布。

    另外,您的get_agents_hist.cfmget_agents_hist.cfm 文件似乎正在将查询转换为结构,只是为了遍历该结构并创建&lt;options&gt;。这工作量太大了。你应该只使用类似的东西:

    <select name="selectTeam" id="selectTeam" onchange="getAgentsHist(this.value)">
       <option value=""></option>
        <cfoutput query="teamQuery">
          <option value="#teamQuery.AGENT_TEAM#">#teamQuery.AGENT_TEAM#</option>
       </cfoutput>
    </select>
    

    附带说明,在几乎所有情况下,您都不需要在 CFML 中使用 evaluate()。如果您发现自己认为自己需要它,那么可能有更好的方法来解决问题。

    最后,您可能应该更改“getTeamsHist”和“getAgentsHist”div 的 ID,因为它们可能会与同名的全局范围的 JS 函数发生冲突。

    【讨论】:

    • 太棒了 - 将
      标记移到表格结构之外解决了这个问题。我一直在将我的所有查询转换为这个应用程序中的结构,因为我经常需要比较当前、上一个和下一行内容以生成标题/小计 - 但你是对的,这里根本不需要。您能否评论一下这是否“昂贵”?我在另一篇文章中对使用 evaluate() 得到了相同的反馈,所以我也会考虑替换它。
    • 任何时候你创建额外的对象,它都需要资源。但是暂时忘记成本。一个更相关的问题是首先是否真的需要一个结构。最有可能的是,“不”。您可以使用关联表示法访问任何查询行,即queryName["columnName"][rowNumber],这使得额外的结构变得多余。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2018-12-06
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多