首页 > 代码库 > DOM,BOM

DOM,BOM

1.DOM:文档对象模型(Document Object Model)
 1)子节点:只是这一代的后代,不会计算后代的后代
    1.childNodes:获取子节点,
      --IE6-8:获取的是元素节点,正常
      --高版本浏览器:但是会包含文本节点和元素节点(不正常)


    2.nodeType:节点的类型
      --nodeType=3-->文本节点
      --nodeTyPE=1-->元素节点
      所以获取元素节点兼容的方法:
        for(var i=0;i<oUL.childNodes.length;i++){
          if(oUl.childNodes[i].nodeType==1){
            oUl.childNodes[i].style.background=‘red‘;
          }
        }
   3.children属性:只获取元素节点,不获取文本节点,比上面的好用所以我们一般获取子节点时,最好用这个属性


  2)父节点:
    1.parentNode:获取某一个元素的父节点(获取的是直接父级)
      --this.parentNode.style.display=‘none‘;


    2.offsetParent:获取元素相对定位的父级(会根据样式的不同而不同)
      (若CSS中直接父级没有定位,会直接往上面找,直到找到有定位的父级)

    3.firstChild/firstElementChild:第一个子节点
      lastChild/lastElementChild:最后一个子节点
      nextSibling/nextElementSibling:下一个兄弟节点
      previousSibling/previousElementSibling:上一个兄弟节点
      --IE6-8下兼容:firstChild,lastChild,nextSibling,previousSibling,
          (高版本浏览器IE9+,FF,Chrome不兼容,其获取的空白文本节点)
      --高版本浏览器下兼容:firstElementChild,lastElementChild,nextElementSibling,previousElementSibling
          (低版本浏览器IE6-8不兼容)
      --兼容写法:
        if(oUl.firstElementChild){
          oUl.firstElementChild.style.background=‘red‘;
        }else{
          oUl.firstChild.style.background=‘red‘;
        }


  3)DOM方式操作元素的属性:
    (之前学过.和[]操作属性的方法,可以下面的互换)
    1)设置属性:element.setAttribute(属性名称,值)
    2)获取属性:element.getAttribute(属性名称)
    3)删除属性:element.removeAttribute(属性名称)


  4)获取元素的方法:
    --document.getElementById()
    --document.getElementsByTagName()
    --document.getElementsByName()
    --封装一个通过class获取元素的函数
      function getByClass(oParent,sClass){
        var arr=[];
        aEle=oParent.getElementByTagName(‘*‘);
        for(var i=0;i<aEle.length;i++){
          if(aEle[i].className==sClass){
            arr.push(aEle[i]);
          }
        }
        return arr;    //把所有得到的元素放进数组里面返回出去
      }
     var aBtn=getByClass(oUl,‘list‘);
      for(var i=0;i<aBtn.length;i++){
        aBtn[i].style.background=‘red‘;
      }


  5)DOM操作应用:
    1.创建元素: document.createElement(‘li‘);
    2.设置或返回元素的inner HTML:  element.innerHTML
    3.向元素的最后添加新的子节点: 父级.appendChild(子节点)
    4.向元素的最前面添加新的子节点:父级.insertBefore(子节点,在谁之前)
      insertBefore在IE下不行,因为ul里面本来没有li,找不到第一个元素子节点
      --兼容写法
        if(aLi.length>0){    //假如里面原来有li子元素
          oUl.insertBefore(cLi,aLi[0]);
        }else{    //原来没有元素,直接appendChild即可
          oUl.appendChild(cLi);
        }
      例:创建元素和插入元素:
        1)创建一个元素:var cLi=document.createElement(‘li‘);
        2)给创建的元素节点添加文本节点:cLi.innerHTML=oTxt.value;
        3)将创建的子节点添加到某个父级元素里面:oUl.appendChild(cLi);

    5.从元素中删除子节点:
      element.removeChild()-->父级.removeChild(子节点);
      var list=document.getElementById("myList");
      list.removeChild(list.childNodes[0]);
      删除之前:Coffee,Tea,Milk
      删除之后:Tea,Milk


    6.element.hasAttribute():如果元素拥有指定属性,则返回true,否则返回 false
        document.getElementsByTagName("BUTTON")[0].hasAttribute("onclick"); //true


    7.element.hasChildNodes():如果元素拥有子节点,则返回 true,否则 false
        document.body.hasAttributes();    //false


 6)文档碎片:(现在基本上已经不用,高版本浏览器性能提高不大)
    --创建一个文档碎片:var oFrag=document.createDocumentFragment()
    --可以提高DOM操作的性能
    --原理:假如我需要差很多元素到文档中,每插入一个元素,页面需要重新渲染一次,
      插入多个页面需要渲染多次,性能比较低,这时候就可以将这些要插入的
      元素放入到文档碎片中,最后一次性插入,一次性渲染,性能较高

 

 

