第七周第五天笔记之DOM库

1 DOM库创建

  • setCss方法
    • 目的:设置元素身上的单一的行间样式
    • 参数:ele:元素,attr:属性名,value:属性值
    • 知识点:
      • 核心设置ele.style[attr]=value;
      • 针对特殊的进行处理:1)width等属性,属性值为px,但不添加单位时,也可以设置成功;2)针对透明度的兼容处理,最终效果是,但设置属性名为opacity时,封装好兼容的代码;3)浮动问题,针对不同浏览器进行不同的设置;
     <body>
     <div id="div1">美好</div>
     <script>
         var oDiv=document.getElementById("div1");
         function setCss(ele, attr, value) {
             //1.针对 width height left top right bottom margin(Left|Right..) padding lineHeight fontSize borderWidth 给其添加单位
             var reg=/(width|height|left|top|right|bottom|lineHeight|borderWidth|fontSize|((margin|padding)(Left|Right|Top|Bottom)?))/g;
             if(reg.test(attr) && !/(auto|%)/.test(value)){
                 value=parseFloat(value)+"px";
             }
             //下面代码更简单
             /*if(reg.test(attr) && !isNaN(value)){
                 value=value+"px";
             }*/
             //2. 针对透明度的兼容处理
             if(attr=="opacity"){
                 ele.style[attr]=value;
                 ele.style.filter="alpha(opacity="+value*100+")";
                 return;
             }
             //3. 针对浮动
             if(attr=="float"){
                 ele.style.styleFloat=value;//兼容IE
                 ele.style.cssFloat=value;//兼容火狐
                 return;
             }
             //核心设置
             ele.style[attr]=value;
         }
         setCss(oDiv,"width","50%");
         setCss(oDiv,"lineHeight",200);
         setCss(oDiv,"margin",20);
         setCss(oDiv,"fontSize",30);
         setCss(oDiv,"background","red");
         setCss(oDiv,"opacity",0.3);
         setCss(oDiv,"float","right");
     </script>
     </body>
    
  • setGroupCss方法
    • 目的:设置一组行间样式
    • 参数:ele:元素,opt:对象
     <body>
     <div id="div1">美好</div>
     <script src="utils3.js"></script>
     <script>
         var oDiv=document.getElementById("div1");
         function setGroupCss(ele,opt) {
             for(var attr in opt){
                 utils.setCss(ele,attr,opt[attr]);
             }
         }
         setGroupCss(oDiv,{
             width:"50%",
             height:100,
             backgroundColor:"green",
             float:"right"
         })
     </script>
     </body>
    
  • css方法
    • 目的:三合一,集获取,设置一个,设置一组三者
    • 参数:根据需要添加
    • 思路:
      • 判断传入的实参,利用arguments,第一个参数ele,第二个参数(a.字符串attr,b.对象opt),第三个参数 属性值;
      • 判断条件是传入几个实参,即实参的类型
    • 知识点
      • 字符串用typeof判断,对象用{}.toString()==="[object Object]"判断是否为真;
    • 代码:
      • 1)工具库代码:
       css:function (ele) {
               var argTwo=arguments[1];//获取第二个参数
               if(typeof argTwo==="string"){
                   var argThree=arguments[2];//获取第三个参数
                   if(typeof argThree==="undefined"){
                       return this.getCss(ele,argTwo);
                   }else{
                       this.setCss(ele,argTwo,argThree);
                   }
               }
               if(argTwo.toString()==="[object Object]"){
                   this.setGroupCss(ele,argTwo);
               }
           }
      
      • 2)验证代码:
       <body>
       <div id="div1">美好</div>
       <script src="utils3.js"></script>
       <script>
           var oDiv=document.getElementById("div1");
           utils.css(oDiv,{
               width:"50%",
               height:100,
               backgroundColor:"green",
               float:"right"
           });
           console.log(utils.css(oDiv,"height"));
           console.log(utils.css(oDiv,"width"));
           utils.css(oDiv,"height",200)
       </script>
       </body>
      
  • getChildren方法
    • 目的:获取容器节点下的所有元素子节点集合,并获取指定tagName的元素集合
    • 参数:parent:容器节点,tagName:指定标签名,可传可不传;
    • 知识点:
      • 获取元素身上的tagName方法:cur.tagName或cur.nodeName,二者获取的都是大写的标签名
      • parent.children,可以获取父级元素下所有的元素子节点,但是在IE8浏览器中,会将注释节点算成元素节点;
    • 代码:
      • 1)工具库代码:
       getChildren:function (parent, tagName) {
           var ary=[];
           var aChilds=parent.childNodes;
           for(var i=0; i<aChilds.length; i++){
               var cur=aChilds[i];
               if(cur.nodeType==1){
                   if(typeof tagName==="undefined"){
                       ary.push(cur);
                   }else if(cur.nodeName===tagName.toUpperCase()){
                       //获取元素身上的tagName方法:cur.tagName或cur.nodeName,二者获取的都是大写的标签名
                       ary.push(cur);
                   }
               }
           }
           return ary;
       }
      
      • 2)验证代码:
       <body>
       <div id="wrap">
           <div></div><!--dd-->
           <div></div>
           <div></div>
           <div></div>
           <div></div>
           <p></p>
           <p></p>
           <span></span>
       </div>
       <script src="utils3.js"></script>
       <script>
           var oWrap=document.getElementById("wrap");
           var achilds=utils.getChildren(oWrap);
           console.log(achilds.length);//结果为8;
           var achilds1=utils.getChildren(oWrap,"div");
           console.log(achilds1.length);//结果为5;
           var achilds2=utils.getChildren(oWrap,"span");
           console.log(achilds2.length);//结果为1;
       </script>
       </body>
      
  • prevNode方法,nextNode方法,sibling方法
    • preNode方法:获取元素的上一个哥哥元素节点
    • nextNode方法:获取元素下一个弟弟元素节点
    • sibling方法:获取元素相邻的兄弟元素节点集合
    • 知识点:
      • previousElementSiblingnextElementSibling两者在标准浏览器中支持,在IE5-8浏览器中不支持;
    • 工具库代码:
     //1 元素上一个哥哥元素节点
     prevNode:function (ele) {
         if(frg){
             return ele.previousElementSibling;
         }
         pre=ele.previousSibling;
         while(pre && pre.nodeType !==1){
             pre=pre.previousSibling;
         }
         return pre;
     },
     //2 元素的下一个弟弟元素节点
     nextNode:function (ele) {
         if(frg){
             return ele.nextElementSibling;
         }
         var nex=ele.nextSibling;
         while(nex && nex.nodeType !==1){
             nex=nex.nextSibling;
         }
         return nex;
     },
     //3 元素的相邻元素节点(包含哥哥和弟弟元素节点)
     sibling:function (ele) {
         var pre=this.prevNode(ele);
         var next=this.nextNode(ele);
         var ary=[];
         if(pre) ary.push(pre);
         if(next) ary.push(next);
         return ary;
     }
    
  • prevNodeAll方法,nextNodeAll方法,siblings方法
    • preNodeAll方法:获取元素所有的哥哥元素节点集合
    • nextNodeAll方法:获取元素所有的弟弟元素节点集合
    • siblings方法:获取元素所有的兄弟元素节点集合
    • 工具库代码:
     //4 获取元素所有的哥哥元素节点集合
     prevNodeAll:function (ele){
         var ary=[];
         var pre=this.prevNode(ele);
         while(pre){
             //unshift的目的是使元素按着dom顺序插入数组;
             ary.unshift(pre);
             pre=this.prevNode(pre);
         }
         return ary;
     },
     //5 获取元素所有的弟弟元素节点集合
     nextNodeAll:function (ele){
         var ary=[];
         var nex=this.nextNode(ele);
         while(nex){
             ary.push(nex);
             nex=this.nextNode(nex);
         }
         return ary;
     },
     //6 元素的所有的相邻元素节点
     siblings:function (ele) {
         return this.prevNodeAll(ele).concat(this.nextNodeAll(ele));
     }
    
  • index方法
    • 目的:获取当前元素在容器所有子节点中的位置,即索引值(从0开始)
    • 获取:索引值等于当前元素所有哥哥元素的个数
    • 工具库代码:
     index:function (ele) {
         return this.prevNodeAll(ele).length;
     }
    
  • firstEleChild方法,lastEleChild方法
    • firstEleChild方法:获取父级元素中第一个元素节点
    • lastEleChild方法:获取父级元素中最后一个元素节点
    • 工具库代码:
     //1 firstChild 所有子节点中第一个元素节点
     firstEleChild:function (parent) {
         return this.getChildren(parent)[0];
     },
     //2 lastChild 所有子节点中最后一个元素节点
     lastEleChild:function (parent) {
         var ary=this.getChildren(parent);
         return ary[ary.length-1];
     },
    
  • appendChild方法,prependChild方法,insertBefore方法,insertAfter方法
    • appendChild方法:插入父级元素所有子元素节点的最后一个
    • prependChild方法:插入父级元素所有子元素节点的第一个
    • insertBefore方法:插入指定子元素节点的前面
    • insertAfter方法:插入指定子元素节点的后面
      //1 appendChild 插在父级元素所有子元素的后面
     appendChild:function (parent,newold){
         parent.appendChild(newold);
     },
     //2 prependChild 插在父级元素所有子元素的前面
     prependChild:function (parent,newnode) {
         var firstNode=this.firstChild(parent);
         if(firstNode){
             parent.insertBefore(newnode,firstNode);
         }else{
             parent.appendChild(newnode);
         }
     },
     //3 insertBefore 插入到指定子元素节点的前面
     insertBefore:function (newnode,oldnode) {
         oldnode.parentNode.insertBefore(newnode,oldnode);
     },
     //4 insertAfter 插入到指定子元素节点的后面
     insertAfter:function (newnode,oldnode) {
         var nexnode=this.nextNode(oldnode);
         if(nexnode){
             this.insertBefore(newnode,nexnode);
         }else{
             this.appendChild(oldnode.parent,newold);
         }
     }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容