JavaScript 在 DOM 中移动元素

IT技术 javascript jquery dom
2021-02-19 05:19:50

假设我<div>在一个页面上有三个元素。如何交换第一个和第三个的位置<div>jQuery 很好。

6个回答

没有必要为这样一个微不足道的任务使用库:

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的事实,该 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]));

例如 :-)

是的,但谁只做这件事呢?
2021-04-16 05:19:50
@everybody:原始问题询问如何在具有三个 div 的页面上交换第三个和第一个 div。那是我回答的问题。如果 OP 有更复杂的问题,他们应该问它,他们会得到更复杂的答案;-)
2021-04-23 05:19:50
是的,但很难与 jQuery 之类的东西提供的优雅和可读性争论不休——更不用说开箱即用的增强功能了。
2021-04-25 05:19:50
这会中断附加到这些元素的事件处理程序吗?
2021-04-30 05:19:50
如果有人在 2014 年寻找这个,请考虑这个答案。jQuery 在那个时候很有用,但现在它不再那么有用了,因为浏览器是标准化的,所以不需要添加一个 80 kb 的库来完成这样一个简单的任务。此外,在没有 jQuery 的情况下尝试之前,您不会知道 DOM 到底是什么:)
2021-05-04 05:19:50

使用jQuery 很简单

$('#div1').insertAfter('#div3');
$('#div3').insertBefore('#div2');

如果您想重复执行此操作,则需要使用不同的选择器,因为 div 在四处移动时将保留其 ID。

$(function() {
    setInterval( function() {
        $('div:first').insertAfter($('div').eq(2));
        $('div').eq(1).insertBefore('div:first');
    }, 3000 );
});
@Vikita - 是的,保存原始 HTML 然后恢复它。如果任何处理程序已被直接应用而不是委托给更高的元素,则您可能必须重新应用它们。例如,var html = $('#container').html(); ...; $('#container').html(html);
2021-04-19 05:19:50
大家好,一个简单的问题:一旦上述 jquery 功能完成,有没有一种简单的方法可以重置回原始的 Dom 状态?
2021-04-20 05:19:50
@Ionut——关键在于它取决于元素的相对定位。更改顺序后,您将无法再通过 ID 找到第一个和第三个,需要另辟蹊径。我的回答只是为了说明完成所请求任务的方法的功能,而不是将一组中的第一个和第三个 div 交换任意次数的综合解决方案。
2021-04-23 05:19:50

。之前和之后

使用现代香草 JS!比以前更好/更清洁。无需引用父项。

const div1 = document.getElementById("div1");
const div2 = document.getElementById("div2");
const div3 = document.getElementById("div3");

div2.after(div1);
div2.before(div3);

支持所有现代浏览器!

浏览器支持

您不必编写可维护性较差的代码来支持使用旧浏览器或不符合标准的用户。除非你在企业工作,否则很少有用户会错过
2021-04-17 05:19:50
那么27%的用户是几个用户我们在谈论数百万!
2021-04-18 05:19:50
一年后,这个数字将接近 10%。它主要是企业、政府和较旧的移动设备。这通常意味着非个人设备或技术含量较低的用户。答案应该是前瞻性的,这样我们就不会在 2009 年陷入困境。
2021-04-24 05:19:50
将来,Microsoft 将不再支持 IE(尽管我敢肯定,开发人员仍然在睡梦中困扰着他们),所以这是最好和最简单的答案:)
2021-05-07 05:19:50
尚不支持 Internet Explorer。
2021-05-09 05:19:50
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');

如果您不想使用 jQuery,您可以轻松地调整该功能。

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 已经在树中,则首先将其删除。