0

我有一个表单,用户可以在其中提交表单以指示哪些系统需要更新。在表单中,他们可以动态地将系统添加到表单中,因此我没有可用的唯一 ID。在表格中,他们必须选择一个平台(unix、hp、wintel 等),然后选择相应的模型来伴随所选平台——想想链式选择。当“项目”中的第一个选定列表发生更改时,将进行 ajax 调用以获取第二个选择列表的值。如何仅针对相应的链式选择更新“项目”中的第二个选择列表?

我正在使用克隆方法来允许用户向表单添加项目。因此,页面上的 id 不再是唯一的,所以我使用该类来确定哪个选择按钮发生了变化。它现在的工作方式,每个第二个选择列表都会更新,我只希望与第一个选择列表对应的选择链选择列表更新更新。我相信 next() 是答案,但我猜我的语法不正确。

第一个选择列表的类是平台,第二个是模型。

每第二个选择列表更新一次:$("select.model").html(options)

没有更新: $("select.model").next().html(options);

任何帮助,将不胜感激。

<div id="mySelectArea">
  <select id="myFirstOption" class="myFirstOption">
    <option>1</option>
    <option>2</option>
    <option>3</option>
  </select>
  <select id="mySecondSelect" class="mySecondSelect">
    <option>1</option>
    <option>2</option>
    <option>3</option>    
  </select>
</div>

<div id="mySelectArea">
  <select id="myFirstOption" class="myFirstOption">
    <option>1</option>
    <option>2</option>
    <option>3</option>
  </select>
  <select id="mySecondSelect" class="mySecondSelect">
    <option>1</option>
    <option>2</option>
    <option>3</option>    
  </select>
</div>

<script>
jQuery(document).ready(function()
    {
    $(".myFirstOption").live("change", function() {
        $.getJSON("live_getModels.cfm",{platform: $(this).val()},       
        function(j){
            var options = '';
            for (var i = 0; i < j.length; i++) 
                {
                    options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
                }
        $(this).next("#mySecondSelect").html(options);      
        });
    });

});
</script>

这是一个示例 JSON 结果,用于更准确的演示:

[{"optionValue":"", "optionDisplay":"Select Model"},{"optionValue":"TBD", "optionDisplay":"TBD"},{"optionValue":"SCCM", "optionDisplay":"SCCM-standalone"},{"optionValue":"Manual", "optionDisplay":"Manual-standalone"},{"optionValue":"SCCM-VMWare", "optionDisplay":"SCCM-VMWare"},{"optionValue":"Manual-VMWare", "optionDisplay":"Manual-VMWare"},{"optionValue":"SCCM Hybrid", "optionDisplay":"SCCM Hybrid"},{"optionValue":"SCCM Hybrid VMWare", "optionDisplay":"SCCM Hybrid VMWare"},{"optionValue":"SCCM Offline", "optionDisplay":"SCCM Offline"},{"optionValue":"SCCM Offline - VMWare", "optionDisplay":"SCCM Offline - VMWare"}]
4

2 回答 2

1

如果我没看错, .next() 不起作用的原因是因为您正在选择要更新的下拉列表,然后移至下一个。如果您的(伪)html 看起来像这样

<div id="mySelectArea">
  <select id="myFirstOption">
    <option>1</option>
  </select>
  <select id="mySecondSelect">
    <option>2</option>
  </select>
</div>

并且您有一个第一次选择的更改事件,代码将是

$(this).next("#mySecondSelect").options(html);

根据您的编辑,将您的 javascript 更改为:

jQuery(document).ready(function() {
    $(".myFirstOption").live("change", function() {
        var firstOption = $(this);
        $.getJSON("live_getModels.cfm",{platform: $(this).val()},       
        function(j){
            var options = '';
            for (var i = 0; i < j.length; i++){
                options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
            }
            firstOption.next("#mySecondSelect").html(options);      
        });
    });

});

我在ajax成功函数this = window中比较确定,所以你必须保存对原始对象的引用。

于 2011-03-07T19:05:44.100 回答
0

为什么不让用户填写所有信息的表格,然后仅在最后将它们附加到列表中?

这样您就不必担心周围有n 个下拉菜单。

于 2011-03-07T18:54:37.223 回答