用一个简单的函数重新排列元素
Rearranging elements with a simple function
function rearrange(x, y) {
x.parentNode.replaceChild(x, y);
x.parentNode.insertBefore(y,x);
}
如果我这样做
var a = document.getElementsByClassName('btn-button-google')[0];
var b = document.getElementsByClassName('btn-button-doodle')[0];
rearrange(b,a);
我得到以下错误
NotFoundError: Failed to execute 'replaceChild' on 'Node': The node to be replaced is not a child of this node.
我理解,因为a是在一个htmldiv和b是在另一个div,但我很好奇如何解决这个问题。这是
rearrange(b.parentNode,a.parentNode);
因为它们在同一个节点。
HTML例子
<div class="container">
<div class="group">
<a href="" class="btn-button-bold"><a>
<a href="" class="btn-button-italic"><a>
<a href="" class="btn-button-strike"><a>
</div>
<div class="group">
<a href="" class="btn-button-font"><a>
<a href="" class="btn-button-ffamily"><a>
<a href="" class="btn-button-google"><a>
</div>
<div class="group">
<a href="" class="btn-button-smilies"><a>
<a href="" class="btn-button-doodle"><a>
<a href="" class="btn-button-source"><a>
</div>
</div>
.replaceChild
方法接受替换作为第一个参数,将要替换的子元素作为第二个参数。你把它们颠倒了,这就导致了错误。
此外,如果目的是交换,则需要保留对y
原始位置的引用,因为一旦移动它,它将被遗忘。
这将在大多数情况下工作:
var yPar = y.parentNode, ySib = y.nextSibling;
x.parentNode.replaceChild(y, x);
yPar.insertBefore(x, ySib);
请记住,还有一个问题需要考虑。只要两个节点有不同的父节点,这就不是问题,但是如果它们共享父节点,并且彼此相邻,并且缓存的nextSibling
与x
相同,那么它就没有影响。因此,如果可能的话,您需要对此进行测试,并处理这种特殊情况。
相关文章:
- 如何删除多行HTML排列中的空白
- 重新排列HTML元素的顺序并更改内容
- 如何使用排列运算符来获取具有命名参数的函数的所有参数
- 从数组中删除重复条目,并在javascript中按顺序排列
- 使用CSS从下到上排列元素
- 我可以't在Divs中获得3个twitter小部件,以便并排排列
- Javascript从数组中随机选择并按字母顺序排列
- 如何在php中按元素按字母顺序排列json文件
- Javascript/jQuery:如何从数组的项中获取排列
- 如何在方向更改时重新调整/排列布局(Apache Cordova)
- 有没有比在本例中使用matchMedia更聪明的方法来重新排列页面元素
- 如何根据 js 中每个单词的第 n 个字母按字母顺序排列列表
- 响应式列表,可在浏览器缩小时重新排列
- Javascript将生日按数组顺序排列
- 比较两个JSON数组并重新排列新的JSON数组格式
- 允许用户在HTML页面上重新排列排列的图像
- 阵列排列排列
- Javascript为jquery选择器重新排列数组
- 砌体重新排列,同时仍然调整大小
- 允许用户重新排列 Django 管理站点中的条目,以及如何存储新的自定义顺序以在页面刷新中幸存下来