Dom1

177 阅读5分钟
引言
  • 对于html文档,<html>(文档元素)是文档的最外层元素
  • Dom树中,HTML元素通过元素节点表示,特性(attribute)通过特性节点表示, 文档 类型通过文档类型节点表示,而注释则通过注释节点表示,共有12种节点类型.
Node类型
  1. dom1级定义了一个Node接口.
  • 该接口在js中通过Node类型实现的.
  • js所有节点类型都继承Node类型.
  • 每个节点都有一个nodeType属性,用于表示节点的类型-----> 共有12种类型,Node里面用常量值表示:
   Node.ELEMENT_NODE -----> 1
   Node.ATTRIBUTE_NODE ----->2
   Node.TEXT_NODE ------>3
   Node.CDATA_SECTION_NODE ----->4
   Node.ENTITY_REFERENCE_NODE ----->5
   Node.ENTITY_NODE ------>6
   Node.PROCESSING_INSTRUCTION_NODE ----->7
   Node.COMMENT_NODE ------->8
   Node.DOCUMENT_NODE ------->9
   Node.DOCUMENT_TYPE_NODE ------>10
   Node.DOCUMENT_FRAGMENT_NODE ----->11
   Node.NOTATION_NODE -------->12
  • 通过上面的常量很容易确定节点类型
   //假设someNode是我们获取的一个节点
   //针对非IE浏览器
   if(someNode.nodeType==Node.ELEMENT_NODE){
       console.log("是元素节点")
   }
   //针对所有浏览器
   if(someNode.nodeType==1){
      console.log("是元素节点")
   }
  1. 节点之间的关系
  • 每个节点都有一个childNodes属性,它是一个类似数组对象,拥有数组的语法a[i],push等等,也可以通过item获取里面的值.
    //第一个节点
    var fristNode=someNode.childNodes[0];
    //第二个节点
    var secondNode=someNode.item(1);
    //数组的长度
    var count = someNode.childNodes.length; 
  • 节点的 firstChildlastChild属性分别指向其childNodes列表中的第一个最后一个节点。
  • childNodes只有个子节点的情况,firstChildlastChild属性同时指向它,没有子节点时,则都指向null
    if(someNode.fristNode==someNode.childNodes[0]){
        console.log("确实是第一个")
    }
  • 每个节点都有一个parentNode属性 ------>用来获取父节点
  • 每个节点都有一个previousSilbing,nextSilbing属性----->获取左侧节点和右侧节点---->可用在childNodes中.
  • 可用hasChildNodes方法判断是否有子节点。
  1. 操作节点
  • 新增 appendChild():插入后成为最后一个子节点 -----> 参数: 为要插入的节点(node).
   fatherNode.appendChild(newNode);
  • 指定位置新增 insertBefore():指定位置插入一个节点------> 个参数:要插入的节点和作为参照的节点
   // 插入成为最后一个子节点
   fatherNode.insertBefore(newNode,null);
   //插入成为第一个节点
   fatherNode.insertBefore(newNode,fatherNode.firstChild);
  • 置换 replaceChild(): 替换指定位置的节点 ------->个参数:要插入的节点和要替换的节点.
   fatherNode.replaceChild(newNode,fatherNode.firstChild);
  • 移除 removeChild():移除指定位置的节点.
   fatherNode.removeChild(fatherNode.firstChild);
document 类型

常见属性:可以通过 document 直接获取

title : 包含在<title>元素中的文本,显示在浏览器的 标题栏标签页


URL: 包含页面完整URL


domain: 只包含页面的域名


referrer: 保存链接到当前页面的那个页面的URL

 //如设置标签名
 document.title = "New Page Title"
 // 如 URL
 document.URL= "http://www.wrox.com/WileyCDA/"
 // 则对应的域名为
 document.domain= "www.wrox.com"
  1. 跨域处理
  • 设置 domain时不能设置为 URL 不包含的域.
  • 如果域名一开始松散的,就不能再将它设置为紧绷的。
  //假设页面来自于 p2p.wrox.com 域
  document.domain = "wrox.com";  //松散的(成功)
  document.domain = "p2p.wrox.com"; //紧绷的(出错!)
  // 对两个URL进行跨域处理 "p2p.wrox.com", "b2b.wrox.com",都设置为
  document.domain = "wrox.com"; 
  1. 查找元素
  • 通过标签的 id 查找 : document.getElementById()
  • 通过标签名来查找: document.getElementsByTagName() ------>查询结果是类似动态数组,可通过数组下标,或item(index)获取相应元素对象 ------> 当参数传 * 时获取所有元素对象
  • 通过标签的 name 特性查找: document.getElementsByName(),结果获取与通过标签名查找一样
  1. 文档写入
  • write() writeIn():都是传入一个字符串参数,但后者会在字符串后面加一个\n 换行符号。
  • 字符串参数可以为正常文本html文本外部资源
  • 当传入的是一个html文本时,会创建一个dom元素
   <html>
   <head>
    <title>document.write() Example</title>
   </head>
   <body>
    <p>The current date and time is:
    <script type="text/javascript">
      // 创建dom元素
      document.write("<strong>" + (new Date()).toString() + "</strong>");
    </script>
    </p>
   </body>
   </html> 
  • 当动态包含外部资源时,要对尾部<\/script>标签进行转义处理,不然直接会与外部的<script>匹配.
  <html>
  <head>
   <title>document.write() Example 3</title>
  </head>
  <body>
   <script type="text/javascript">
   //要对尾部script标签进行转义处理
   document.write("<script type=\"text/javascript\" src=\"file.js\">" +
   "<\/script>");
   </script>
  </body>
  </html> 
