第七周第四天筆記之DOM庫

1 復(fù)習(xí)DOM相關(guān)的知識(shí)

  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節(jié)點(diǎn)屬性
節(jié)點(diǎn) nodeName nodeValue nodeType
元素節(jié)點(diǎn) 大寫的標(biāo)簽名 null 1
文本節(jié)點(diǎn) #text 文本內(nèi)容 3
注釋節(jié)點(diǎn) #comment 注釋內(nèi)容 8
文檔節(jié)點(diǎn) #document null 9
  1. 節(jié)點(diǎn)關(guān)系
    • parentNode
    • childNodes
    • children
    • firstChild
    • lastChild
    • previousSibling
    • nextSibling
  2. DOM動(dòng)態(tài)操作
    • 創(chuàng)建
      • 創(chuàng)建元素節(jié)點(diǎn):document.createElement("tagname");
      • 創(chuàng)建文本節(jié)點(diǎn):document.createTextNode("文本內(nèi)容");
      • 克隆節(jié)點(diǎn):obj.cloneNode(boolean是否深度克隆)
    • 動(dòng)態(tài)插入
      • appendChild:parentnode.appendChild(newnode)插入到父級(jí)節(jié)點(diǎn)所有子節(jié)點(diǎn)最后一項(xiàng);
      • insertBefore:parentnode.insertBefore(newnode,oldnode)插入到父級(jí)節(jié)點(diǎn)指點(diǎn)定子節(jié)點(diǎn)的前面;
    • 動(dòng)態(tài)刪除爽撒,替換
      • removeChild:parentnode.removeChild(oldnode)刪除父級(jí)節(jié)點(diǎn)中的指定子節(jié)點(diǎn);
      • replaceChild:parentnode.replaceChild(newnode,oldnode)替換父級(jí)節(jié)點(diǎn)中的制定子節(jié)點(diǎn);
  3. 屬性操作
    • 通過點(diǎn)和[];
    • attribute系列
      • 獲冉页:elenode.getAttribute("attr")
      • 設(shè)置:elenode.setAttribute("attr","value")
      • 刪除:elenode.removeAttribute("attr")

2 DOM庫

  1. 獲取元素
    • getByClass 通過class名來獲取元素
    • hasClass 判斷元素是否已存在某個(gè)class名
    • addClass 添加class捆等,判斷元素上不存在某個(gè)class名匈子,然后再設(shè)置
    • removeClass 移除class
    • win 盒子模型的封裝
    • offset 盒子模型偏移量的封裝
  2. 設(shè)置樣式
    • getCss 獲取非行間樣式蜒车,非行間樣式只能用添加class名來添加
    • setCss 設(shè)置一個(gè)行間樣式讳嘱,不能設(shè)置非行間樣式
    • setGroupCss 設(shè)置一組行間樣式
    • css 三合一,將getCss,setCss,setGroupCss合并為一組
  3. 節(jié)點(diǎn)關(guān)系
    • getChildren 獲取當(dāng)前節(jié)點(diǎn)的子元素節(jié)點(diǎn)集合
    • prevNode 獲取上一個(gè)哥哥元素節(jié)點(diǎn)
    • prevNodeAll 獲取所有的哥哥元素節(jié)點(diǎn)集合
    • nextNode 獲取下一個(gè)弟弟元素節(jié)點(diǎn)
    • nextNodeAll 獲取所有的弟弟元素節(jié)點(diǎn)集合
    • sibling 獲取相鄰兄弟元素節(jié)點(diǎn)
    • siblings 獲取所有的兄弟元素節(jié)點(diǎn)集合
    • firstEleChild 第一個(gè)子元素節(jié)點(diǎn)
    • lastEleChild 最后一個(gè)子元素節(jié)點(diǎn)
    • index 當(dāng)前元素的索引
  4. 動(dòng)態(tài)插入
    • appendChild 插入容器末尾
    • prependChild 插入容器開頭
    • insertBefore 插入到指定元素的前面
    • insertAfter 插入到指定元素的后面

