Scriptaculous可排序onUpdate未触发

时间:2013-07-23 07:20:37

标签: javascript jquery-ui-sortable scriptaculous onupdate

我在使用scriptaculous lib中的Sortable类时遇到了一些麻烦:如果我使用onUpdate属性,似乎永远不会调用only回调。这是一个不使用'only'属性的工作示例:

<ul id="test">
  <li id="item_1" class="level0">
    item 1
    <ul>
      <li id="item_2" class="level1">item 1.1</li>
      <li id="item_3" class="level1">item 1.2</li>
    </ul>
  </li>
  <li id="item_4" class="level0">
    item 2
    <ul>
      <li id="item_5" class="level1">item 2.1</li>
      <li id="item_6" class="level1">item 2.2</li>
    </ul>
  </li>
</ul>
<script type="text/javascript">
  Sortable.create("test", {
    tree: true,
    onUpdate: function(item) { alert(item.readAttribute("id")) },
  });
</script>

此代码效果很好:onUpdate被正确调用,但现在,如果我更改Sortable.create()以添加only属性,如下所示onUpdate isn'再打电话了:

Sortable.create("test", {
  tree: true,
  only: 'level1',
  onUpdate: function(item) { alert(item.readAttribute("id")) },
});

有没有人已经解决了这个问题? 感谢

1 个答案:

答案 0 :(得分:1)

dragdrop.js源代码中进行一些调试后,我终于发现用于检测树上修改的序列化方法仅限于根元素(但我没有调查为什么没有{{1} })。

基于scriptaculous 1.9.0版本,我可以通过修补only来修复它。我找到了几种修补代码的方法:

  1. 通过修改dragdrop.js方法:此方法创建serialize对象但不使用它,但测试options除外。传递给options.tree的选项是Sortable.tree,我猜这是一个错误。第一种修补方法是将arguments[1]替换为arguments[1](第936行和第940行):

    options
  2. 第二种方法包括手动添加929 serialize: function(element) { 930 element = $(element); 931 var options = Object.extend(Sortable.options(element), arguments[1] || { }); 932 var name = encodeURIComponent( 933 (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); 934 935 if (options.tree) { 936 return Sortable.tree(element, options).children.map( function (item) { 937 return [name + Sortable._constructIndex(item) + "[id]=" + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); 938 }).flatten().join('&'); 939 } else { 940 return Sortable.sequence(element, options).map( function(item) { 941 return name + "[]=" + encodeURIComponent(item); 942 }).join('&'); 943 } 944 } 值。这可以在options.tree这样的方法中完成(第877行和第8行):

    tree
  3. 还可以修复872 var options = Object.extend({ 873 tag: sortableOptions.tag, 874 treeTag: sortableOptions.treeTag, 875 only: sortableOptions.only, 876 name: element.id, 877 format: sortableOptions.format, NEW tree: sortableOptions.tree 878 }, arguments[1] || { }); 方法,以便将findElements更改为options.tree ? true : false,因为options.treeTag ? true : false永远不会设置,因此原始测试将始终返回{ {1}},但我不确定副作用。