2.BOM:浏览器对象模型(Browser Object Model)
  1.Window对象:
    1)特点:所有浏览器都支持window对象,它表示浏览器窗口
        所有 JavaScript 全局对象,函数以及变量均自动成为window对象的成员
        全局变量是window对象的属性
        全局函数是window对象的方法
        甚至 HTML DOM 的document也是window对象的属性之一
        document.getElementById("header")完整写法为:window.document.getElementById("header");


    2)Window对象属性:(其实全局对象都是Window对象的一个属性,只不过我们平时使用时都是省略window的,
      直接使用这些全局对象,下面会对全局对象做具体介绍)
      1.window.colsed:返回窗口是否已被关闭(true,false)
      2.window.document:对Document对象的只读引用
      3.window.history:对History对象的只读引用
      4.window.location:用于窗口或框架的Location对象
      5.window.Navigator:对Navigator对象的只读引用
      6.window.Screen:对Screen对象的只读引用


    3)Window对象方法:全局的函数(如alert())也是Window对象方法,有些我们平时使用时也是省略window,直接使用
      1.打开窗口:
        --window.open(‘about:blank‘)==>新弹出来一个空白页
        --window.open(‘about:blank‘,‘_self‘)==>在当前窗口打开一个新的
        --window.open(‘about:blank‘,‘_blank‘)==>新弹出来一个空白页,以前的窗口还在,默认为blank
        window.open方法打开的窗口是有返回值的,返回的是当前新打开的窗口,也是一个窗口对象
        例子:在新打开的窗口中写文字
        oBtn.onclick=function(){
            var newWindow=window.open(‘about:blank‘);
            newWindow.document.write(oTxt.value);
        };


      2.关闭窗口:
      --window.close()==>在谷歌下可以关闭,在IE会有提示,在火狐下会禁止脚本关闭用户打开的窗口
      --需要将用户打开的窗口先open打开,再close才有用
      <input type=‘button‘ value=http://www.mamicode.com/‘open‘ onclick="window.open(‘close.html‘);" />
      <input type=‘button‘ value=http://www.mamicode.com/‘close‘ onclick="window.close();" />


      3.定时器的使用:
          1)间隔性:setInterval(fn,毫秒数)    //作用是每隔多少时间执行一次函数
          2)延时性:setTimeout(fn,毫秒数)     //过多久执行一次函数,只执行函一次
          3)关闭定时器:clearInterval()/clearTimeout()
              是指从下一次开始关闭定时器,但是函数后面的代码会继续执行完毕,
              所以一般将函数后面的代码写在else里面与关闭定时器分割开来
            如何‘开‘或者‘关‘一个定时器
              <input id="btn1" type="button" value="http://www.mamicode.com/打开" />
              <input id="btn2" type="button" value="http://www.mamicode.com/关闭" />
              <script>
                  window.onload=function(){
                      var oBtn1=document.getElementById(‘btn1‘);
                      var oBtn2=document.getElementById(‘btn2‘);
                      var timer=null; //打开一个定时器
                      oBtn1.onclick=function(){
                          //setInterval返回上面打开的定时器
                          timer=setInterval(function(){
                              alert(‘a‘);
                          },1000);
                      }
                      oBtn2.onclick=function(){
                          //关闭时直接关闭上面打开的计时器即可
                          clearInterval(timer);
                      }
                  }
              </script>


      4.窗口尺寸:
        可视区尺寸:document.documentElement.clientWidth
                            document.documentElement.clientHeight
        滚动条滚动距离(滚动条高度):
                IE,Chrome:document.body.scrollTop
                FF:document.documentElement.scrollTop
        兼容处理:var scrollTop=document.documentElement.scrollTop||document.body.scrollTop


      5.系统对话框:(用的较少)
          --警告框:alert(‘内容‘);    ==>没有返回值
          --选择框:confirm(‘提问的内容‘);        ==>返回boolean值(确定返回true,取消返回false)
          --输入框:prompt(‘提示内容‘,‘默认值‘);        ==>返回当前输入的字符串或null


      6.window对象常用事件:window.onload,window.onscroll,window.onresize
        关于CSS中的固定定位fixed:IE6不兼容,position:fixed
        所以要想做右下角的固定小广告,需要用js实现,不能直接fixed固定
        问题1:当窗口改变大小时,右下角oDiv并不随着改变位置,需要用到window.onresize
        问题2:右下角小的oDiv会在滚动时出现抖动现象,可以做一个判断
                    userAgent>IE6==>fixed
                    IE6==>用运动解决  (在JS运动里面会讲到运动)
        window.onscroll=window.onresize=function(){
            var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
            var oDivheight=oDiv.offsetHeight;
            var clientHeight=document.documentElement.clientHeight;
            var Top=clientHeight-oDivheight+scrollTop;
            oDiv.style.top=Top+‘px‘;
        }


2.Navigator对象:包含有关浏览器的信息
    navigator.appName:返回浏览器的名称
    navigator.appVersion:返回浏览器的平台和版本信息
    navigator.userAgent:返回由客户机发送服务器的user-agent头部的值(也有当前的浏览器和浏览器版本信息)
    判断浏览器:
    mozilla = /firefox/.test(navigator.userAgent.toLowerCase());
    webkit = /webkit/.test(navigator.userAgent.toLowerCase());
    opera = /opera/.test(navigator.userAgent.toLowerCase());

