HTML中appendChild和innerHTML的区别

本文对比了innerHTML与appendChild两种DOM操作方法的性能表现,通过实验发现,在大量数据更新时,appendChild展现出更好的性能优势。此外还介绍了这两种方法在不同场景下的适用性及注意事项。

1、在执行速度的比较上,使用appendChild比innerHTML要快,特别是内容包括html标记时,appendChild明显要快于innerHTML,这可能是因为innerHTML在铺到页面之前还要对内容进行解析才能铺到页面上,当包含html标记过多时,innerHTML速度会明显变慢。
可运行下面的代码测试:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title> new document </title>
  <meta name="generator" content="editplus" />
  <meta name="author" content="" />
  <meta name="keywords" content="" />
  <meta name="description" content="" />
</head>

<body>
<div id="test1"></div>
<input type="button" onclick="innerTest()" value="testInnerHTML">
<div id="test2"></div>
<input type="button" onclick="appendTest()" value="testAppendChild">

  <script type="text/javascript">
  <!--
  function innerTest(){
    var t1=(new Date()).getTime();
    var a="<b>xxxxxxxx</b>";
    var b=document.getElementByIdx("test1");
    for(var i=0;i<500;i++){
      b.innerHTML+=a;
    }
 t2 = (new Date()).getTime();
    alert(t2-t1);
  }

  function appendTest(){
    var t1=(new Date()).getTime();
    var b=document.getElementByIdx("test2");
    for(var i=0;i<500;i++){
      var a=document.createElement("b");
      a.appendChild(document.createTextNode("xxxxxxxx"));
      b.appendChild(a);
    }
 t2 = (new Date()).getTime();
    alert(t2-t1);
  }
  //-->
  </script>
</body>
</html>


2、如果appendChild的参数是页面存在的一个元素,则执行后原来的元素会被移除,如document.getElement("a").appendChild(document.getElementByIdx("b")),执行后,b元素会先被移除,然后再添加到a中。
3、通过appendChild添加到的是dom对象,返回的也是dom对象,可以通过dom对象访问获取元素的各种属性,而innerHTML则是纯字符串,不能获取内部元素的属性。
4、在使用上innerHTML比appendChild要方便,特别是创建的节点属性多,同时还包含文本的时候。

因此在使用时如果数据量较大且对性能有所要求时,还是应该使用appendChild。

5.IE6-9中innerHtml部分元素只读:The innerHTML property is read-only on the colcolGroupframeSethtmlheadstyletabletBodytFoottHeadtitle, and tr objects.

6.用appendChild加入<script>会被执行,innerhtml不会。


http://blog.sina.com.cn/s/blog_3cdfaea2010085q1.html

http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx



<think>嗯,用户问的是在HTML中如何增加删除元素。首先,我需要回忆一下HTMLDOM操作的相关知识。用户可能是指通过JavaScript来动态地添加或移除页面上的元素,因为单纯的HTML是静态的,无法直接进行动态操作。 我应该先解释用JavaScript的方法。添加元素通常包括几个步骤:创建元素、设置属性、添加到DOM中。比如createElement、appendChild这些方法。删除的话可能是removeChild或者remove()方法。 然后,要考虑用户可能的水平。他们可能对JavaScript不太熟悉,所以需要给出具体的例子,比如创建新段落,或者删除某个特定的div。代码示例要简洁明了,用中文注释可能更好。 还要注意提到现代的方法,比如insertAdjacentHTML,或者remove()直接使用,这样用户知道有更简便的方式。同时,提醒innerHTML的性能问题,比如重绘重排,或者XSS风险,这样用户能意识到潜在的问题。 用户的问题可能不仅仅是语法,他们可能想知道实际应用场景,比如动态列表、表单添加条目等。所以举一些实际例子会有帮助,比如待办事项列表,添加或删除任务。 另外,是否需要提到jQuery?虽然现在主流是原生JS,但可能有些旧项目还在用,可以稍微提一下,但重点放在原生方法上。 结构方面,先介绍添加元素,再删除,然后例子,最后注意事项。确保步骤清晰,用户能一步步跟着操作。同时,要检查术语是否正确,比如节点、父元素等,避免混淆。 可能用户还会想知道事件处理,比如点击按钮触发添加或删除,所以示例中包含按钮的onclick事件会更好。比如在添加示例中,创建一个按钮,点击时执行函数,将新元素添加到某个容器里。 需要确保代码正确,比如document.createElement('p')之后,设置textContent,然后append到某个存在的元素中。删除的时候,可能需要获取父元素,然后调用removeChild,或者直接用元素的remove方法。 最后,检查是否有遗漏,比如insertBefore方法,或者其他插入位置的方法,比如append是加到末尾,prepend是前面,insertAdjacentHTML的位置参数。是否需要简要说明这些区别? 总结一下,回答的结构应该是: 1. 添加元素的步骤方法,包括createElement、appendChild、insertAdjacentHTML。 2. 删除元素的步骤方法,removeChildremove()。 3. 实际示例,用代码演示添加删除。 4. 注意事项,如性能安全问题。 5. 应用场景举例,如动态列表。 这样用户能有一个全面的理解,并且可以自己动手尝试。</think>在 HTML 中动态添加删除元素需要通过 JavaScript 操作 DOM(文档对象模型)。以下是具体实现方法示例: --- ### 一、添加元素的常用方法 #### 1. **`createElement()` + `appendChild()`** ```javascript // 创建新元素 const newDiv = document.createElement('div'); newDiv.textContent = '我是新添加的div'; // 追加到父元素末尾 document.body.appendChild(newDiv); ``` #### 2. **`insertAdjacentHTML()` 快速插入** ```javascript // 在某个元素前/后插入 HTML 片段 const container = document.getElementById('container'); container.insertAdjacentHTML('beforeend', '<p>新增的段落</p>'); ``` - 参数位置可选:`beforebegin`, `afterbegin`, `beforeend`, `afterend` #### 3. **克隆元素 `cloneNode()`** ```javascript const original = document.querySelector('.item'); const clonedNode = original.cloneNode(true); // true 表示深度克隆 document.body.appendChild(clonedNode); ``` --- ### 二、删除元素的常用方法 #### 1. **`removeChild()`** ```javascript const parent = document.getElementById('parent'); const child = document.getElementById('child-to-remove'); parent.removeChild(child); ``` #### 2. **直接 `remove()`** ```javascript const element = document.getElementById('element-to-remove'); element.remove(); // 现代浏览器支持 ``` --- ### 三、实际应用示例 #### 动态列表操作 ```html <ul id="todo-list"> <li>任务1</li> </ul> <button onclick="addItem()">添加任务</button> <button onclick="removeLastItem()">删除最后一项</button> <script> function addItem() { const list = document.getElementById('todo-list'); const newItem = document.createElement('li'); newItem.textContent = `任务${list.children.length + 1}`; list.appendChild(newItem); } function removeLastItem() { const list = document.getElementById('todo-list'); if (list.children.length > 0) { list.lastChild.remove(); } } </script> ``` --- ### 四、注意事项 1. **性能优化**:频繁操作 DOM 会导致页面重绘/重排,建议批量操作(如使用 `DocumentFragment`)。 2. **事件绑定**:动态添加的元素需通过事件委托(`event delegation`)绑定事件。 3. **安全风险**:直接使用 `innerHTML` 可能引发 XSS 攻击,推荐优先使用 `textContent`。 --- 通过以上方法,可以实现网页内容的动态增删,常见于表单提交、列表管理、交互式组件等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值