DOM的增删改

真实项目中,我们偶尔会在JS中动态创建一些HTML标签,然后把其增加到页面中


document.createElement

在JS中动态创建一个HTML标签


appendChild

容器.appendChild(新元素) 
把当前创建的新元素添加到容器的末尾位置


insertBefore

容器.insertBefore(新元素,老元素) 
在当前容器中,把新创建的元素增加到老元素之前
//=>真实项目中很多需求都是通过动态创建元素来完成的,其中有一个需求:解析一个URL地址每一部分的信息(包含问号传递的参数值)
//->1、纯字符串拆分截取
//->2、编写强大的正则,捕获到需要的结果
//->3、通过动态创建一个A标签,利用A标签的一些内置属性来分别获取每一部分的内容
//->...

/*
 var link=document.createElement('a');
 link.href='http://www.zhufengpeixun.cn/stu/?name=zxt&age=27#teacher';//->此处地址就是我们需要解析的URL

 * hash:存储的是哈希值  '#teacher'
 * hostname:存储的是域名  'www.zhufengpeixun.cn'
 * pathname:存储的是请求资源的路径名称 '/stu/'
 * protocol:协议 'http:'
 * search:存储的是问号传递的参数值,没有传递是空字符串 '?name=zxt&age=27'
*/

function queryURLParameter(url){
    var link=document.createElement('a');
    link.href=url;

    var search=link.search,
        obj={};
    if(search.length===0) return;
    search=search.substr(1).split(/&|=/g);
    for(var i=0;i<search.length;i+=2){
        var key=search[i],
            value=search[i+1];
        obj[key]=value;
    }
    link=null;
    return obj;
}


removeChild

容器.removeChild(元素) 
在当前容器中把某一个元素移除掉


replaceChild

容器.replaceChild(新元素,老元素) 
在当前容器中,拿新元素替换老元素


cloneNode

元素.cloneNode(false/true) 
把原有的元素克隆一份一模一样的,false:只克隆当前元素本身,true:深度克隆,把当前元素本身以及元素的所有后代都进行克隆


[set/get/remove]Attribute

给当前元素设置/获取/移除 属性的(一般操作的都是它的自定义属性) 
box.setAttribute(‘myIndex’,0) 
box.getAttribute(‘myIndex’) 
box.removeAttribute(‘myIndex’)
使用xxx.index=0 和 xxx.setAttribute(‘index’,0) 这两种设置自定义属性的区别? 
xxx.index:是把当前操作的元素当做一个普通对象,为其设置一个属性名(和页面中的HTML标签没关系) 
xxx.setAttribute:把元素当做特殊的元素对象来处理,设置的自定义属性是和页面结构中的DOM元素映射在一起的


JS中获取的元素对象,我们可以把它理解为两种角色:

与页面HTML结构无关的普通对象

与页面HTML结构存在映射关系的元素对象

元素对象中的内置属性,大部分都和页面的标签存在映射关系: 
xxx.style.backgroundColor = ‘xxx’ 此时不仅把JS中对象对应的属性值改变了,而且也会映射到页面的HTML标签上
(标签中有一个style行内样式、元素的样式改变了)
xxx.className=’xxx’ 此时不仅是把JS对象中的属性值改了,而且页面中的标签增加了class样式类(可以看见的)
元素对象中的自定义属性:xxx.index=0 
仅仅是把JS对象中增加了一个属性名(自定义的),和页面中的HTML没啥关系(在结构上看不见)
xxx.setAttribute:通过这种方式设置的自定义属性和之前提到的内置属性差不多,都是和HTML结构存在映射关系的
(设置的自定义属性可以呈现在结构上)