js笔记十七之DOM操作-增删改

DOM的赠删改

真是项目中, 我们会在js中动态创建一些html标签, 然后把其增加到页面中

  • document.createElement

在js中动态创建一个html标签

  • appendChild

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

  • insertBefore

容器.insertBefore(新元素,老元素)
把当前容器中, 把新元素增加到老元素之前

<body>
    <div id="box2" class="box">2</div>
    <style>
        .box{width:100px;height:100px;border:2px solid #999;}
    </style>
    <script>
        // -> 创建元素
        var oDiv = document.createElement('div'),
            oBody = document.getElementsByTagName('body');
        oDiv.id = "box";
        oDiv.className = "box";
        Odiv.innerHTML = "1"
        
        // -> 添加到页面
        // oBody[0].appendChild(oDiv);
        document.body.insertBefore(oDIv,box2);
    </script>
</body>
// -> 真实项目中很多需求都是通过动态常见元素来完成的,其中有一个需求; 解析一个URL地址每一部分的信息(包含问号传递的参数值)
// -> 1. 纯字符串拆分截取;
// -> 2. 编写强大的正则,捕获到需要的结果;
// -> 3. 通过动态创建一个a标签, 利用a标签的一些内置属性来分别获取每一部分的内容;
// -> ...

var link = document.createElement('a');
link.href = 'http://www.example.com/school/?name=lilei&age=18&sex=0#student';  // -> 此处地址就是我们需要解析的url
console.dir(link);
// -> hash: 存储了哈希值 '#student'
// -> hostname: 域名 'www.example.com'
// -> pathname: 路径 '/school/'
// -> protocol: 协议 'http:'
// -> search: 问号传递参数值没有传递是空字符串 '?name=lilei&age=18&sex=0'
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;
    
}
console.log(queryURLParameter('http://www.example.com/school/?name=lilei&age=18&sex=0#student'))
// -> {name: "lilei", age: "18", sex: "0"}

删 改

  • removeChild

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

  • replaceChild

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

  • cloneNode

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

<style>
    .box{
        width: 100px;
        height: 100px;
        background: #f50;
        margin-top: 10px;
    }
</style>
<div class="box" id="box1">1</div>
<div class="box" id="box2"><span>1</span>2</div>
<script>
    var box1 = document.getElementById('box1'),
        box2 = document.getElementById('box2');
    document.body.removeChild(box1);    // -> 删除元素,移除盒子
    document.body.appendChild(box2.cloneNode()) // -> 克隆盒子并添加到body末尾,但不克隆子元素及内容
    document.body.appendChild(box2.cloneNode(true)) // -> 克隆元素并添加到body末尾,克隆子元素及内容(即使是深度克隆也只是克隆内容和结构,并不会克隆盒子上发生的事件)
</script>
  • [set/get/remove]Attribute

给当前元素设置/获取/移除 属性的(一般操作的都是他的自定义属性)
box.setAttribute('myIndex',0)
box.getAttribute('myIndex')
box.removeAttribute('myIndex')

使用 xxx.index=0xxx.setAttribute('index',0) 这两种设置自定义属性的区别?
xxx.index: 是把当前操作的元素当做一个普通对象,为其设置一个属性名(和页面中的html标签没什么关系)
xxx.setAttribute: 把元素当做特殊的元素对象来处理,设置的自定义属性是和页面结构中的DOM元素映射在一起的

<div id="box"></div>
<script>
    var box = document.getElementById('box');
    box.index = 0; // 与html无关的普通对象
    console.log(box.index) // -> 0
    box.setAttribute('index',100) // 与html存在映射关系的元素对象
    console.log(box.index) //-> 100
</script>
  • js中获取的元素对象,我们可以把它理解为两种角色
  1. 与页面html结构无关的普通对象
  2. 与页面html结构存在映射关系的元素对象
  • 元素对象中的内置属性,大部分都和页面的标签存在映射关系:
    xxx.style.backgroundColor = 'xxx';此时不仅把js对象对应的属性值改变了,而且也会映射到页面的html标签上(标签中有一个style行内样式, 元素的样式改变了)
    xxx.className = 'xxx': 此时不仅是把js对象中的属性值改变了,而且页面中的标签增加了class样式类(可以看见的)

  • 元素对象中的自定义属性:
    xxx.index=0: 仅仅是把js对象中增加了一个属性名(自定义的),和页面中的html没啥关系(在结构上看不见)
    xxx.setAttribute: 通过这种方式设置的自定义属性和之前提到的内置属性差不多,都是和html结构存在映射关系的(设置的自定义属性可以呈现在结构上)

// -> 获取当前元素的上一个哥哥元素节点(兼容所有浏览器)
// -> curEle: current element

// 思路:
// 首先获取当前元素的上一个哥哥节点,判断当前获取的节点是否为元素节点(nodeType === 1),如果不是,基于当前获取的节点,找他的上一个哥哥节点...一直到找到的节点为元素节点为止
// 如果在查找过程中,发现没有上一个哥哥节点了,则不在继续查找

// while(条件){循环体}

function prev(curEle){
    // 获取当前元素的上一个节点
    var p = curEle.previousSibling;
    // 如果存在上一个节点并且该节点不是元素节点
    while(p && p.nodeType !== 1){
        // 就再往上一个节点继续查找
        p = p.previousSibling;
    }
    // 直到找到返回
    return p;
}

// 扩展:
// next: 获取下一个弟弟元素节点
// prevAll: 获取所有的哥哥元素节点
// nextAll: 获取所有的弟弟元素节点
// siblings: 获取所有的兄弟元素节点
// index: 获取当前元素在兄弟元素节点中的索引
// ...
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,037评论 0 21
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,629评论 1 92
  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,563评论 0 7
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,360评论 0 0
  • 时间过得真快,转眼就又快上班了,对于在家里蹲的我,视乎上班对我没有概念,我天天都是在休息。 虽然在家,我感觉也是很...
    168荷塘月色阅读 173评论 0 0