我正在使用jQuery的可排序方法来重新排序输入标签组。这些标记的name属性的格式为foo[n]
(当组中有一个输入时)或foo[n][fieldname]
(组中有多个输入),其中n是某个数字。
我遇到的问题是,当提交整个表单时,PHP代码存储在数据库中的输入组的顺序是索引的顺序,而不是屏幕上的顺序。我需要更新名称索引以反映屏幕排序顺序的结果。我不确定如何做到这一点。 jQuery的文档不是特别有用。
生成的HTML看起来像这样:
<ul id="deepwoods_meta_rightbutton-repeatable" class="deepwoods_metabox_repeatable">
<li><span class="sort hndle">||</span><textarea name="deepwoods_meta_rightbutton[0]" id="deepwoods_meta_rightbutton" cols="60" rows="4">(some text)</textarea><a class="repeatable-remove button" href="#">-</a></li>
<li> (same as above, except [0] replaced with [1]) </li>
...
<li> (same as above, except [0] replaced with [n]) </li>
</ul>
或者它可能是这样的:
<ul id="deepwoods_meta_buybuttons-repeatable" class="deepwoods_metabox_repeatable">
<li><span class="sort hndle">||</span>
<div class="form-table deepwoods-metabox div-as-table">
<div class="div-as-table-row">
<span class="span-as-th"><label for="deepwoods_meta_buybuttons">Link</label</span>
<span class="span-as-td"><input type="text" name="deepwoods_meta_buybuttons[0][thelink]" id="deepwoods_meta_buybuttons" value="..." size="60" class="scrollable" /></span></div>
<div class="div-as-table-row">
<span class="span-as-th"><label for="deepwoods_meta_buybuttons">Button</label></span>
<span class="span-as-td"><input type="text" name="deepwoods_meta_buybuttons[0][thebutton]" id="deepwoods_meta_buybuttons" value="..." size="60" class="scrollable" /></span></div>
<div class="div-as-table-row">
<span class="span-as-th"><label for="deepwoods_meta_buybuttons">Text</label></span>
<span class="span-as-td"><textarea name="deepwoods_meta_buybuttons[0][text]" id="deepwoods_meta_buybuttons" cols="60" rows="4">...</textarea></span></div></div><a class="repeatable-remove button" href="#">-</a></li>
<li> (much like the previous list item, but [0] replaced with [1] ) </li>
...
<li> nth ([n]) item </li>
</ul>
即每个可排序列表项可以包含单个输入字段(输入,文本区域或选择标记),或者每个列表项可以包含一组输入,文本区域或选择项目。可以将其视为简单缩放器值的向量或对象值的向量。
我在表单中有多个(可单独排序的)块。我使用的jQuery代码如下所示:
jQuery('.deepwoods_metabox_repeatable').sortable({
opacity: 0.6,
revert: true,
cursor: 'move',
handle: '.sort',
containment: 'parent'
});
我想我需要添加一个更新事件处理程序,但我不知道如何从那里继续。 jQuery文档不清楚(对我而言)。
答案 0 :(得分:4)
您有两个选择:
从input
代码中删除所有索引,默认情况下表单将按顺序发送
OR
使用stop
事件更改名称:
jQuery('.deepwoods_metabox_repeatable').sortable({
stop: function (event, ui) {
updateNames($(this))
}
})
function updateNames($list) {
$list.find('li').each(function (idx) {
var $inp = $(this).find('input');
$inp.each(function () {
this.name = this.name.replace(/(\[\d\])/, '[' + idx + ']');
})
});
}
答案 1 :(得分:0)
在用Firebug进行了几个小时的讨人喜欢之后,我找到了一个似乎有效的解决方案。可能不是特别优雅,可能过于冗长。
jQuery('.deepwoods_metabox_repeatable').sortable({
opacity: 0.6,
revert: true,
cursor: 'move',
handle: '.sort',
containment: 'parent',
update: function(event,ui){ renumber(ui.item); }
});
function renumber(item) {
ul = item[0].parentNode;
jQuery('li',ul).each(function(index,element) {
renumber_helper(index,element);
});
}
function renumber_helper(index,element) {
inputs = jQuery('input', element);
for (j = 0; j < inputs.length; j++) {
input = inputs[j];
name = input.name;
input.name = name.replace(/(\d+)/,index);
}
textareas = jQuery('textarea',element);
for (j = 0; j < textareas.length; j++) {
textarea = textareas[j];
name = textarea.name;
textarea.name = name.replace(/(\d+)/,index);
}
selects = jQuery('select',element);
for (j = 0; j < selects.length; j++) {
select = selects[j];
name = select.name;
select.name = name.replace(/(\d+)/,index);
}
}