Element 类型

nodeType==1 表示元素节点类型 ; 可通过 nodeName tagName 获取标签名

  // div标签
  <div id="myDiv"></div> 
  // 获取div节点
  var div=document.getElementById("myDiv");
  // 获取元素标签名
  var divName=div.tagName;-----> 值为大写的 DIV
  //也可以这样获取
  var divName1=div.nodeName;

html元素的特性:

id:元素在文档中的唯一标识符


title:有关元素的附加说明信息


className: 与元素的class特性对应

  1. 直接获取元素特性值
  <div id="myDiv" class="bd" title="Body text"></div> 
  var div = document.getElementById("myDiv");
  alert(div.id); //"myDiv""
  alert(div.className); //"bd"
  alert(div.title); //"Body text"
  1. 通过方法设置特性值
  • getAttribute():获取特性值,此时自定义的特性也可以通过方法获取------->根据html5规范,自定义特性需要加 data- 前缀。
  <div id="myDiv" class="bd" title="Body text" data-custom-attr="happy"></div> 
  var div = document.getElementById("myDiv");
  alert(div.getAttribute("id")); //"myDiv"
  //此处是class而不是className
  alert(div.getAttribute("class")); //"bd"
  alert(div.getAttribute("title")); //"Body text" 
  alert(div.getAttribute("data-custom-attr")); //"happy" 
  • 个特性需要注意:style -----> 通过getAttribute获取的是一个 css文本,通过对象.属性(如 div.style)获取的是一个对象; 事件(如 onclick )-------> 通过getAttribute获取的是相应代码的字符串,通过对象.属性(如直接访问onclick属性),会直接返回一个js函数

  • 设置特性:setAttribute(data1,data2),参数分别是要设置的特性名.

  div.setAttribute("id", "someOtherId");
  div.setAttribute("class", "ft"); 
  • 删除特性:removeAttribute(data),参数为要删除的特性
  div.removeAttribute("class");
  1. attributes属性
  • attribute属性包含一系列节点(即NameNodeMap),个节点的nodeName就是特性的名称nodeValue就是特性的
  • NameNodeMapNodeList类似,是一个动态的集合,可调用以下方法:

getNamedItem(name):返回NodeName属性等于name的节点.


removeNamedItem(name):从列表中移除NodeName属性等于name的节点。


setNamedItem(node):向列表中添加节点,其实和上面setAttribute作用一样,就是在为元素对象添加新特性


item(pos):返回位于pos位置处的节点

  • 此特性最重要的功能就是为了遍历所有元素特性。
  function outputAttributes(element){
      var pairs = new Array(),
      attrName,
      attrValue,
      i,
      len;
      for (i=0, len=element.attributes.length; i < len; i++){
          attrName = element.attributes[i].nodeName;
          attrValue = element.attributes[i].nodeValue;
          pairs.push(attrName + "=\"" + attrValue + "\"");
      }
      return pairs.join(" ");
  } 
  1. 创建元素
  • createElement(tagName):传入标签名,创建元素。
    var div = document.createElement("div"); 
    div.id = "myNewDiv";
    div.className = "box"; 
Text类型

nodeType 的值为 3nodeName 的值为"#text"nodeValue 的值为节点所包含的文本parentNode 是一个 Element; 不支持(没有)子节点。

  • 创建一个文本节点:createTextNode(str)
    //创建一个元素节点
    var element = document.createElement("div");
    //设置class特性值
    element.className = "message";
    //创建一个文本节点
    var textNode = document.createTextNode("Hello world!");
    //向元素节点中添加文本节点
    element.appendChild(textNode);
    //向body中添加元素节点
    document.body.appendChild(element); 
动态脚本
  • 插入外部文件:动态加载外部js文件,能够立即执行
    var script= document.createElement("script");
    script.type="text/javascript";
    script.src="client.js";
    document.body.appendChild(script);
  • 插入 js 代码
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.text = "function sayHi(){alert('hi');}";
    document.body.appendChild(script); 
  • 动态样式
    //link 标签用来链入外部的css文件
    var link = document.createElement("link");
    link.rel = "stylesheet";
    link.type = "text/css";
    // 关联的外部css文件
    link.href = "style.css";
    var head = document.getElementsByTagName("head")[0];
    //加link 加入head中
    head.appendChild(link);