我可以用 jQuery 轻松交换两个元素吗?
如果可能的话,我希望用一条线来做到这一点。
我有一个 select 元素,我有两个按钮可以向上或向下移动选项,而且我已经有了 selected 和 destination 选择器,我用 if 来做,但我想知道是否有更简单的方法。
我可以用 jQuery 轻松交换两个元素吗?
如果可能的话,我希望用一条线来做到这一点。
我有一个 select 元素,我有两个按钮可以向上或向下移动选项,而且我已经有了 selected 和 destination 选择器,我用 if 来做,但我想知道是否有更简单的方法。
我找到了一种有趣的方法来仅使用 jQuery 来解决这个问题:
$("#element1").before($("#element2"));
或者
$("#element1").after($("#element2"));
:)
保罗是对的,但我不确定他为什么要克隆相关元素。这并不是真正必要的,并且会丢失与元素及其后代关联的任何引用或事件侦听器。
这是一个使用普通 DOM 方法的非克隆版本(因为 jQuery 实际上没有任何特殊功能来简化此特定操作):
function swapNodes(a, b) {
var aparent = a.parentNode;
var asibling = a.nextSibling === b ? a : a.nextSibling;
b.parentNode.insertBefore(a, b);
aparent.insertBefore(b, asibling);
}
不,没有,但你可以掀起一个:
jQuery.fn.swapWith = function(to) {
return this.each(function() {
var copy_to = $(to).clone(true);
var copy_from = $(this).clone(true);
$(to).replaceWith(copy_from);
$(this).replaceWith(copy_to);
});
};
用法:
$(selector1).swapWith(selector2);
请注意,这只适用于每个选择器仅匹配 1 个元素的情况,否则可能会产生奇怪的结果。
这个问题有很多边缘情况,它们没有被接受的答案或 bobince 的答案处理。其他涉及克隆的解决方案都在正确的轨道上,但克隆既昂贵又不必要。我们很想进行克隆,因为如何交换两个变量是一个古老的问题,其中一个步骤是将其中一个变量分配给一个临时变量。在这种情况下不需要分配(克隆)。这是一个基于 jQuery 的解决方案:
function swap(a, b) {
a = $(a); b = $(b);
var tmp = $('<span>').hide();
a.before(tmp);
b.before(a);
tmp.replaceWith(b);
};
对于一般情况,这些答案中的许多答案都是错误的,其他答案即使实际上有效,也会不必要地复杂化。jQuery.before
和.after
方法可以完成您想做的大部分事情,但是您需要像许多交换算法一样工作的第三个元素。这非常简单 - 在您四处移动时制作一个临时 DOM 元素作为占位符。不用看父母兄弟姐妹,更不用克隆……
$.fn.swapWith = function(that) {
var $this = this;
var $that = $(that);
// create temporary placeholder
var $temp = $("<div>");
// 3-step swap
$this.before($temp);
$that.before($this);
$temp.after($that).remove();
return $this;
}
1) 把临时 div 放在temp
前面this
2)移动this
之前that
3)移动that
之后temp
3b) 删除 temp
然后简单地
$(selectorA).swapWith(selectorB);