假设我在页面上有三个 <div>
元素。如何交换第一个和第三个 <div>
的位置?使用 jQuery 可以实现。
假设我在页面上有三个 <div>
元素。如何交换第一个和第三个 <div>
的位置?使用 jQuery 可以实现。
这样一个琐碎的任务没有必要使用库:
var divs = document.getElementsByTagName("div"); // order: first, second, third
divs[2].parentNode.insertBefore(divs[2], divs[0]); // order: third, first, second
divs[2].parentNode.insertBefore(divs[2], divs[1]); // order: third, second, first
这里考虑了一个事实,即 getElementsByTagName
返回的是一个实时更新的 NodeList,它会自动根据 DOM 中元素的操作顺序进行更新。
另外,您也可以使用:
var divs = document.getElementsByTagName("div"); // order: first, second, third
divs[0].parentNode.appendChild(divs[0]); // order: second, third, first
divs[1].parentNode.insertBefore(divs[0], divs[1]); // order: third, second, first
如果你想尝试,还有许多其他可能的排列组合:
divs[0].parentNode.appendChild(divs[0].parentNode.replaceChild(divs[2], divs[0]));
例如 :-)
使用jQuery很简单。
$('#div1').insertAfter('#div3');
$('#div3').insertBefore('#div2');
如果您想重复执行此操作,您需要使用不同的选择器,因为当
$(function() {
setInterval( function() {
$('div:first').insertAfter($('div').eq(2));
$('div').eq(1).insertBefore('div:first');
}, 3000 );
});
var html = $('#container').html(); ...; $('#container').html(html);
- tvanfosson使用现代原生 JS!比以前更好/更干净。无需引用父元素。
const div1 = document.getElementById("div1");
const div2 = document.getElementById("div2");
const div3 = document.getElementById("div3");
div2.after(div1);
div2.before(div3);
所有现代浏览器都受支持!
jQuery.fn.swap = function(b){
b = jQuery(b)[0];
var a = this[0];
var t = a.parentNode.insertBefore(document.createTextNode(''), a);
b.parentNode.insertBefore(a, b);
t.parentNode.insertBefore(b, t);
t.parentNode.removeChild(t);
return this;
};
并且像这样使用:
$('#div1').swap('#div2');
var swap = function () {
var divs = document.getElementsByTagName('div');
var div1 = divs[0];
var div2 = divs[1];
var div3 = divs[2];
div3.parentNode.insertBefore(div1, div3);
div1.parentNode.insertBefore(div3, div2);
};
这个函数可能看起来很奇怪,但它严重依赖标准才能正常运行。实际上,它似乎比tvanfosson发布的jQuery版本更好地执行了交换,后者只执行了两次。
它依赖于哪些标准特性?
insertBefore 在现有子节点refChild之前插入节点newChild。如果refChild为null,则在子节点列表末尾插入newChild。 如果newChild是DocumentFragment对象,则所有子节点都按相同顺序在refChild之前插入。如果newChild已经在树中,则首先将其删除。
抱歉顶了这个帖子。 我遇到了“交换 DOM 元素”的问题并进行了一些尝试
结果是一个 jQuery 原生的“解决方案”,看起来非常漂亮(不幸的是,我不知道在执行此操作时 jQuery 内部发生了什么)
代码:
$('#element1').insertAfter($('#element2'));
insertAfter()
方法移动元素而不是克隆它。在顶部提到的JQuery方法是可行的。 您还可以使用JQuery和CSS。例如,在Div one上应用了class1,在div2上应用了class2(例如,每个CSS类在浏览器上提供特定位置),现在您可以使用jQuery或JavaScript交换类(这将更改位置)