在JavaScript中附加多个项目

时间:2016-04-22 15:37:06

标签: javascript html appendchild

我有以下功能,我正在尝试找出一种使用appendChild()附加多个项目的更好方法。

当用户点击“添加”时,每个项目应如下所示:

<li>
  <input type="checkbox">
  <label>Content typed by the user</label>
  <input type="text">
  <button class="edit">Edit</button>
  <button class="delete">Delete</button>
</li>

我有这个功能来添加这些元素:

function addNewItem(listElement, itemInput) {
  var listItem = document.createElement("li");
  var listItemCheckbox = document.createElement("input");
  var listItemLabel = document.createElement("label");
  var editableInput = document.createElement("input");
  var editButton = document.createElement("button");
  var deleteButton = document.createElement("button");

  // define types
  listItemCheckbox.type = "checkbox";
  editableInput.type = "text";

  // define content and class for buttons
  editButton.innerText = "Edit";
  editButton.className = "edit";
  deleteButton.innerText = "Delete";
  deleteButton.className = "delete";

  listItemLabel.innerText = itemText.value;

  // appendChild() - append these items to the li
  listElement.appendChild(listItem);
  listItem.appendChild(listItemCheckbox);
  listItem.appendChild(listItemLabel);
  listItem.appendChild(editButton);
  listItem.appendChild(deleteButton);

  if (itemText.value.length > 0) {
    itemText.value = "";
    inputFocus(itemText);
  }
}

但是你可以注意到我对appendChild()的{​​{1}}重复了三次。是否可以向listItem添加多个项目?

11 个答案:

答案 0 :(得分:41)

您可以使用DocumentFragment执行此操作。

var documentFragment = document.createDocumentFragment();
documentFragment.appendChild(listItem);
listItem.appendChild(listItemCheckbox);
listItem.appendChild(listItemLabel);
listItem.appendChild(editButton);
listItem.appendChild(deleteButton);
listElement.appendChild(documentFragment);
  

DocumentFragments允许开发人员将子元素放置在   任意节点式父节点,允许类似节点的交互   没有真正的根节点。这样做可以让开发人员生产   在可见DOM中没有这样做的结构

答案 1 :(得分:18)

您可以在JavaScript中使用append方法。

这类似于jQuery的追加方法,但它不支持IE和Edge。

您可以更改此代码

listElement.appendChild(listItem);
listItem.appendChild(listItemCheckbox);
listItem.appendChild(listItemLabel);
listItem.appendChild(editButton);
listItem.appendChild(deleteButton);

listElement.append(listItem,listItemCheckbox,listItemLabel,editButton,deleteButton);

答案 2 :(得分:5)

就个人而言,我不明白为什么要这样做。

但如果您确实需要将所有appendChild()替换为一个语句,则可以将已创建元素的outerHTML分配给innerHTML元素的li

您只需要替换以下内容:

  listElement.appendChild(listItem);
  listItem.appendChild(listItemCheckbox);
  listItem.appendChild(listItemLabel);
  listItem.appendChild(editButton);
  listItem.appendChild(deleteButton);

以下内容:

listItem.innerHTML+= listItemCheckbox.outerHTML + listItemLabel.outerHTML + editButton.outerHTML + deleteButton.outerHTML;
listElement.appendChild(listItem);

<强>解释

元素DOM接口的 outerHTML 属性获取描述元素(包括其后代)的序列化HTML片段。因此,将outerHTML创建的元素分配给innerHTML元素的li类似于将它们附加到其中。

答案 3 :(得分:4)

你需要追加几个孩子吗?只需使用appendChildren复数即可!

首先要做的事情:

HTMLLIElement.prototype.appendChildren = function () {

  for ( var i = 0 ; i < arguments.length ; i++ )

    this.appendChild( arguments[ i ] );

};

然后对于任何列表元素:

listElement.appendChildren( a, b, c, ... );

//check :
listElement.childNodes;//a, b, c, ...

适用于每个具有appendChild方法的元素!与HTMLDivElement一样。

答案 4 :(得分:2)

您可以使用createContextualFragment,它返回从字符串创建的documentFragment。 如果您必须将一个以上的@Test public void addContact(){ final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); Address a1 = new Address("grove","Waterford","Waterford","x9123r","0987654321"); Person p1 = new Person("Charlie","Ansell",a1); System.setOut(new PrintStream(outContent)); ad1.addContact("Charlie","Ansell", p1); assertEquals("\nUser: Charlie Ansell Successfully added\n".trim(), outContent.toString().trim()); } 全部构建并附加到一个现有的Node上,这是完美的选择,因为您可以添加所有这些元素而没有Element

的缺点。

https://developer.mozilla.org/en-US/docs/Web/API/Range/createContextualFragment

innerHTML

答案 5 :(得分:1)

如果您使用内置的arguments object

,则可以编写自己的函数
function appendMultipleNodes(){
  var args = [].slice.call(arguments);
  for (var x = 1; x < args.length; x++){
      args[0].appendChild(args[x])
  }
  return args[0]
}

然后你可以这样调用这个函数:

appendMultipleNodes(parent, nodeOne, nodeTwo, nodeThree)

答案 6 :(得分:1)

您可以像这样将元素分组为单个innerHTML组:

  let node = document.createElement('li');
  node.innerHTML = '<input type="checkbox"><label>Content typed by the user</label>  <input type="text"><button class="edit">Edit</button><button class="delete">Delete</button>';
  document.getElementById('orderedList').appendChild(node);

然后appendChild()仅使用一次。

答案 7 :(得分:0)

通过@Atrahasis和@Slavik合并答案:

Node.prototype.appendChildren = function() {
  let children = [...arguments];

  if (
    children.length == 1 &&
    Object.prototype.toString.call(children[0]) === "[object Array]"
  ) {
    children = children[0];
  }

  const documentFragment = document.createDocumentFragment();
  children.forEach(c => documentFragment.appendChild(c));
  this.appendChild(documentFragment);
};

它接受子节点作为多个参数或单个数组参数:

foo.appendChildren(bar1, bar2, bar3);
bar.appendChildren([bar1, bar2, bar3]);

答案 8 :(得分:0)

我想补充一点,如果您想为html添加一些可变性,还可以添加如下变量:

let node = document.createElement('div');
node.classList.add("some-class");
node.innerHTML = `<div class="list">
                  <div class="title">${myObject.title}</div>
                  <div class="subtitle">${myObject.subtitle}
                </div>`;

答案 9 :(得分:0)

让我们试试这个:

let parentNode = document.createElement('div');

parentNode.append(...[
    document.createElement('div'),
    document.createElement('div'),
    document.createElement('div'),
    document.createElement('div'),
    document.createElement('div')
]);

console.log(parentNode);

答案 10 :(得分:0)

这是一个快速修复

document.querySelector("#parentid .parenClass").insertAdjacentHTML('afterend', yourChildElement.outerHTML);