列表项未正确插入

时间:2017-04-21 18:15:52

标签: javascript

我遇到问题我想用javascript创建一个列表项。我正在做的是首先附加一个列表项。之后插入新的列表项。但是为什么它没有按照订单插入物品。



var refrenceNode = document.querySelector('#list');
    var newlistitem;
    var check = false;
    var o1 = {x: 1, y: 200, z: 500, a: 900};

    function extendSerialize(obj) {
        for (var property in obj) {
            if (!check) {
                newlistitem = refrenceNode.appendChild(document.createElement('li'));
                newlistitem.innerHTML = obj[property];
                check = true;
            }
            else {
                newlistitem.parentNode.insertBefore(document.createElement('li'), newlistitem.nextSibling).innerHTML = obj[property];
            }

        }
    }

    extendSerialize(o1);

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<ul id="list"></ul>
</body>
</html>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

无法保证对象的属性顺序,您应该使用数组。这样的东西可能有用,如果你需要属性名,你可以使用一个小对象数组

var refrenceNode = document.querySelector('#list');
var newlistitem;
var check = false;
var o1 = [1, 200, 500, 900];

function extendSerialize(arr) {
    for (var i = 0; i < arr.length; i++) {
        var item = arr[i];
        if (!check) {
            newlistitem = refrenceNode.appendChild(document.createElement('li'));
            newlistitem.innerHTML = item;
            check = true;
        }
        else {
            newlistitem.parentNode.insertBefore(document.createElement('li'), newlistitem.nextSibling).innerHTML = item;
        }

    }
}

extendSerialize(o1);

答案 1 :(得分:0)

简单地说,这将做你想做的事情。 insertBefore导致你可能不必要的头痛。

var referenceNode = document.querySelector('#list');
var o1 = {
  x: 1,
  y: 200,
  z: 500,
  a: 900
};

function extendSerialize(obj) {
  for (var property in obj) {
    var el = document.createElement("li");
    el.innerText = obj[property];
    referenceNode.appendChild(el);
  }
}

extendSerialize(o1);
<ul id="list"></ul>

我已经接受了你的代码并对其进行了评论,完全按照原样保留了它:

var refrenceNode = document.querySelector('#list');
var newlistitem;
var check = false;
var o1 = {
  x: 1,
  y: 200,
  z: 500,
  a: 900
};

function extendSerialize(obj) {
  for (var property in obj) {
    if (!check) {
      // As check is set to FALSE, we'll create an LI
      newlistitem = refrenceNode.appendChild(document.createElement('li'));
      newlistitem.innerHTML = obj[property];
      check = true;
    } else {
    /****
     *  So here the check is true, we have a single LI,
     * and we want to use insertBefore. Here's a gotcha:
     * The first insertBefore the nextSibling will insert
     * AFTER the first list item. Every other LI will be
     * inserted BEFORE the SECOND LI, IN REVERSE ORDER.
     ****/
    newlistitem.parentNode.insertBefore(document.createElement('li'), newlistitem.nextSibling).innerHTML = obj[property];
    }

  }
}

extendSerialize(o1);
<ul id="list"></ul>