美文网首页
A27-DOM API

A27-DOM API

作者: 半斋 | 来源:发表于2018-01-25 22:20 被阅读0次

    DOM

    • MDN
    • 阮一峰
      什么是DOM,DOM最重要的就是要明白它的概念,否则遇到问题也不知道如何下手
      大家都说DOM树,这是一个比喻,易于理解,
      D就是文档,想象它是一个树状的结构(就像之前数据结构里的二叉树那样),树上有着节点(node)
      O就是对象,
      M也就是模型,把D和O做一个一一对应的映射,就是这个模型
      所以DOM就是把文档变成一个对象
      映射
      上图红字
      DOM转化来的js对象里面到底存放什么由DOM标准规定
      比如:
      上图的 head、body、meta、link、h1、p 都是Element的实例
      (中间存在其它函数,F12调试可见,比如document.body就是document.body.proto->HTMLBodyElement.prototype.proto->HTMLElement.prototype.proto->Element.prototype)
      根节点html比较特殊,是由document构造的(DOucment->HTMLDocument,简写)
      至于文本节点则是由

    Node Api

    Node 属性

    记住以下单词;

    • child / children / parent
    • node
    • first / last
    • next / previous
    • sibling / siblings
    • type
    • value / text / content
    • inner / outer
    • element
      然后相互组合
      一部分:childNodes,firstChild,innerText,lastChild,nextSibling,nodeName,nodeType,nodeValue,outerText,ownerDocument,parentElement,parentNode,previousSibling,textContent
    <html>
      <head></head>
      <body></body>
    </html>
    
    document.body.previousSibling // #text
    document.body.previousSibling.previousSibling // <head></head>
    docuemnt.body.previousElementSibling // <head></head>
    // 为什么previousSibling返回的是文本节点呢,这是因为本来dom是配对xml的,后来强行配对html
    // previousSibling是 Node 的属性,previousElementSibling是 Element 的属性
    // previousSibling 是本来就有的,previousElementSibling是后来加的
    // 类似的还有 nextSibling / nextElementSibling, firstChild / firstElementChild 等等
    // 可以在F12中尝试,控制台会显示提示以及该属性属于哪个对象
    

    几个要注意的 Node Api

    • nodeName
      注意这个api很奇葩
      document.body.nodeName // 'BODY
      document.documentElement.nodeName // 'HTML
      document.nodeName不行,必须像上面那样写
      它对所有标签返回名称都是大写
      但是!唯有svg,它返回小写
      document.getElementsByTagName('svg')[0] // 'svg'
      这是因为svg是‘外来的’标签,它是后来新加的,然后就这么小写了……
    • nodeType -MDN
      只读属性 Node.nodeType 表示的是该节点的类型。其所有可能的值请参考节点类型常量.
      它返回一个整数来表示节点的类型
      (之所以这样是因为当年的计算机还没这么发达,而1比element的字节小多了)
      以下几个需知:
      1 元素节点, Eg:<div>、<p>
      3 文本节点, 元素或者属性中实际的文字,比如<p>段落</p>中的段落二字
      9 Document节点,
      11 DocumentFragment节点 // 很特殊的一个节点(暂时我还不清楚,google DocumentFragment优化)
      document.body.nodeType // 1
      document.nodeType // 9
      document.documentElement.nodetype // 1
      document.documentElement.nodeName // 'HTML'
      // 所以document.documentElement才是html,document不是?
      
    • innerTexttextContent -MDN
      区别:
      • textContent 会获取所有元素的内容,包括 <script> 和 <style> 元素,然而 innerText 不会。
      • innerText意识到样式,并且不会返回隐藏元素的文本(设置display:none的元素),而textContent会。
      • 由于 innerText 受 CSS 样式的影响,它会触发重排(reflow),但textContent 不会。
      • 与 textContent 不同的是, 在 Internet Explorer (对于小于等于 IE11 的版本) 中对 innerText 进行修改, 不仅会移除当前元素的子节点,而且还会永久性地破坏所有后代文本节点(所以不可能再次将节点再次插入到任何其他元素或同一元素中)。
    • childNodes -MDN
      Node.childNodes 返回包含指定节点的子节点的集合,该集合为即时更新的集合(live collection)。
      var parent = document.getElementById('parent');
      parent.childNodes.length // 2
      parent.appendChild(document.createElement('div'));
      parent.childNodes.length // 请问现在 length 是多少
      
      // 3
      
      // 与之相反的是 querySelectorAll() ,它返回的是一个静态的 NodeList
      var allDiv = document.querySelectorAll('div>
      allDiv.length // 假设是 2
      document.body.appendChild(  document.createElement('div')  )
      allDiv.length // 请问现在 length 的值是多少???
      // 2
      // querySelectorAll方法不属于 node,是document 和 element 的
      
    • HTMLCollection与NodeList的区别有
      • HTMLCollection实例对象的成员只能是Element节点,NodeList实例对象的成员可以包含其他节点。
      • HTMLCollection实例对象可以用id属性或name属性引用节点元素,NodeList只能使用数字索引引用。
      • HTML DOM 中的 HTMLCollection 是即时更新的(live);
        当其所包含的文档结构发生改变时,它会自动更新。
        NodeList 对象大多数情况下是个实时集合。
        意思是说,如果文档中的节点树发生变化,则已经存在的 NodeList 对象也可能会变化。例如,Node.childNodes 是实时的。
        在另一些情况下,NodeList 是一个静态集合,也就意味着随后对文档对象模型的任何改动都不会影响集合的内容。document.querySelectorAll 返回一个静态的 NodeList。

    Node 方法 (如果一个属性是函数,那么这个属性就也叫做方法;换言之,方法是函数属性)

    • appendChild()
    • cloneNode() // 分深、浅拷贝
    • contains()
    • hasChildNodes()
    • insertBefore()
    • isEqualNode() // 看起来相等
    • isSameNode() // 完全相等,可以用 === 来代替
    • removeChild()
    • replaceChild()
    • normalize() // 常规化
      基本看见名字就知道作用,不清楚也可以查MDN。

    Document Api -MDN

    Document 属性

    • body
    • characterSet
    • childElementCount
    • children
    • doctype
    • documentElement
    • domain
    • fullscreen
    • head
    • hidden
    • images
    • links
    • location
    • onxxxxxxxxx
    • origin
    • plugins
    • readyState
    • referrer
    • scripts
    • scrollingElement
    • styleSheets
    • title
    • visibilityState

    Document 方法:

    • close()
    • createDocumentFragment()
    • createElement()
    • createTextNode()
    • execCommand()
    • exitFullscreen()
    • getElementById()
    • getElementsByClassName()
    • getElementsByName()
    • getElementsByTagName()
    • getSelection()
    • hasFocus()
    • open()
    • querySelector()
    • querySelectorAll()
    • registerElement()
    • write()
    • writeln()

    Element Api -MDN

    关于 DOM API 更多见之后写的常用 API。(待续)

    相关文章

      网友评论

          本文标题:A27-DOM API

          本文链接:https://www.haomeiwen.com/subject/llwvaxtx.html