第七周第四天笔记之DOM库

1 复习DOM相关的知识

  1. 获取元素的几种形式:
    • id: var oele=document.getElementById("id");
    • tagname: var aele=document.getElementsByTagName("tagname");
    • classname: var aele=document.getElementsByClassName(classname);
    • name: var aele=document.getElementsByName("name");
    • clientWidth
    • querySelector
    • querySelectorAll
  2. DOM节点属性
节点 nodeName nodeValue nodeType
元素节点 大写的标签名 null 1
文本节点 #text 文本内容 3
注释节点 #comment 注释内容 8
文档节点 #document null 9
  1. 节点关系
    • parentNode
    • childNodes
    • children
    • firstChild
    • lastChild
    • previousSibling
    • nextSibling
  2. DOM动态操作
    • 创建
      • 创建元素节点:document.createElement("tagname");
      • 创建文本节点:document.createTextNode("文本内容");
      • 克隆节点:obj.cloneNode(boolean是否深度克隆)
    • 动态插入
      • appendChild:parentnode.appendChild(newnode)插入到父级节点所有子节点最后一项;
      • insertBefore:parentnode.insertBefore(newnode,oldnode)插入到父级节点指点定子节点的前面;
    • 动态删除,替换
      • removeChild:parentnode.removeChild(oldnode)删除父级节点中的指定子节点;
      • replaceChild:parentnode.replaceChild(newnode,oldnode)替换父级节点中的制定子节点;
  3. 属性操作
    • 通过点和[];
    • attribute系列
      • 获取:elenode.getAttribute("attr")
      • 设置:elenode.setAttribute("attr","value")
      • 删除:elenode.removeAttribute("attr")

2 DOM库

  1. 获取元素
    • getByClass 通过class名来获取元素
    • hasClass 判断元素是否已存在某个class名
    • addClass 添加class,判断元素上不存在某个class名,然后再设置
    • removeClass 移除class
    • win 盒子模型的封装
    • offset 盒子模型偏移量的封装
  2. 设置样式
    • getCss 获取非行间样式,非行间样式只能用添加class名来添加
    • setCss 设置一个行间样式,不能设置非行间样式
    • setGroupCss 设置一组行间样式
    • css 三合一,将getCss,setCss,setGroupCss合并为一组
  3. 节点关系
    • getChildren 获取当前节点的子元素节点集合
    • prevNode 获取上一个哥哥元素节点
    • prevNodeAll 获取所有的哥哥元素节点集合
    • nextNode 获取下一个弟弟元素节点
    • nextNodeAll 获取所有的弟弟元素节点集合
    • sibling 获取相邻兄弟元素节点
    • siblings 获取所有的兄弟元素节点集合
    • firstEleChild 第一个子元素节点
    • lastEleChild 最后一个子元素节点
    • index 当前元素的索引
  4. 动态插入
    • appendChild 插入容器末尾
    • prependChild 插入容器开头
    • insertBefore 插入到指定元素的前面
    • insertAfter 插入到指定元素的后面

3 工具库

  • makeArray: 类数组转数组
  • jsonParse: josn格式的字符串转为json格式的对象
  • rnd: 随机数获取
  • getCss: 获取元素身上的属性值
  • win: 获取浏览器的可视区域宽高及卷去的长度
  • offset: 获取元素相对于body的偏移量

