DOM 節(jié)點的相應(yīng)操作

DOM的相關(guān)操作

什么是DOM

DOM (document object model) 文檔對象模型诵叁,是W3C 組織推薦的處理可擴展標(biāo)準(zhǔn)語言的標(biāo)準(zhǔn)編程接口。 是HTML和XML文檔的編程接口钦椭。DOM是獨于平臺和語言的接口存捺,它允許程序和腳本動態(tài)地訪問和更新文檔的內(nèi)容抖僵、結(jié)構(gòu)和樣式。

認識 DOM

DOM可以將任何HTML描繪成一個由多層節(jié)點構(gòu)成的結(jié)構(gòu)。節(jié)點分為12種不同類型.每個節(jié)點都擁有各自的特點视搏、數(shù)據(jù)和方法,也與其他節(jié)點存在某種關(guān)系夕玩。節(jié)點之間的關(guān)系構(gòu)成了層次坤按,而所有頁面標(biāo)記則表現(xiàn)為一個以特定節(jié)點為根節(jié)點的樹形結(jié)構(gòu)。 (節(jié)點類型一共有12種)

HTML文檔可以說由節(jié)點構(gòu)成的集合盲厌,DOM節(jié)點:(常用的3種)

  • 元素節(jié)點(Element):上圖中<html>署照、<body>、<p>等都是元素節(jié)點吗浩,即標(biāo)簽建芙。
  • 文本節(jié)點(text): 向用戶展示的內(nèi)容,如<li>...</li>中的JavaScript懂扼、DOM禁荸、CSS等文本。
  • 屬性節(jié)點(Attr): 元素屬性阀湿,如 <a> 標(biāo)簽的鏈接屬性赶熟。

DOM 操作

節(jié)點至少包括nodeType、nodeName陷嘴、nodeValue 三種基本屬性

  • nodeType 返回節(jié)點類型的常數(shù)值
    元素節(jié)點              Node.ELEMENT_NODE(1)
    屬性節(jié)點              Node.ATTRIBUTE_NODE(2)
    文本節(jié)點              Node.TEXT_NODE(3)
    CDATA節(jié)點             Node.CDATA_SECTION_NODE(4)
    實體引用名稱節(jié)點       Node.ENTRY_REFERENCE_NODE(5)
    實體名稱節(jié)點          Node.ENTITY_NODE(6)
    處理指令節(jié)點          Node.PROCESSING_INSTRUCTION_NODE(7)
    注釋節(jié)點              Node.COMMENT_NODE(8)
    文檔節(jié)點              Node.DOCUMENT_NODE(9)
    文檔類型節(jié)點          Node.DOCUMENT_TYPE_NODE(10)
    文檔片段節(jié)點          Node.DOCUMENT_FRAGMENT_NODE(11)
    DTD聲明節(jié)點            Node.NOTATION_NODE(12)
    
    console.log(Node.ELEMENT_NODE)  // 1
    
  • nodeName 返回該節(jié)點的大寫字母標(biāo)簽名
  • nodeValue 返回和設(shè)置當(dāng)前節(jié)點的值
        let span = document.getElementById("span")
        console.log(span.nodeName)
        console.log(span.nodeType)
        console.log(span.nodeValue)
    

獲取DOM節(jié)點

  • 原生js獲取
    • document.getElementById("id") // 通過id獲取單個標(biāo)簽
    • document.getElementsByClassName("classname") // 返回帶有指定類名的NodeList映砖。
    • document.getElementsByName("name") // 返回帶有指定名稱的NodeList。
    • document.getElementsByTagName("tagname") // 通過 標(biāo)簽名 獲得 NodeList灾挨。
    • document.getElementsByTagNameNS("d",title) // 返回帶有指定名稱和命名空間的所有元素的 NodeList邑退。xml
  • jquery 獲取
    var $p_dom=$("p");    // 獲取p節(jié)點
    $p_dom.attr("title"); // 輸出p節(jié)點的title屬性

    var $li_2=$("ul li:eq(1)");  // 獲取第2個li節(jié)點   
    $li_2.attr("title");         // 第2個li節(jié)點的title屬性
    $li_2.html();                // 第2個li節(jié)點的文本內(nèi)容

創(chuàng)建DOM節(jié)點/屬性

  • 原生創(chuàng)建
    var div = document.createElement('div')           // 創(chuàng)建一個節(jié)點

    var id = document.createAttribute('id') // 創(chuàng)建一個指定名稱的屬性
    id.value = "hui"  
    document.getElementById("box").setAttributeNode(id)

    text = document.createTextNode("text");   //創(chuàng)建文本節(jié)點
    div.appendChild(text)
    document.body.appendChild(div)
  • jquery 創(chuàng)建
    $li1=$("<li></li>")                    // 創(chuàng)建元素節(jié)點
    $li1=$("<li>text</li>")                // 創(chuàng)建文本節(jié)點
    $li3=$("<li title='榴蓮'>榴蓮</li>");  // 創(chuàng)建屬性節(jié)點

    $("ul").append($li3);   // 新建節(jié)點添加到DOM樹中  竹宋。append 添加dom節(jié)點

