创建、插入和删除元素

  创建DOM元素:

    createElement(标签名);  //创建一个节点

    appendChild(节点);    //追加一个节点  例如:document.body.appendChild(oDiv);  //把div插入到body中,并且位于末尾

    举例:为<ul>插入<li>,如上传文件时,即为创建一个DOM元素    

var oBtn1=document.getElementById('btn1');
    var oUl=document.getElementById('ul1');
    var oTxt=document.getElementById('txt1');
    //该点击事件相当于:点击第一次,新建一个标签;再点击,就会在其下面创建,一直点击,一直在最下面创建     oBtn.onclick=function () {
       var oLi1=document.createElement('li'); //创建li标签
      oLi1.innerHTML=oTxt.value; //输出li标签内的内容
      oUl.appendChild(oLi1); //父级.appendChild(子节点); 在父级下创建子节点,每次创建的子节点都会往下排,第一次创建的在第一个位置,第二次创建的在第二个位置,依次类推
    };      <input id="txt1" type="text"/>
    <button id="btn1">创建li</button>
    <ul id="ul1"></ul>  

  插入元素

    insertBefore(节点, 原有节点);  //在原有的元素前插入节点,即在原有的标签前插入标签

    举例:倒序插入<li>    

var oBtn2=document.getElementById('btn2');

    var oUl=document.getElementById('ul1');

    var oTxt=document.getElementById('txt1');

    //该点击事件相当于:点击第一次,在最上面新建一个标签,每次点击,都会在最上面创建标签
    oBtn2.onclick=function () {
      var oLi2=document.createElement('li'); //创建li标签
      var aLi=oUl.getElementsByTagName('li');
      oLi2.innerHTML=oTxt.value; //输出li标签内的内容
      //oUl.insertBefore(oLi2, aLi[0]); //父级.insertBefore(子节点, 在谁之前); 即在第一个位置插入li标签
      //注意:上面一句语句在IE浏览器中会报错,因为ul标签内原本什么都没有,所以也就不存在第一个aLi[0],所以报错,此时的解决办法为
      if (aLi.length>0){
        oUl.insertBefore(oLi2, aLi[0]);
      } else {
        oUl.appendChild(oLi2);
      }
    };       <input id="txt1" type="text"/>
   <button id="btn2">插入li</button>
   <ul id="ul1"></ul>

  删除DOM元素:  

    removeChild(节点);  //删除一个节点

    举例:删除<li>,如上传文件时,又不想上传了,此时的删除按钮,即为把原来创建的DOM元素,给删除掉    

