DOM DOM  -  D ocument  O bject  M odel browser loads and “parses” the HTML and generates DOM nodes each DOM node is an object DOM consists of a hierarchy of DOM node Nodes are html tags + text nodes + comment nodes + ... others (12 node types) Element is a node of a specific element type -  Node.ELEMENT_NODE comments & text nodes aren't elements Node is constructor of a node, HTMLElement is a constructor of an element in JavaScript DOM element is a subtype of a node every HTML tag is an object acc. to DOM text inside a tag is an object as well document.body  - object representing the  <body>  tag most standard HTML attributes of element nodes automatically become properties of DOM objects DOM is a tree structure of tags, where every tree node is an object Tags are element nodes (or just elements) and form the tree structure Text inside forms text nodes and contains only a string Spaces and newlines form text nodes become a part of the DOM Browser tools do not show spaces at the start/end of the text and line-breaks between tags Developer tools shows DOM, but w/o "blanks" and text nodes are shown as a text Auto correction Spaces and newlines before  <head>  are ignored for historical reasons something after  </body>  automatically moved inside the body malformed HTML is automatically corrected when DOM is being made if  <html>   <body>  don't exist, it will exist in the DOM browser closes tags automatically tables always have  <tbody> Node types Everything in HTML, even comments, become a part of the DOM, but in practice we usually work with 4 node types document  the “entry point” into DOM element nodes  HTML-tags, the tree building blocks text nodes  contain text comments  sometimes we can put information there, it won't be shown, but JS can read it from the DOM There are 12  node types Node classes Each DOM node belongs to the corresponding built-in class The classes form a hierarchy The root of the hierarchy is  EventTarget  -  Node  - ... other DOM nodes  The full set of properties and methods come as the result of inheritance EventTarget EventTarget  is the root “abstract” class Objects of this class are never created, they are served as a base Node  class inherits from it Node Node  is also an “abstract” class, serving as a base for DOM nodes It provides the core tree functionality: parentNode, nextSibling, childNodes and so on (they are getters) Objects of Node class are never created. "Text", "Element", "Comment" inherit from it Element Element  is a base class for DOM elements It provides element-level navigation like nextElementSibling, children and searching methods like getElementsByTagName, querySelector "HTMLElement" inherit from it HTMLElement HTMLElement  is finally the basic class for all HTML elements It is inherited by HTML elements HTMLInputElement  the class for  <input>  elements HTMLBodyElement  the class for  <body>  elements HTMLAnchorElement  the class for  <a>  elements …and so on, each tag has its own class that may provide specific properties and methods 
      input.constructor.name // "HTMLInputElement"
      input instanceof HTMLElement  // true
      input instanceof EventTarget  // true
       console.dir(inputElem) let's console some input element with  console.dir(inputElem) in DOM object tree in  __proto__  we can see hierarchy HTMLInputElement  this class provides input-specific properties HTMLElement  it provides common HTML element methods (and getters/setters) Element  provides generic element methods Node  provides common DOM node properties EventTarget  gives the support for events Object  plain object methods available, like hasOwnProperty etc... elem.nodeType 
      elem.nodeType == 1 // for element nodes
      elem.nodeType == 3 // for text nodes
      elem.nodeType == 9 // for the document object
       In modern scripts, we can use  instanceof  and other class-based tests. elem.nodeName we can read node tag name from nodeName or tagName properties nodeName is defined for any Node 
      document.body.nodeName // BODY
      input.nodeName // INPUT
       elem.tagName The  tagName  property exists only for  Element  nodes. 
      document.body.tagName // BODY
       Browser host environment - browser, web-server, or another host (even coffee machine), where JavaScript runs each host environment provides platform-specific functionality host environment provides own objects and functions additional to the language core in browser the DOM is kept in  window  object - root object for a web-browser browser (or other host environment) provides additional objects for working with everything except the document 
      // window object
      function sayHi() { alert("Hello") }
      sayHi()
      window.sayHi() // same, function is located in window object
      window.innerHeight // inner window height
       
        // BOM
        location.href // shows current URL
        location.href = "https://wikipedia.org"; // redirect the browser to another URL
        alert/confirm/prompt/navigator/screen/location/frames/history/XMLHttpRequest