我在使用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")) },
});
有没有人已经解决了这个问题? 感谢
答案 0 :(得分:1)
在dragdrop.js
源代码中进行一些调试后,我终于发现用于检测树上修改的序列化方法仅限于根元素(但我没有调查为什么没有{{1} })。
基于scriptaculous 1.9.0版本,我可以通过修补only
来修复它。我找到了几种修补代码的方法:
通过修改dragdrop.js
方法:此方法创建serialize
对象但不使用它,但测试options
除外。传递给options.tree
的选项是Sortable.tree
,我猜这是一个错误。第一种修补方法是将arguments[1]
替换为arguments[1]
(第936行和第940行):
options
第二种方法包括手动添加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
还可以修复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}},但我不确定副作用。