3 工具庫

  • makeArray: 類數(shù)組轉(zhuǎn)數(shù)組
  • jsonParse: josn格式的字符串轉(zhuǎn)為json格式的對(duì)象
  • rnd: 隨機(jī)數(shù)獲取
  • getCss: 獲取元素身上的屬性值
  • win: 獲取瀏覽器的可視區(qū)域?qū)捀呒熬砣サ拈L度
  • offset: 獲取元素相對(duì)于body的偏移量

4 DOM庫創(chuàng)建

  • getByClass方法
    • 目的:通過指定的一組class名醇王,獲取包含其的一組元素呢燥,返回一個(gè)數(shù)組
    • 參數(shù):strClass:指定一組class名字符串崭添; parent:父級(jí)元素寓娩; 返回值:數(shù)組
    • 思路:
      • 判斷瀏覽器種類,標(biāo)準(zhǔn)瀏覽器下可以使用document.getElementsByClassName(strClass)來獲取所有元素集合呼渣,但是需要將類數(shù)組轉(zhuǎn)成數(shù)組棘伴;
      • IE6,7,8瀏覽器下,自己封裝方法
      • 獲取父級(jí)元素下的所有元素集合
      • 新建空數(shù)組ary
      • 將strClass字符串一定要加工屁置,去掉其前后的空格焊夸,所以要添加strClass.replace(/(^ +)|( +$)/g,""),將字符串開頭和結(jié)尾的空格替換為空字符,即刪除掉蓝角,然后再利用split進(jìn)行分割阱穗;
      • 將strClass字符串利用空格分割成數(shù)組aryClass饭冬,正則表達(dá)式:/\s+/g,其中全局屬性g揪阶,可有可無昌抠;
      • 遍歷元素集合,獲得每個(gè)元素的class名鲁僚,然后遍歷aryClass數(shù)組炊苫,利用正則判斷元素的class名中是否存在aryClass數(shù)組中所有項(xiàng),只要有一項(xiàng)不存在冰沙,就阻斷數(shù)組遍歷侨艾,不合格;
      • 如何判斷什么樣的元素可以插入到新建的空數(shù)組中拓挥,利用一個(gè)開關(guān)bOk唠梨,在元素集合遍歷時(shí),給其賦值為true撞叽,當(dāng)數(shù)組遍歷校驗(yàn)中姻成,如果有一項(xiàng)不匹配,那么給bOk賦值為false愿棋,并添加break中斷for循環(huán)科展;待數(shù)組遍歷完成,判斷bOk的布爾值糠雨,如果為true才睹,代表所有數(shù)組遍歷中均匹配,滿足條件甘邀,將此元素插入到數(shù)組ary中琅攘,如果為false,則不插入松邪;
      • 待元素集合遍歷完成后坞琴,返回ary;
    • 知識(shí)點(diǎn):
      • var aEle=parent.getElementsByTagName("*");代碼代表獲取parent父級(jí)元素下的所有元素集合;
      • strClass=strClass.replace(/(^ +)|( +$)/g,""),過濾傳入的實(shí)參strClass,將其前后空格刪除逗抑,其中正則表達(dá)式/(^ +)|( +$)/g,代表的含義是:"開頭為一個(gè)或多個(gè)空格"或"結(jié)尾為一個(gè)或多個(gè)空格"剧辐,進(jìn)行全局查找替換;正則表達(dá)式可以寫成:/(^\s+)|(\s+$)/g;
      • var reg=new RegExp("\\b"+aryClass[j]+"\\b");正則創(chuàng)建為實(shí)例創(chuàng)建邮府,需要加引號(hào)荧关,需要轉(zhuǎn)義,可以進(jìn)行變量拼接褂傀;其中\b代表開頭忍啤,結(jié)尾,空格仙辟;而字面量創(chuàng)建同波,不需要加引號(hào)鳄梅,不需要轉(zhuǎn)義,不能進(jìn)行變量拼接未檩;
      • bOk思想的運(yùn)用卫枝,解決for循環(huán)中的不滿足情況問題;
    • 注意點(diǎn):
      • 添加的參數(shù)strClass字符串中讹挎,開頭結(jié)尾不能有空格校赤,不然會(huì)被split分割成空元素,添加到數(shù)組中筒溃,在驗(yàn)證時(shí)马篮,雖然結(jié)果不會(huì)影響,但是不利于代碼優(yōu)化怜奖,所以在傳入實(shí)參后浑测,必須對(duì)其進(jìn)行過濾,將開頭與結(jié)尾的空格去除掉歪玲;
     <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不能有前后空格诈乒,所以要?jiǎng)h除烹棉,才能轉(zhuǎn)化為數(shù)組
         var oWrap=document.getElementById("wrap");
         function getByClass(strClass,parent) {
             parent=parent || document;
             //標(biāo)準(zhǔn)瀏覽器
             if("getComputedStyle" in window){
                 //類數(shù)組轉(zhuǎn)數(shù)組
                 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中的字符串轉(zhuǎn)為數(shù)組,然后遍歷每一項(xiàng)钙皮,去比較aEle[i]中的class是否存在蜂科,有一項(xiàng)不存在就終止
                 var curEle=aEle[i];
                 var strEleClass=curEle.className;
                 for(var j=0; j<aryClass.length; j++){
                     var reg=new RegExp("\\b"+aryClass[j]+"\\b");//實(shí)例創(chuàng)建:需要加引號(hào),需要轉(zhuǎn)義短条,可以變量拼接
                     if(!reg.test(strEleClass)){
                         bOk=false;
                         break;
                     }
                 }
                 if(bOk){
                     ary.push(curEle);
                 }
             }
             return ary;
         }
         console.log(getByClass("  div1   div2    div3        ",oWrap));
     </script>
     </body>
    
  • hasClass方法
    • 目的:判斷元素身上导匣,是否存在某一個(gè)指定的class名
    • 參數(shù):ele:元素; cName:指定class名茸时; 返回值:布爾值
    • 注意點(diǎn):
      • cName=cName.replace(/(^\s+)|(\s+$)/g,"");給傳入的實(shí)參字符串class過濾掉前后空格贡定;
      • var reg=new RegExp("\\b"+cName+"\\b");代碼中的正則表達(dá)式添加前后\\b的目的是為了防止元素的class名上會(huì)包含被檢測(cè)字符,必須加上前后\\b,其中\b代表:開頭可都、結(jié)尾缓待、空格,在實(shí)例創(chuàng)建中汹粤,需要轉(zhuǎn)義命斧;
      • var reg=new RegExp("(^|\\s+)"+cName+"(\\s+|$)")田晚,代碼為上述正則表達(dá)式的嚴(yán)格寫法嘱兼,其中\s代表空格,需要轉(zhuǎn)義贤徒,(^|\\s+)指的是開頭或多個(gè)空格芹壕;
      • 例:如果cName為"div1",而元素身上的class名為"divdiv1 div2 div3",如果不添加\\b汇四,那么驗(yàn)證就會(huì)成功,進(jìn)而出錯(cuò)踢涌;
     <script>
         function hasClass(ele, cName) {
             cName=cName.replace(/(^\s+)|(\s+$)/g,"");
             var reg=new RegExp("\\b"+cName+"\\b");//嚴(yán)格寫法:("(^|\\s+)"+cName+"(\\s+|$)"),實(shí)例創(chuàng)建中"\s"需要轉(zhuǎn)義通孽;
             return reg.test(ele.className);
         }
     </script>
    
  • addClass方法
    • 目的:給元素身上添加一組class名,要先判斷元素身上是否已存在需添加class名
    • 參數(shù):ele:元素睁壁; strClass:待添加的class名 返回值:無背苦;
    • 注意點(diǎn):
      • strClass=strClass.replace(/(^\s+)|(\s+$)/g,"")開始對(duì)傳入的實(shí)參strClass進(jìn)行過濾
      • ele.className=ele.className.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/," "),在拼接之前規(guī)范原有的字符串潘明;
      • ele.className+=" "+aryClass[i];字符串拼接時(shí)行剂,要拼接空格;
     <script>
         function addClass(ele,strClass) {
             strClass=strClass.replace(/(^\s+)|(\s+$)/g,"");//把傳進(jìn)來的strClass進(jìn)行過濾钳降,刪除開頭結(jié)尾空格
             var aryClass=strClass.split(/\s+/g);
             for(var i=0; i<aryClass.length; i++){
                 if(!this.hasClass(ele,aryClass[i])){
                     //1 開頭結(jié)尾去掉空格 2 中間多個(gè)空格厚宰,變?yōu)橐粋€(gè)空格
                     ele.className=ele.className.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/," ");//在拼接之前刪除原來字符串的開頭結(jié)尾空格遂填,將中間多個(gè)空格铲觉,變?yōu)橐粋€(gè)空格;
                     ele.className+=" "+aryClass[i];//拼接新的class名吓坚,前面拼接上一個(gè)空格撵幽;
                 }
             }
         }
     </script>
    
  • removeClass方法
    • 目的:刪除元素身上的class名,要判斷元素身上是否已存在要?jiǎng)h除的class;
    • 參數(shù):ele:元素礁击; strClass:待刪除的class名 返回值:無并齐;
    • 注意點(diǎn):
      • strClass=strClass.replace(/(^\s+)|(\s+$)/g,"")開始對(duì)傳入的實(shí)參strClass進(jìn)行過濾;
      • ele.className=ele.className.replace(aryClass[i]," ").replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/," ");客税,在驗(yàn)證要?jiǎng)h除的class名元素身上存在后况褪,利用replace進(jìn)行替換刪除,替換為空格更耻,然后再對(duì)替換完的字符串進(jìn)行規(guī)范:1)刪除開頭結(jié)尾空格测垛,2)將字符中間的多個(gè)空格,替換為一個(gè)空格秧均;
     <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+")")//結(jié)果為:"(div2 div4)"
     </script>
     </body>
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末食侮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子目胡,更是在濱河造成了極大的恐慌锯七,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件誉己,死亡現(xiàn)場離奇詭異眉尸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門噪猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霉祸,“玉大人,你說我怎么就攤上這事袱蜡∷坎洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵坪蚁,是天一觀的道長奔穿。 經(jīng)常有香客問我,道長敏晤,這世上最難降的妖魔是什么巫橄? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮茵典,結(jié)果婚禮上湘换,老公的妹妹穿的比我還像新娘统阿。我一直安慰自己,他們只是感情好帆离,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布哥谷。 她就那樣靜靜地躺著们妥,像睡著了一般勉吻。 火紅的嫁衣襯著肌膚如雪齿桃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音鱼冀,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛理卑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帆疟,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踪宠,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼妈嘹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柬脸,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤毙驯,失蹤者是張志新(化名)和其女友劉穎爆价,沒想到半個(gè)月后铭段,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體序愚,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡展运,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蔗候,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埂软。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纫事。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡所灸,死狀恐怖丽惶,靈堂內(nèi)的尸體忽然破棺而出爬立,到底是詐尸還是另有隱情钾唬,我是刑警寧澤侠驯,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布抡秆,位于F島的核電站吟策,受9級(jí)特大地震影響儒士,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檩坚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一着撩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睹酌,春花似錦、人聲如沸憋沿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽担租。三九已至砸民,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尝艘,已是汗流浹背演侯。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留背亥,地道東北人秒际。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓悬赏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娄徊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闽颇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 我們首先要明白,我們給頁面添加效果用到的js到底是什么寄锐?js其實(shí)包含三部分:dom 文檔對(duì)象模型 bom 瀏覽...
    一直以來都很好閱讀 803評(píng)論 0 0
  • Chapter 2 : Selecting the elements upon which to act 1. $...
    Azur_wxj閱讀 387評(píng)論 0 1
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評(píng)論 2 89
  • 感覺慢慢長大锐峭,就要慢慢面臨身邊的人慢慢離開我們中鼠。小時(shí)候什么都不懂可婶,長大了什么都得懂沿癞。就像曾經(jīng)書上說的,我們終將被生...
    陳若心閱讀 241評(píng)論 1 1
  • 我是誰矛渴? 我很自大又很自負(fù) 我總是把自己想的很牛逼 可是我真的很low 我很笨但是我從不藐視自己 我很想像別人一樣...
    遇見本杰明閱讀 117評(píng)論 0 0