使用jQuery sortable后重新编号输入标记名称字段

时间:2013-02-16 14:09:03

标签: jquery input jquery-ui-sortable

我正在使用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文档不清楚(对我而言)。

2 个答案:

答案 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 + ']');            
        })
    });
}

DEMO:http://jsfiddle.net/gszfD/

答案 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);
  }
}