3.Screen对象:包含有关客户端显示屏幕的信息
  JS中有几个对象的用处不大,而Screen对象就是其中之一,Screen对象基本上只用来表明客户端的能力,不详细说明了

4.History对象:包含用户(在浏览器窗口中)访问过的URL
  1)History对象的属性:
    length属性:返回浏览器历史列表中的URL数量,对于刚加载到窗口的第一个页面而言history.length=0


  2)History对象的方法:
    1.history.go():可在用户历史记录中任意跳转,可以向后,也可以向前
      go()方法参数为数字时:
        后退一步:history.go(-1);
        前进一步:history.go(1);
        前进两步:history.go(2);
      go()方法参数为字符串时:此时浏览器会跳到历史记录中包含该字符串最近的位置,可能前进,也可能后退,
          具体看参数字符串离哪个历史记录近.
        跳到最近的 baidu.com 页面:history.go(‘baidu.com‘);


    2.history.back():代替history.go()方法的后退一步
        后退一步:history.back();


    3.history.forward():代替history.go()方法的前进一步
        前进一步:history.forward();


5.Location对象:
  是最有用的BOM对象之一,它提供了与当前窗口中加载的文档有关的信息
  location对象是一个很特别的对象,因为它既是window对象的属性也是document对象的属性,
  也就是说:window.location与document.location引用的是同一个对象。


  1)Location对象属性:
    --location.hash设置或返回从井号(#)开始的UR(锚),如果没有此系列,则返回空字符串
      location.hash="#part2";
      document.write(location.hash);
    --location.host:设置或返回服务器名称和当前URL的端口号   ‘localhost:8080‘
    --location.hostname:设置或返回不带端口号的服务器名称   ‘localhost‘
    --location.href:设置或返回当前加载页面的完整URL,而location对象的toString()方法也返回这个值
      ‘http://localhost/learnjs/drag.html‘
    --location.pathname:设置或返回URL中的目录和(或)文件名    ‘/learnjs/drag.html‘
    --location.port:设置或返回当前URL的端口号,若无则返回空字符串   ‘8080‘
    --location.protocol:设置或返回页面使用的协议。通常为http:或https:
    --location.search:设置或返回URL的查询字符串.这个字符串以问号开头  ‘?q=javascript‘


  2)查询字符串参数:虽然上面的属性可以访问到location的大多数信息,但访问URL包含的查询字符串的属性并不完整
    虽然location.search可以返回从问号到URL末尾的所有内容,但不能访问其中的每个查询字符串参数
    创建函数,用以解析查询字符串,返回包含所有参数的一个对象:
    function getQueryArgs(){
      //取得查询字符串并去掉开头的问号
      var qs=(location.search.length>0 ? location.search.substring(1) : ‘‘);
      //定义保存数据的对象
      var args={};
      //取得每一项:
      var items=qs.length ? qs.split(‘&‘) : [];
      var item=null;
      var name=null;
      var value=http://www.mamicode.com/null;
      //逐个将每一项添加到args对象中
      for(var i=0;i<items.length;i++){
        item=items[i].split(‘=‘);
        name=decodeURIComponent(item[0]);
        value=http://www.mamicode.com/decodeURIComponent(item[1]);
        if(name.length){
          args[name]=value;
        }
      }
      return args;
    }
    //假设查询的字符串是:?a=1&B=2
    var args=getQueryArgs();
    alert(args[‘a‘]);   //1
    alert(args.B);    //2


  3)Location对象方法:
    --location.assign(‘URL‘):加载新文档,可以打开一个新的文档,并在浏览器中添加一条历史记录
    --window.location=‘URL‘/location.href=http://www.mamicode.com/‘URL‘与location.assign(‘URL‘)作用相同.
      在这些打开新文档的方法中,常用的是location.href属性
    --location.reload():重新加载当前文档
      没有参数时,页面会以最有效的方式重载,即可能从浏览器缓存中重新加载
      有参数(true)时:从服务器从新加载
      location.reload();  //可能从缓存中加载
      location.reload(true);  //从服务器重新加载
      注:位于reload()调用之后的代码可能会也可能不会执行,这要取决于系统资源和网络延迟等情况,
        因此reload()最好放在代码最好一行.
    --location.replace():用新的文档替换当前文档,也是加载新文档,replace()方法不会往历史记录中添加一个新的记录.
      当使用该方法时,新的URL将覆盖History对象中的当前记录,而上面介绍的方法都会生成一条新的历史记录
      如果想要禁止用户通过‘后退‘按钮返回到前一个页面(既不想添加一条历史记录),就可以使用replace()方法
        oBtn.onclick=function(){
          location.replace(‘http://localhost/learnjs/index.html‘);
        };

 

DOM,BOM