我可以轻松地用jQuery交换两个元素吗?
如果可能的话,我希望用一行来做这件事.
我有一个选择元素,我有两个按钮可以向上或向下移动选项,我已经选择了目标选择器,我用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 = $('').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 = $(""); // 3-step swap $this.before($temp); $that.before($this); $temp.after($that).remove(); return $this; }1)
temp
之前放临时divthis
2)
this
之前搬家that
3)
that
之后移动temp
3b)删除
temp
然后简单
$(selectorA).swapWith(selectorB);演示:http://codepen.io/anon/pen/akYajE
这是最好的答案,所有其他假定元素都彼此相邻。这在任何情况下都有效。
6> Matthew Wilc..:你不应该需要两个克隆,一个会做.以Paolo Bergantino为例,我们有:
jQuery.fn.swapWith = function(to) { return this.each(function() { var copy_to = $(to).clone(true); $(to).replaceWith(this); $(this).replaceWith(copy_to); }); };应该更快.传递两个元素中较小的元素也应该加快速度.
这个和Paolo的问题在于,他们不能用ID交换元素,因为ID必须是唯一的,因此克隆不起作用.Bobince的解决方案在这种情况下确实有效.
7> Eric Warnke..:我之前使用过这样的技术.我将它用于http://mybackupbox.com上的连接器列表
// clone element1 and put the clone before element2 $('element1').clone().before('element2').end(); // replace the original element1 with element2 // leaving the element1 clone in it's place $('element1').replaceWith('element2');推荐阅读
如何解决《如何从链接打开应用程序而不要求用户在浏览器或应用程序之间做出决定,只需立即打开我的应用程序》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何避免Free内部函数破坏函数结果?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《PHP命名空间类命名约定》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何获得调用者的方法名称》经验,为你挑选了1个好方法。 ... [详细] 如何解决《从JavaFXLabel中删除填充/边距》经验,为你挑选了2个好方法。 ... [详细] 如何解决《基于Gradle规则的模型嵌套bean语法》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何在使用MavenBOM文件时指定插件依赖项的版本》经验,为你挑选了1个好方法。 ... [详细] 如何解决《删除Python中列表中某些字符的元素》经验,为你挑选了2个好方法。 ... [详细] 如何解决《在静态类中使用随机数》经验,为你挑选了1个好方法。 ... [详细] 如何解决《空openCL程序抛出弃用警告》经验,为你挑选了1个好方法。 ... [详细] 如何解决《传递null时应用默认的groovy方法参数值》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Laravel&Carbon-循环数据范围》经验,为你挑选了1个好方法。 ... [详细] 如何解决《iOS-无法从其dataSource获取单元格》经验,为你挑选了1个好方法。 ... [详细] 如何解决《单元测试;正确的做法?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《手动触发Sensu事件》经验,为你挑选了1个好方法。 ... [详细] 如何解决《SteamAPI登录无效-还有其他方法吗?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《为什么我们需要两个定义:整数常量表达式和转换常量表达式?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《使用Git和IntelliJIDEA保持两个不同更改列表中的一个文件的更改》经验,为你挑选了1个好方法。 ... [详细] 吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1"哎呀,发生错误!代码:201601301501048 .."在TYPO3 7.6中
- 2Android - 删除主页和导航按钮
- 3OrientDB如何在一个查询中获取顶点及其边的结果集
- 4启动Jboss Wildfly 9.02服务器时出现并发超时异常
- 5在Iex中是否有默认启用千位分组(100_000)的Switch
- 6如何调整SVG剪辑路径的大小?
- 7pandas - 按列名掩盖数据帧
- 8比较传递null int String和Integer构造函数
- 9QString - 嵌入16位的UTF8?
- 10滑动效果像inshorts新闻应用程序
- 11AngularJS - 在私有函数中使用'this'
- 12隐藏另一个布局的浮动操作按钮
- 13从ec2 Linux AMI连接到RDS MySQL实例-找不到mysql命令
- 14以编程方式重启app?
- 15AWS是否支持RDS Insance的自动扩展
- 16用于HTTP通信的出站通道适配器与出站网关
- 17尽管驱动程序/客户端与服务器版本完全相同,但Spark中的java.util.concurrent.RejectedExecutionException
- 18使用过滤器的Android BLE设备扫描无效
- 19回调到notifyDataSetChanged
- 20python类属性为pandas数据帧
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有