//删除子节点
    var aA=document.getElementsByTagName('a');
    var oUl3=document.getElementById('ul3');     for (var i=0; i<aA.length; i++){
      aA[i].onclick=function () {
        // alert(this.parentNode); //返回[object HTMLLIElement],表示<a>的父级为<li>
        oUl3.removeChild(this.parentNode); //父级.removeChild()
      };
    }     <ul id="ul3">
      <li>abcd<a href="javascript:;">删除</a></li>
      <li>efg<a href="javascript:;">删除</a></li>
      <li>hijk<a href="javascript:;">删除</a></li>
      <li>lmn<a href="javascript:;">删除</a></li>
      <li>opq<a href="javascript:;">删除</a></li>
      <li>rst<a href="javascript:;">删除</a></li>
    </ul>

  查找DOM节点:getElementById()、getElementByTagName()

  替换DOM节点:replaceChild(新标签, 原标签);  //用新标签替换掉原有标签

    var oSapn = document.createElement('span');  var oBox = document.getElementById('div');   document.body.replaceChild(oSpan, oBox);

  

  新建、插入、删除综合实例:  

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>
.oli{width: 300px; height: 35px; color: #FFFFFF; background-color: #004488; margin-bottom: 1px; padding-left: 20px; line-height: 35px;}
a:link{color: #FFFFFF;}
a:hover{color: #ff0099;}
</style>
<script>
//方法一:这个要用事件代理,比较详细的解法如下: ————网友1
window.onload = function(){
var oul_b1 = document.getElementById('oul_1');
var oBat_a2 = document.getElementById('bat_a2'); oBat_a2.onclick = function(){
var oli_b1 = document.createElement('li');
var text_b2 = document.getElementById('text_a2');
oli_b1.innerHTML = text_b2.value + "&nbsp;&nbsp;&nbsp;<a href='javascript:;'>删除</a>";
oul_b1.appendChild(oli_b1);
//下面的代码是给添加的li加一个class样式
var calss_li = oul_b1.getElementsByTagName('li');
for(var i=0;i<calss_li.length;i++){
//alert(calss_li[1].innerHTML);
calss_li[i].className = 'oli';
}; //下面是删除添加的li,错误示范
// var del_li = document.getElementsByTagName('a');
// alert('dsaf');
// for(var j=0;j<del_li.length;j++){
// // alert(del_li.innerHTML);
// del_li[i].onclick = function(){
// // alert('ada');//测试
// oul_b1.removeChild(this.parentNode); //删除oul_b1的子节点
// };
// }
//错误原因:
//首先,添加完之后可以直接通过querySelector获取刚才添加的a标签
//这里循环是没必要的,而且你的循环会导致之前已经绑定过删除事件的元素又被绑一遍
//虽然没什么其他错,但却是无用功
oli_b1
.querySelector('a')
.addEventListener('click', function(){ //添加一个事件监听器
//然后就是这里的this指的是a标签,他的父节点才是li
//从ul里删除
oul_b1.removeChild(this.parentNode);
}, false);
};
}; //方法二:其实和方法一一样,而且优点是代码简化很多 ————网友2
window.onload=function(){
document.getElementById('bat_a2').onclick = function(){
var val = document.getElementById('text_a2').value;
var text = '<li class="oli">' + val + "&nbsp;&nbsp;&nbsp;<a href='javascript:;'>删除</a></li>";
document.getElementById("oul_1").insertAdjacentHTML('beforeEnd', text);
};
document.getElementById("oul_1").addEventListener("click", function(e) {
if (e.target && e.target.nodeName == "A") {
document.getElementById("oul_1").removeChild(e.target.parentNode);
}
});
};
</script>
</head>
<body>
<input type="text" value="" id="text_a2" />
<input type="button" value="添加LI" id="bat_a2" />
<ul id="oul_1"></ul>
</body>
</html>

getElementById('bat_a2').onclick = function(){ var val = document.getElementById('text_a2').value; var text = '<li class="oli">' + val + "&nbsp;&nbsp;&nbsp;<a href='javascript:;'>删除</a></li>"; document.getElementById("oul_1").insertAdjacentHTML('beforeEnd', text); }; document.getElementById("oul_1").addEventListener("click", function(e) { if (e.target && e.target.nodeName == "A") { document.getElementById("oul_1").removeChild(e.target.parentNode); } }); }; </script> </head> <body> <input type="text" value="" id="text_a2" /> <input type="button" value="添加LI" id="bat_a2" /> <ul id="oul_1"></ul> </body></html>

文档碎片:

  文档碎片可以提高DOM操作性能(理论上)

  文档碎片的原理

  document.createDocumentFragment();  //基本已经不再使用了

  需要说明的是:如果是在IE9及以上、FF、Chrome等高级浏览器中运行时,文档碎片其实几乎没有提高什么性能,有时还会拖延性能,但是在IE6-8等低级浏览器中文档碎片确实能相对提高那么一些性能。  

window.onload=function(){
    var oUl=document.getElementById('ul1');
    var oFrag=document.createDocumentFragment();     for (var i=0; i<; i++){    //一次插入10000个标签
      var oLi=document.createElement('li');
      // oUl.appendChild(oLi); //相当于下面两句oFrag.appendChild(oLi);和oUl.appendChild(oFrag);
      oFrag.appendChild(oLi);
   }
   oUl.appendChild(oFrag);
}; <ul id="ul1"></ul>

第六节 DOM操作应用的更多相关文章

  1. 迷你MVVM框架 avalonjs 沉思录 第2节 DOM操作的三大问题

    jQuery之所以击败Prototype.js,是因为它自一开始就了解这三大问题,并提出完善的解决方案. 第一个问题,DOM什么时候可用.JS不像C那样有一个main函数,里面的逻辑不分主次.但JS是 ...

  2. 第七节 DOM操作应用-高级

    表格应用: 获取:tBodies.tHead.tFoot.rows.cells <!DOCTYPE html> <html lang="en"> <h ...

  3. 认识JQuery,JQuery的优势、语法、多库冲突、JS原生对象和JQuery对象之间相互转换和DOM操作,常用的方法

    (一)认识JQuery  JQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一套定义好的方法    JQuery的主旨:以更少的代码,实现更多的功能 (二)JQue ...

  4. 第一百一十六节,JavaScript,DOM操作样式

    JavaScript,DOM操作样式 一.操作样式 CSS作为(X)HTML的辅助,可以增强页面的显示效果.但不是每个浏览器都能支持最新的CSS能力.CSS的能力和DOM级别密切相关,所以我们有必要检 ...

  5. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  6. 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

    第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...

  7. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  8. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  9. 第一百一十五节,JavaScript,DOM操作表格

    JavaScript,DOM操作表格 学习要点: 1.操作表格 DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本章主要了解一下DO ...

随机推荐

  1. 2单一职责原则SRP

    一.什么是单一职责原则 单一职责原则(Single Responsibility Principle ): 就一个类而言,应该仅有一个引起它变化的 原因. 二.多功能的山寨手机 山寨手机的功能: 拍照 ...

  2. JS 使用const声明常量的本质(很多人都有误解)

    在我们使用const声明常量时,总认为值一旦声明就不可改变,其实是有误解的: 刚在看ES6标准文档时,仔细阅读了const的解析,恍然大悟的感觉,分享给大家. 本质 const实际上保证的,并不是变量 ...

  3. 删除JS 对象属性(元素)

    var a={"id":1,"name":"danlis"}; //添加属性 a.age=18; console.log(a); //结果: ...

  4. 用lua编写wireshark插件分析自己定义的协议

    参见: https://yoursunny.com/study/IS409/ScoreBoard.htm https://wiki.wireshark.org/LuaAPI/TreeItem http ...

  5. Linux ReviewBoard安装与配置

    目录 0. 引言 1. 安装步骤 2. 配置站点 2.1 创建数据库 2.2 开始安装 2.3 修改文件访问权限 2.4 Web服务器配置 2.5 修改django相关配置 正文 回到顶部 0. 引言 ...

  6. pandas pivot_table或者groupby实现sql 中的count distinct 功能

    pandas pivot_table或者groupby实现sql 中的count distinct 功能 import pandas as pd import numpy as np data = p ...

  7. 配置非安装版tomcat服务

    1.设置服务名称,进入tomcat目录/bin文件夹,编辑service.bat中的 set SERVICE_NAME = (修改成你需要的服务名,这个将是你启动服务的句柄): 2.修改 set PR ...

  8. ubuntu git的安装更新及配置

    安装及配置 参考地址:http://blog.csdn.net/qq_26990831/article/details/51857399 1.git 安装 sudo apt-get install g ...

  9. 【漏洞复现】Tomcat CVE-2017-12615 远程代码执行漏洞

    漏洞描述 [漏洞预警]Tomcat CVE-2017-12615远程代码执行漏洞/CVE-2017-12616信息泄漏 https://www.secfree.com/article-395.html ...

  10. 用TreeSet生成不重复自动排序随机数组

    随机数组就是在指定长度的数组中用随机数字为每个元素赋值,常用于不确定数值的环境,如拼图游戏需要随机数组来打乱图片顺序.可是同时也存在问题,就是随机数的重复问题,这个问题常常被忽略. TreeSet类的 ...