DOM中的JavaScript移动元素

cor*_*ore 88 javascript jquery dom

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

Nic*_*itz 159

没有必要使用库来执行这样一个简单的任务:

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
Run Code Online (Sandbox Code Playgroud)

这考虑了这样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
Run Code Online (Sandbox Code Playgroud)

如果您想要尝试,还有其他各种可能的排列:

divs[0].parentNode.appendChild(divs[0].parentNode.replaceChild(divs[2], divs[0]));
Run Code Online (Sandbox Code Playgroud)

例如 :-)

  • @everybody:原始问题询问如何在具有三个div的页面上交换第三个和第一个div.那是我回答的问题.如果OP有一个更复杂的问题,他们应该问它,他们会得到一个更复杂的答案;-) (32认同)
  • 如果有人在2014年寻找这个,请考虑这个答案.jQuery当时很有用,但现在它已经不再那么有用了,因为浏览器是标准化的,所以不需要添加一个80kb的库来完成这么简单的任务.另外,在没有jQuery的情况下尝试之前,你不会知道DOM到底是什么:) (21认同)
  • 没错,但很难说像jQuery这样的优雅和可读性 - 更不用说开箱即用的增强功能了. (14认同)
  • 也就是说,裸编码方法的+1. (14认同)
  • 是的,但谁只做这一件事? (12认同)
  • 这会中断附加到这些元素的事件处理程序吗? (2认同)

tva*_*son 104

jQuery琐碎

$('#div1').insertAfter('#div3');
$('#div3').insertBefore('#div2');
Run Code Online (Sandbox Code Playgroud)

如果你想重复这样做,你需要使用不同的选择器,因为div会在它们移动时保留它们的ID.

$(function() {
    setInterval( function() {
        $('div:first').insertAfter($('div').eq(2));
        $('div').eq(1).insertBefore('div:first');
    }, 3000 );
});
Run Code Online (Sandbox Code Playgroud)


Gib*_*olt 13

.之前和之后

使用现代香草JS!比以前更好/更清洁的方式

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

div2.after(div1);
div2.before(div3);
Run Code Online (Sandbox Code Playgroud)

浏览器支持 - 截至2008年3月全球84%,美国87%

  • 您不必编写较少可维护的代码来支持旧版或不符合标准的浏览器上的人.除非您在企业中工作,否则很少有用户会错过 (6认同)
  • 将来,微软将不再支持 IE(尽管我确信仍然困扰着开发人员),所以这是最好、最简单的答案:) (6认同)
  • 那么 27% 的用户是“少数用户”?我们正在谈论数百万! (2认同)
  • 一年后,这个数字将接近10%。它主要是企业,政府和较旧的移动设备。这通常意味着非个人设备或技术倾向较低的用户。答案应该是前瞻性的,这样我们就不会在2009年陷入困境。 (2认同)

Dar*_*rov 10

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; 
};
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

$('#div1').swap('#div2');
Run Code Online (Sandbox Code Playgroud)

如果你不想使用jQuery,你可以很容易地适应这个功能.


Ion*_*tan 5

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);
};
Run Code Online (Sandbox Code Playgroud)

这个功能可能看起来很奇怪,但它很大程度上依赖于标准才能正常运行.事实上,它似乎比tvanfosson发布的jQuery版本更好,它似乎只进行了两次交换.

它依赖什么标准特性?

insertBefore在现有子节点refChild之前插入节点newChild.如果refChild为null,则在子项列表的末尾插入newChild.如果newChild是DocumentFragment对象,则在refChild之前以相同的顺序插入其所有子项.如果newChild已经在树中,则首先将其删除.