我有以下功能,我正在尝试找出一种使用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
添加多个项目?
答案 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);