最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Javascript insertBefore method cannot be called mulitple times adding same child node? - Stack Overflow

programmeradmin1浏览0评论

I tried to add same element to the HTML document multiple times, but it doesn't work, I don't know the reason. The code is following:

<html>
<body>

<div>Very</div>
<div>Secret</div>
<script>
  var elem = document.createElement('div')
  elem.innerHTML = '**Child**'

  document.body.insertBefore(elem,document.body.lastChild);
  document.body.insertBefore(elem,document.body.lastChild);
  document.body.insertBefore(elem,document.body.lastChild);
</script>
</body>
</html>

why the result is

  Very
  Secret
**Child**

instead of

  Very
  Secret
**Child**
**Child**
**Child**

I tried to add same element to the HTML document multiple times, but it doesn't work, I don't know the reason. The code is following:

<html>
<body>

<div>Very</div>
<div>Secret</div>
<script>
  var elem = document.createElement('div')
  elem.innerHTML = '**Child**'

  document.body.insertBefore(elem,document.body.lastChild);
  document.body.insertBefore(elem,document.body.lastChild);
  document.body.insertBefore(elem,document.body.lastChild);
</script>
</body>
</html>

why the result is

  Very
  Secret
**Child**

instead of

  Very
  Secret
**Child**
**Child**
**Child**
Share Improve this question asked Nov 11, 2014 at 10:48 Huibin ZhangHuibin Zhang 1,1101 gold badge16 silver badges33 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 7

DOM manipulation methods like insertBefore and appendChild move elements if they are already in DOM tree. That's why you end up with only one node appended to the end.

If you want to create three different nodes, then you have a couple of options.

1). Cloning node. Using cloneNode you can append cloned node instead of original:

var elem = document.createElement('div')
elem.innerHTML = '**Child**';

document.body.insertBefore(elem.cloneNode(true), document.body.lastChild);

Demo: http://jsfiddle/xh3nqe85/

2). String as template. You can append HTML string instead of NodeElement. The most convenient method for this manipulation is insertAdjacentHTML:

var elem = '<div>**Child**</div>';
document.body.lastElementChild.insertAdjacentHTML('afterend', elem);
document.body.lastElementChild.insertAdjacentHTML('afterend', elem);
document.body.lastElementChild.insertAdjacentHTML('afterend', elem);

Demo: http://jsfiddle/xh3nqe85/1/

You should create the element for three times.

In the way you did you are just creating one element and setting it three times:

    function myFun() {
        var elem = document.createElement('div')
        elem.innerHTML = '**Child**'
        return elem;
    }
    document.body.insertBefore(myFun(), document.body.lastChild);
    document.body.insertBefore(myFun(), document.body.lastChild);
    document.body.insertBefore(myFun(), document.body.lastChild);

http://jsfiddle/6zppunvv/

When you append a node to a different node, you aren't cloning it.

See the Node.cloneNode method to actually clone a node.

Try to clone the node.

var elem = document.createElement('div')
elem.innerHTML = '**Child**'

document.body.insertBefore(elem,document.body.lastChild);
document.body.insertBefore(elem.cloneNode(true),document.body.lastChild);
document.body.insertBefore(elem.cloneNode(true),document.body.lastChild);
发布评论

评论列表(0)

  1. 暂无评论