4 DOM库创建

  • getByClass方法
    • 目的:通过指定的一组class名,获取包含其的一组元素,返回一个数组
    • 参数:strClass:指定一组class名字符串; parent:父级元素; 返回值:数组
    • 思路:
      • 判断浏览器种类,标准浏览器下可以使用document.getElementsByClassName(strClass)来获取所有元素集合,但是需要将类数组转成数组;
      • IE6,7,8浏览器下,自己封装方法
      • 获取父级元素下的所有元素集合
      • 新建空数组ary
      • 将strClass字符串一定要加工,去掉其前后的空格,所以要添加strClass.replace(/(^ +)|( +$)/g,""),将字符串开头和结尾的空格替换为空字符,即删除掉,然后再利用split进行分割;
      • 将strClass字符串利用空格分割成数组aryClass,正则表达式:/\s+/g,其中全局属性g,可有可无;
      • 遍历元素集合,获得每个元素的class名,然后遍历aryClass数组,利用正则判断元素的class名中是否存在aryClass数组中所有项,只要有一项不存在,就阻断数组遍历,不合格;
      • 如何判断什么样的元素可以插入到新建的空数组中,利用一个开关bOk,在元素集合遍历时,给其赋值为true,当数组遍历校验中,如果有一项不匹配,那么给bOk赋值为false,并添加break中断for循环;待数组遍历完成,判断bOk的布尔值,如果为true,代表所有数组遍历中均匹配,满足条件,将此元素插入到数组ary中,如果为false,则不插入;
      • 待元素集合遍历完成后,返回ary;
    • 知识点:
      • var aEle=parent.getElementsByTagName("*");代码代表获取parent父级元素下的所有元素集合;
      • strClass=strClass.replace(/(^ +)|( +$)/g,""),过滤传入的实参strClass,将其前后空格删除,其中正则表达式/(^ +)|( +$)/g,代表的含义是:"开头为一个或多个空格"或"结尾为一个或多个空格",进行全局查找替换;正则表达式可以写成:/(^\s+)|(\s+$)/g;
      • var reg=new RegExp("\\b"+aryClass[j]+"\\b");正则创建为实例创建,需要加引号,需要转义,可以进行变量拼接;其中\b代表开头,结尾,空格;而字面量创建,不需要加引号,不需要转义,不能进行变量拼接;
      • bOk思想的运用,解决for循环中的不满足情况问题;
    • 注意点:
      • 添加的参数strClass字符串中,开头结尾不能有空格,不然会被split分割成空元素,添加到数组中,在验证时,虽然结果不会影响,但是不利于代码优化,所以在传入实参后,必须对其进行过滤,将开头与结尾的空格去除掉;
     <body>
     <div class="wrap" id="wrap">
         <div class="div1 div2 div3 div4">1</div>
         <div class="div1 div2 div3">2</div>
         <div class="div1 div2">3</div>
         <div class="div1">4</div>
         <p class="div1 div2 div3">5</p>
         <span>6</span>
     </div>
     <script>
         //传入的strClass不能有前后空格,所以要删除,才能转化为数组
         var oWrap=document.getElementById("wrap");
         function getByClass(strClass,parent) {
             parent=parent || document;
             //标准浏览器
             if("getComputedStyle" in window){
                 //类数组转数组
                 return Array.prototype.slice.call(parent.getElementsByClassName(strClass));
             }
             //IE6,7,8浏览器
             var ary=[];
             var aEle=parent.getElementsByTagName("*");//*代表获取左右的元素
             var aryClass=strClass.replace(/(^ +)|( +$)/g,"").split(/\s+/);//正则也可以写成/空格+/,split中正则的全局g可有可无;
             for(var i=0; i<aEle.length; i++){
                 var bOk=true;
                 //目的,strClass中的字符串转为数组,然后遍历每一项,去比较aEle[i]中的class是否存在,有一项不存在就终止
                 var curEle=aEle[i];
                 var strEleClass=curEle.className;
                 for(var j=0; j<aryClass.length; j++){
                     var reg=new RegExp("\\b"+aryClass[j]+"\\b");//实例创建:需要加引号,需要转义,可以变量拼接
                     if(!reg.test(strEleClass)){
                         bOk=false;
                         break;
                     }
                 }
                 if(bOk){
                     ary.push(curEle);
                 }
             }
             return ary;
         }
         console.log(getByClass("  div1   div2    div3        ",oWrap));
     </script>
     </body>
    
  • hasClass方法
    • 目的:判断元素身上,是否存在某一个指定的class名
    • 参数:ele:元素; cName:指定class名; 返回值:布尔值
    • 注意点:
      • cName=cName.replace(/(^\s+)|(\s+$)/g,"");给传入的实参字符串class过滤掉前后空格;
      • var reg=new RegExp("\\b"+cName+"\\b");代码中的正则表达式添加前后\\b的目的是为了防止元素的class名上会包含被检测字符,必须加上前后\\b,其中\b代表:开头、结尾、空格,在实例创建中,需要转义;
      • var reg=new RegExp("(^|\\s+)"+cName+"(\\s+|$)"),代码为上述正则表达式的严格写法,其中\s代表空格,需要转义,(^|\\s+)指的是开头或多个空格;
      • 例:如果cName为"div1",而元素身上的class名为"divdiv1 div2 div3",如果不添加\\b,那么验证就会成功,进而出错;
     <script>
         function hasClass(ele, cName) {
             cName=cName.replace(/(^\s+)|(\s+$)/g,"");
             var reg=new RegExp("\\b"+cName+"\\b");//严格写法:("(^|\\s+)"+cName+"(\\s+|$)"),实例创建中"\s"需要转义;
             return reg.test(ele.className);
         }
     </script>
    
  • addClass方法
    • 目的:给元素身上添加一组class名,要先判断元素身上是否已存在需添加class名
    • 参数:ele:元素; strClass:待添加的class名 返回值:无;
    • 注意点:
      • strClass=strClass.replace(/(^\s+)|(\s+$)/g,"")开始对传入的实参strClass进行过滤
      • ele.className=ele.className.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/," "),在拼接之前规范原有的字符串;
      • ele.className+=" "+aryClass[i];字符串拼接时,要拼接空格;
     <script>
         function addClass(ele,strClass) {
             strClass=strClass.replace(/(^\s+)|(\s+$)/g,"");//把传进来的strClass进行过滤,删除开头结尾空格
             var aryClass=strClass.split(/\s+/g);
             for(var i=0; i<aryClass.length; i++){
                 if(!this.hasClass(ele,aryClass[i])){
                     //1 开头结尾去掉空格 2 中间多个空格,变为一个空格
                     ele.className=ele.className.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/," ");//在拼接之前删除原来字符串的开头结尾空格,将中间多个空格,变为一个空格;
                     ele.className+=" "+aryClass[i];//拼接新的class名,前面拼接上一个空格;
                 }
             }
         }
     </script>
    
  • removeClass方法
    • 目的:删除元素身上的class名,要判断元素身上是否已存在要删除的class;
    • 参数:ele:元素; strClass:待删除的class名 返回值:无;
    • 注意点:
      • strClass=strClass.replace(/(^\s+)|(\s+$)/g,"")开始对传入的实参strClass进行过滤;
      • ele.className=ele.className.replace(aryClass[i]," ").replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/," ");,在验证要删除的class名元素身上存在后,利用replace进行替换删除,替换为空格,然后再对替换完的字符串进行规范:1)删除开头结尾空格,2)将字符中间的多个空格,替换为一个空格;
     <body>
     <div class="wrap" id="wrap">
         <div class="div1 div2 div3 div4">1</div>
         <div class="div1 div2 div3">2</div>
         <div class="div1 div2">3</div>
         <div class="div1">4</div>
         <p class="div1 div2 div3">5</p>
         <span>6</span>
     </div>
     <script src="utils2.js"></script>
     <script>
          var oWrap=document.getElementById("wrap");
          var aDiv=oWrap.getElementsByTagName("div");
          function  removeClass(ele,strClass){
              strClass=strClass.replace(/(^\s+)|(\s+$)/g,"");
              var aryClass=strClass.split(/\s+/g);
              for(var i=0; i<aryClass.length; i++){
                  if(utils.hasClass(ele,aryClass[i])){
                      ele.className=ele.className.replace(aryClass[i]," ").replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/," ");
                  }
              }
          }
          removeClass(aDiv[0],"div1      div3  ");
          console.log("("+aDiv[0].className+")")//结果为:"(div2 div4)"
     </script>
     </body>
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 我们首先要明白,我们给页面添加效果用到的js到底是什么?js其实包含三部分:dom 文档对象模型 bom 浏览...
    一直以来都很好阅读 807评论 0 0
  • Chapter 2 : Selecting the elements upon which to act 1. $...
    Azur_wxj阅读 389评论 0 1
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,931评论 2 89
  • 感觉慢慢长大,就要慢慢面临身边的人慢慢离开我们。小时候什么都不懂,长大了什么都得懂。就像曾经书上说的,我们终将被生...
    陳若心阅读 241评论 1 1
  • 我是谁? 我很自大又很自负 我总是把自己想的很牛逼 可是我真的很low 我很笨但是我从不藐视自己 我很想像别人一样...
    遇见本杰明阅读 117评论 0 0