【发布时间】:2013-12-06 15:09:11
【问题描述】:
我有从 jquery 函数生成的动态输入字段。可以通过单击这些输入字段的按钮来添加或删除。这些字段由 mysql 表中的数据填充。每个填充的输入都有一个从数据库中获取的唯一 ID。添加新字段时,我从 ajax 请求中获得了下一个 AUTO_INCREMENT。然后我可以增加 +1,但对于所有字段。我只想为新字段执行此操作。如果由于某种原因从另一个应用程序进行插入查询事务,它将更新 start increment from 字段,然后使用正确的值更新其余字段(检查我的意思是什么 jsFiddle(http://jsfiddle.net/f9XP8/2/)。
问题在于如何将它们组合在一起。我只想关注能够添加一个新字段并为其分配适当的下一个person_id 以进行数据库插入。 LIVE EXAMPLE
<script>
$(document).ready(function () {
var $increment_num = $('#increment_num');
var interval = 100; //3000 = 3 seconds
function doAjax() {
$.ajax({
type: 'POST',
url: 'personAutoIncrement.php',
data: $(this).serialize(),
dataType: 'json',
success: function (data) {
var $cloned = $('#input_table tr');
var num = parseInt(data);
$increment_num.val(num);
$cloned.each(function(i){
$(this).find('[name^="increment_id"]').first().val(num+i);
})
},
complete: function (data) {
// Schedule the next
setTimeout(doAjax, interval);
}
});
}
setTimeout(doAjax, interval);
var click_count = 0;
$('#btnAdd').click(function () {
click_count++;
var $clones = $('#input_table tr'),
num = $clones.size() + 1,
next_num = parseInt($clones.last().find('input[name^="increment_id"]').val()) + 1,
$template = $clones.first(),
newSection = $template.clone().attr('id', 'pq_entry_'+num),
ident = 'increment_id_'+num;
person_id = 'person_id_'+num;
person_fname = 'person_fname_'+num;
person_lname = 'person_lname_'+num;
// clear out all sections of new input
newSection.find('input').not('[name^="increment_id"]').val('');
newSection.find('input[name^="increment_id"]').attr({
'id': ident,
'name': ident
}).val(/*next_num*/);
newSection.find('input[name^="person_id"]').attr({
'id': person_id,
'name': person_id
}).val(/*next_num*/);
newSection.find('input[name^="person_fname"]').attr({
'id': person_fname,
'name': person_fname
}).val(/*next_num*/);
$('#input_table').append(newSection);
$('#btnDel').prop('disabled', '');
if (num == 100) $('#btnAdd').prop('disabled', 'disabled');
});
$('#btnDel').click(function () {
var num = $('.clonedSection').length; // how many duplicate input fields we currently have
$('#pq_entry_' + num).remove(); // remove the last element
// enable the "add" button
$('#btnAdd').prop('disabled', '');
// if only one element remains, disable the "remove" button
if (num - 1 == 1) $('#btnDel').prop('disabled', 'disabled');
});
$('#btnDel').prop('disabled', 'disabled');
});
</script>
html
<table>
<thead>
<tr>
<th>ID from DB</th>
<th>First Name</th>
</tr>
</thead>
<tbody id="input_table">
<tr id="pq_entry_1">
<td><input type="text" id="increment_id_1" name="increment_id_1" readonly value="5" /></td>
<td><input type="text" name="first_name" placeholder="First Name" /></td>
</tr>
</tbody>
</table>
<input type='button' id='btnAdd' value='add text box' />
<input type='button' id='btnDel' value='Delete' /></br>
</table>
【问题讨论】:
-
为什么不能直接将 AUTO_INCREMENT 字段委托给您的数据库层?您不应该在客户端上搞砸它:即使显示 ID 字段通常也是一个坏主意。我宁愿在最终提交后直接从服务器(即 db-server)检索新 id。
-
您使用的是 MySQL 还是类似的 RDBMS?
-
@RobM。我正在使用 MySQL。要不要我贴一下mysql/php代码?
-
@RobM。有什么想法可以完成这项工作吗?
标签: javascript jquery