我正在编写一个jquery插件,它获取一个表并允许更改列顺序 将位于oldIndex中的列置于newIndex位置的代码为:
table.find('> thead > tr, > tbody > tr').each(function() {
var row = $(this);
var children = row.children();
var source = $(children[oldIndex ]);
var destination = $(children[newIndex ]);
if (oldIndex != newIndex ) {
destination
.replaceWith(source)
.appendTo(row);
}
});
问题是每个td都有来自此代码之外的事件。使用replaceWith
时,会删除这些事件。
任何想法都可以替换DOM元素的位置并保留其事件吗?
答案 0 :(得分:2)
确保绑定的函数附加到要移动的元素。
我建议使用逻辑交换列,而不是使用replaceWith
。 .eq
用于选择特定列的索引,.after()
和.before()
用于交换列:
// Indexes are zero-based
var oldIndex = 1; // = Second column
var newIndex = 2; // = Third column
var table = $('table');
if (oldIndex != newIndex) {
if (oldIndex > newIndex) {
// Let newIndex always be higher than oldIndex
var tmp = oldIndex;
oldIndex = newIndex;
newIndex = oldIndex;
}
table.find('> thead > tr, > tbody > tr').each(function() {
//or:table.children('thead,tbody').children().each(function() {
var row = $(this);
var children = row.children();
var right = children.eq(newIndex);
var left = children.eq(oldIndex);
children.eq(newIndex).after(left);
if (newIndex != oldIndex+1) {
// If they're next to each other, don't swap the columns
children.eq(oldIndex+1).before(right);
}
});
}
答案 1 :(得分:1)
怎么样:
if (oldIndex != newIndex ) {
var tmp = $('<td>').insertBefore(destination); // create tmp td before destination
source.after(destination); // move destination after source
tmp.after(source).remove(); // move source after tmp, remove tmp
}
编辑:上面的代码交换2 td
s,这与提出的内容不同(移动单个td
)。
无论事件有什么问题,如果您想在source
之前移动destination
,只需执行source.insertBefore(destination)
或destination.before(source)
。在您的代码中,您将destination
移至tr
的末尾。