0

我在使用 scriptaculous lib 中的类时遇到了一些麻烦:如果我使用该属性Sortable,似乎onUpdate永远不会调用回调。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不再调用:

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

有人已经解决了吗?谢谢

4

1 回答 1

1

经过dragdrop.js源代码调试,我终于发现用于检测树修改的序列化方法仅限于根元素(但我没有调查为什么没有only属性也可以)。

基于 scriptaculous 1.9.0 版本,我可以通过修补dragdrop.js. 我发现了几种修补代码的方法:

  1. 通过修改serialize方法:该方法创建一个options对象但不使用它,除了 testing options.tree。传递给的选项Sortable.treearguments[1]我猜是一个错误。第一种修补方法包括替换arguments[1]by options(第 936 和 940 行):

    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  }
    
  2. 第二种方法包括手动添加options.tree值。这可以通过这样的tree方法完成(第 877 行和“新”):

    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 : falseintooptions.treeTag ? true : false因为options.tree从未设置,因此原始测试将始终返回false,但我不确定副作用。

于 2013-07-23T09:11:40.040 回答