添加節(jié)點

  • 原生添加

    • jQuery.insertBefore(要插入的節(jié)點,指定節(jié)點)
    • jQuery.appendChild(要添加的節(jié)點) 追加
          div.insertBefore(span,p)   // 將span插入到div中的p前面
          div.appendChild(span)      // span添加到div的最后面
    
  • jquery 添加

    • before() 和 insertBefore
    • after() 和 insertAfter()
    • prepend()地技、prependTo()
    • append()蜈七、appendTo()

    組內(nèi)的區(qū)別 : 返回的jquery對象不同。

        var li = $("<li>被添加的元素</li>")
        $("#box").before(li) 
        li.insertBefore($("#box")) 
    
        $("#box").after(li)
        li.insertAfter($("#box"))
    
        $("#box").append(li)
        li.appendTo($("#box"))
    
        let b = $("#box").prepend(li)  // 返回的是$("#box")對象莫矗,其他組一樣
        let c =li.prependTo($("#box")) // 返回的是li對象 飒硅,其他組一樣其他組一樣
        b.css("background","red")   
        c.css("background","red")
    

刪除節(jié)點

  • 原生刪除
    • removeChild() // box.removeChild(p) box中刪除p元素
  • jquery刪除
    • remove()
    • empty()
        $span = $("span").remove("span[id='span']")  // 返回值為所有的span元素
        $("#box").empty()                            // 清空所有的內(nèi)容
    

節(jié)點的修改操作

  • 原生
    • cloneNode() 參數(shù)true 表示復(fù)制元素時也復(fù)制元素行為
    • node.replaceChild(newnode,oldnode)
  • jQuery 操作
    • 復(fù)制元素 clone() // 參數(shù)true 表示復(fù)制元素時也復(fù)制元素行為
    • 包裹節(jié)點
      • wrap()
      • wrapAll()
      • wrapInner()
          $("p").wrap("<div></div>")       // 每個p標(biāo)簽外面都被一個div元素包裹,
          $("p").wrapAll("<div></div>")    // 所有的p標(biāo)簽都被包裹到一個div元素中
          $("p").wrapInner("<div></div>")  // 每個p標(biāo)簽包裹一個div元素趣苏,p元素中的內(nèi)容放在div中狡相。  和wrap相反
      
      
    • 替換節(jié)點
      • repalcewith()
      • repalceAll()
          // div代替所有的p標(biāo)簽,寫法不同
          $("p").replaceWith($("<div>new</div>"))
          $("<div>new</div>").replaceAll("p")
      

查找節(jié)點(父節(jié)點食磕,子節(jié)點尽棕,兄弟節(jié)點 等等)

  • 原生
    • childNodes
      childNodes 返回的是子節(jié)點的集合,是一個數(shù)組的格式彬伦。他會把換行和空格也當(dāng)成是節(jié)點信息滔悉。
    • children
    • firstChild
      • firstChild 瀏覽器解析的時候會把他當(dāng)換行和空格一起解析,其實你獲取的是第一個子節(jié)點单绑,只是這個子節(jié)點是一個換行或者是一個空格而已
    • firstElementChild
    • lastChild 和firstChild有一樣的問題
    • lastElementChild
    • parentNode (w3c的標(biāo)準(zhǔn)) parentElement (ie的標(biāo)準(zhǔn))
    • offsetParent 獲取所有的父節(jié)點
    • previousSibling回官,previousElementSibling 獲取上一個兄弟節(jié)點
      previousSibling 會匹配字符,包括換行和空格搂橙,而不是節(jié)點歉提。previousElementSibling則直接匹配節(jié)點。
    • nextSibling区转,nextElementSibling 獲取下一個兄弟節(jié)點 不同點和上面類似
  • jquery 查找
    • jQuery.parent(selector) 獲取父節(jié)點

    • jQuery.parents(selector) 獲取祖先元素

    • jQuery.children(expr) 查找所有子元素苔巨,只會找到直接的孩子節(jié)點,不會返回所有子孫

    • jQuery.contents() 查找下面的所有內(nèi)容废离,包括節(jié)點和文本侄泽。

    • jQuery.prevAll() 查找所有之前的兄弟節(jié)點

    • jQuery.next() 查找下一個兄弟節(jié)點,不是所有的兄弟節(jié)點

    • jQuery.prev() 查找上一個兄弟節(jié)點蜻韭,不是所有的兄弟節(jié)點

    • jQuery.nextAll() 查找所有之后的兄弟節(jié)點

    • jQuery.siblings() 查找兄弟節(jié)點悼尾,不分前后

    • jQuery.find(expr)

        $("p").find("span")等于$("p span") 跟jQuery.filter(expr)完全不一樣,jQuery.filter(expr)是從初始的   
      
    • jquery.filter() 將匹配元素集合縮減為匹配指定選擇器的元素 // $("span").filter(":even") 或:odd

