2009-12-12 55 views
5

正如标题所说,我想要做的是让jQuery根据在下拉列表中选择的值添加一些额外的字段集,下框。例如,当页面加载时,下拉列表的默认值为1,并显示默认字段集。现在,如果用户在该下拉列表中选择了不同的值,则应该通过克隆来相应地调整字段集的数量(我想这应该是最好的解决方案)。这是我到目前为止有:使用jQuery根据下拉框的值动态添加表单字段(或字段集)

下拉框代码...

<select id="itemCount" name="itemCount"> 
<option value="1">1 item</option> 
<option value="2">2 items</option> 
<option value="3">3 items</option> 
<option value="4">4 items</option> 
<option value="5">5 items</option> 
<option value="6">6 items</option> 
</select> 

... jQuery的变化听者...

$(document).ready(function() { 
$("#itemCount").change(function(){ 
    var itemCountVal = jQuery(this).val(); 
    $("#item_dup_1").fieldsManage(itemCountVal); 
}); 
}); 

...和功能本身(它实际上是基于我以为是什么,我需要一个良好的起点,一个jQuery插件):

jQuery.fn.fieldsManage = function (number) { 
    var clone, 
    objTemplate = source.clone(true), 
    source = jQuery(this), 
    maxClones = number - 1, 
    clones = []; 

    if (clones.length < maxClones) { 
    while (clones.length < maxClones) { 
     clone = objTemplate.clone(true).insertAfter(clones[clones.length - 1] || source); 
     clones.push(clone); 
    } 
    } 

    if (clones.length > maxClones) { 
    // Fieldsets removal function goes here. 
    } 
} 

的对象是作c像是<fieldset id="item_dup_1"><input><input><input></fieldset>。我不认为有必要展示完整的代码。

这对于第一次更改很有用,但如果用户再次更改该值,那就是出现问题时,而不是显示正确数量的字段集,它会显示更多信息。它看起来像是从头开始计算所需的字段集的数量,而忽略了字段集已被添加的事实,而这正是我的问题所在。我还有一个函数(这里没有显示只是为了保持问题清晰和尽可能简短),将新的ID分配给克隆的字段集以防止重复的ID并且无障碍地工作。

我相信我做错了什么,但是我一直在用这种方式撞我的头撞墙了两天,试图找到没有任何运气的东西,所以任何帮助都会超过赞赏!

在此先感谢!

回答

6

我不喜欢内特B的解决方案

  • 它需要一个额外的容器元素
  • 重现一切,从而丢失数据已经进入
  • 创建一个维护问题:的HTML标记fieldset被复制(一次在HTML中,一次作为追加字符串)
  • 为字段集创建无效的id(id不能以数字开头)

这是做你想做的,和你所做的相似。只保留原始元素上的数据属性中的id(而不是保留可能使用大量内存的整个克隆对象)。保持已输入的所有值。如果您更改了所有内容,则不会重新创建。而是只产生两个新的字段集。以相反的顺序将它们移除。

jQuery.fn.fieldsManage = function (number) { 
    var ele = $(this); 
    var clones = ele.data("clones"); 
    clones = clones ? clones : new Array(ele.attr("id")); 
    if (clones.length < number) { 
     var clone; 
     while(clones.length < number) { 
      clone = ele.clone(true); 
      var id = clones[0]+clones.length; 
      clone.attr("id", id); 
      $("#"+clones[clones.length-1]).after(clone); 
      clones.push(id); 
     } 
    } else { 
     while(clones.length > number) { 
      $("#"+clones.pop()).remove(); 
     } 
    } 
    ele.data("clones", clones); 
} 

$(document).ready(function() { 
    $("#itemCount").change(function() { 
     $("#item_dup_1").fieldsManage(this.value); 
    }); 
}); 
+0

辉煌,像魅力一样工作!这就是我脑子里想的,但一路卡住了。谢谢,非常感谢。 – 2009-12-13 01:22:08

+0

也许这是常识,但我发现如果在更改字段集计数之前克隆的字段集的输入字段中输入了数据,输入的数据也将被克隆。做一个简单的clone.find(“input”)。each(function(){jQuery(this).val(“”)));克隆创建完成后会为您提供一个干净的克隆。希望这可以让一些人省掉几分钟的时间。 – 2009-12-13 21:53:56

+1

嗯,这或多或少是常识,也是'clone'应该工作的方式。 jQuery'clone'方法在内部使用普通的DOM方法'cloneNode(true)'。点击这里查看它的行为描述http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-3A0ED0A4 – jitter 2009-12-13 22:42:08

0

你为什么要克隆而不是仅仅做这样的事情(和你当前的事件监听器一起)?

$(".divWhereTheseGo").empty(); 
var count = 0; 
while (count < maxItems) { 
    $(".divWhereTheseGo").append("<fieldset id=\"" + count + "\">your form info</fieldset>"); 
    count++; 
} 

字段集中的count是您如何处理唯一ID问题。

+0

这绝对是我没有想过的有用和有趣的方法,但我可以在选择6作为字段集用户的形式看到一个问题,指望它,然后改变主意,只希望4字段集。我将如何去除最后两个字段集而不在容器上执行空(),从而让用户再次输入前4个字段集中的数据?是否有与append()相反的内容? – 2009-12-12 17:31:22

+0

请忽略我最后的评论。仔细想想,我意识到我可以简单地寻找生成的字段集所在的容器的最后一个孩子,并在其上执行.remove()。太感谢了 ! – 2009-12-12 18:07:18