2011-01-05 39 views
0

我会尽我所能地尽力在逻辑上解释这一点。基本上我在我的网站上有一个设施,用户可以输入他们的工作经历。这是一个带有输入字段的表单。为了让事情变得更容易,我有一个jQuery函数来克隆这些输入字段,并允许用户一次输入多个记录。调整JavaScript计数

在添加新记录时,用户可能希望从列表中删除记录,在这种情况下,他们可以按下每条记录旁边的“删除”链接。

HTML(1项):

<div class="history-form-fields"> 

<div class="row"> 
    <label for="History_0_type">Type</label> 
    <select name="History[0][type]" id="History_0_type"> 
    <option value="">Select</option> 
    </select> 
</div> 

<div class="row"> 
    <label for="History_0_name">Name</label> 
    <input type="text" name="History[0][name]" id="History_0_name" /> 
</div> 

<div class="row"> 
    <label for="History_0_year">Year</label> 
    <select name="History[0][year]" id="History_0_year"> 
    <option value="">Select</option> 
    </select> 
</div> 

</div> 

<input id="add" type="button" value="Add Another" />  

JS:

<script type="text/javascript"> 
    var counter = <?php echo $historyCount; ?>; 

    $('#add').click(function(){ 
     var divCloned = $('.history-form-fields:first').clone(); 
     divCloned.insertAfter('.history-form-fields:last'); 
     initNewInputs(divCloned.children('.row'), ++counter); 
    }); 

    $('.remove').live('click', function(){ 
     $(this).parent().remove(); 
     return false; 
    }); 
</script> 

在上面的JS代码,所述$historyCount变量是在我的PHP脚本预先设定:

$historyCount=isset($_POST['History']) ? count($_POST['History'])-1 : 0; 

例如,当表单发布时,如果页面上有多个记录,并且有一些有效出现错误,则表单重新显示,显示相同的记录。

还有一个函数initNewInputs()的调用,该函数在新的 计数器值中传递。这样新的表单输入元素可以接收唯一的ID和NAME属性(在上面的HTML代码中,您可以看到属性值中的整数索引)。

这一切工作正常。我遇到的问题是在以下情形:

  1. 用户开始添加新记录

    • 记录1 - 数0
    • 记录2 - 计数1个
    • 记录3 - 计数2
    • 记录4 - 计数3
    • 记录5 - 计数4

  2. 用户删除记录3 & 4(所以我们现在只有3条记录)。记录5现在是记录3,但保持相同的计数值(4)。

  3. 用户则增加了一个新的记录:

    • 记录4 - 计数5

  4. 用户帖子的形式 - 有一些验证错误,这样的形式重新显示。 PHP脚本确定它收到4条记录,所以它预先将计数设置为3。

  5. 用户决定添加一个新的记录,而修复这些错误

    • 记录5 - 共4

这是哪里的问题出现了 - 一个纪录的计数值4已经存在于页面上。即它现在已经创建了与页面上已有的ID和NAME属性值相同的输入元素。

我知道这有点难以理解,但我会很感激任何帮助。这很可能需要修改计数器的设置。

回答

1

而不是使用count($_POST['History'])填写counter使用$_POST['History']数组的上限(在这种情况下,我指的是最高索引号)。

+0

嗯好主意。让我一起去,我会尽快回复。 – GSTAR 2011-01-05 18:40:16

+0

是的,这似乎已经成功了。我会继续测试,如果一切OK将会接受你的答案!谢谢。 – GSTAR 2011-01-05 18:49:43

+0

听起来不错。不要忘了给我一个努力:) – webbiedave 2011-01-05 18:54:26