其他操作 屬性及樣式肖方,文本操作

  • 原生
    • 元素的其他操作
      • element.id 設(shè)置或返回元素的 id闺魏。
      • element.className 設(shè)置或者 返回元素的類名
      • element.tagName 返回元素的標(biāo)簽名(大寫)
      • element.style 設(shè)置或返回元素的樣式屬性,
      • element.clientHeight/clientWidth 返回內(nèi)容的可視高度/寬度(不包括邊框,邊距或滾動條)
      • element.offsetHeight/offsetWidth /offsetLeft/offsetTop 返回元素的高度/寬度/相對于父元素的左偏移/右偏移(包括邊框和填充,不包括邊距)
      • element.scrollHeight/scrollWidth/scrollLeft/scrollTop 返回整個元素的高度(包括帶滾動條的隱蔽的地方)/寬度/返回當(dāng)前視圖中的實際元素的左邊緣和左邊緣之間的距離/上邊緣的距離
    • 文本操作
      • element.innerHTML 設(shè)置或者返回元素的內(nèi)容俯画,可包含節(jié)點中的子標(biāo)簽以及內(nèi)容
      • **element.innerText ** 設(shè)置或者返回元素的內(nèi)容析桥,不包含節(jié)點中的子標(biāo)簽以及內(nèi)容
      • element.value
    • 屬性操作
      • element.createAttribute() 創(chuàng)建屬性

      • element.setAttributeNode() 修改指定屬性節(jié)點

      • element.setAttribute(attrName,attrValue) 把指定屬性設(shè)置或更改為指定值

      • element.getAttribute(para) 返回元素節(jié)點的指定屬性值

      • element.getAttributeNode(para) 返回指定的屬性節(jié)點

      • element.attributes 返回所有的屬性

      • node.hasAttributes()

      • element.hasAttribute(para) 如果元素擁有指定屬性,則返回true,否則返回 false烹骨。

      • element.removeAttribute() 從元素中移除指定屬性。

      • element.removeAttributeNode(attributenode) 方法用來刪除指定的屬性

  • jQuery
    • 屬性操作
      • jQuery.attr("title") 獲取title屬性 attr("title","aaa") 設(shè)置屬性
      • jQuery.removeAttr("title") 刪除屬性
    • 樣式操作
      • jQuery.addClass() 添加類名
      • jQuery.removeClass() 移除類名
      • jQuery.hasClass() 判斷是否存在某個類名
    • 文本操作
      • jQuery.html() 獲取所有的內(nèi)容材泄,包括文本和子標(biāo)簽
      • jQuery.text() 只獲取元素的純文本內(nèi)容
      • jQuery.val() 設(shè)置和獲取元素的值
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沮焕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拉宗,更是在濱河造成了極大的恐慌峦树,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旦事,死亡現(xiàn)場離奇詭異魁巩,居然都是意外死亡,警方通過查閱死者的電腦和手機姐浮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門谷遂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卖鲤,你說我怎么就攤上這事肾扰。” “怎么了蛋逾?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵集晚,是天一觀的道長。 經(jīng)常有香客問我区匣,道長偷拔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任亏钩,我火速辦了婚禮莲绰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铸屉。我一直安慰自己钉蒲,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布彻坛。 她就那樣靜靜地躺著顷啼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昌屉。 梳的紋絲不亂的頭發(fā)上钙蒙,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音间驮,去河邊找鬼躬厌。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扛施。 我是一名探鬼主播鸿捧,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疙渣!你這毒婦竟也來了匙奴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤妄荔,失蹤者是張志新(化名)和其女友劉穎泼菌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啦租,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡哗伯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篷角。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焊刹。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖内地,靈堂內(nèi)的尸體忽然破棺而出伴澄,到底是詐尸還是另有隱情,我是刑警寧澤阱缓,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布非凌,位于F島的核電站,受9級特大地震影響荆针,放射性物質(zhì)發(fā)生泄漏敞嗡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一航背、第九天 我趴在偏房一處隱蔽的房頂上張望喉悴。 院中可真熱鬧,春花似錦玖媚、人聲如沸箕肃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勺像。三九已至,卻和暖如春错森,著一層夾襖步出監(jiān)牢的瞬間吟宦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工涩维, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殃姓,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像蜗侈,于是被迫代替她去往敵國和親篷牌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351