首页 > 代码库 > BOM常用对象

BOM常用对象

 1.BOM的常用对象: window  navigator history location dicument screen event

        navigator:保存浏览器配置信息的对象

               cookicEnablcd:判断是否启用cookic

               userAgent:判断浏览器的名称和版本号

               plugins:保存浏览器中所有插件信息的集合

        screen:保存显示屏幕的对象信息

        history:保存当前的历史记录栈

             history.go(-1):后退

             history.go(1):前进一次

             history.go(0):刷新

             <a href="javascript:history.go(1);">前进一次</a>

         location:指代当前窗口正在访问额url地址对象

         location.href:保存了当前窗口正在访问的url地址

                  设置href属性为新url,会在当前窗口打开新的url
                   location.href="http://www.baidu.com"

         location.assign(url):在当前窗口打开新的url
                   location.assign("http://www.baidu.com");         

         location.reload(true/false);true:无论是否更改,都获得最新的

                           false:被更新的页面,会从新获取

                               未被修改的页面在缓存中取

 2.事件:浏览器自动触发的或用户手动触发的对象状态的改变

   DOM Level2 Evenl标准:

   IE8:自成体系!

   事件处理函数:当事件发生时,自动执行的函数对象

     其实就是:on事件名

   如何绑定事件处理函数:3种:

   1.在html元素的开始标签中设置事件处理函数属性:

    比如:<button onclick="fun()"></button>

   2.在js中动态绑定事件处理函数:elem.on事件名=函数对象

    比如btn.onclick=function(){在这里this==>btn}

    执行:btn.onclick=fun;

    问题:同一元素的同一事件处理函数,只能绑定一个函数对象

  3.在js中动态绑定事件处理函数,可同时绑定多个,可修改事件触发顺序

     DOM标准:elem.addEventListener("事件名",函数对象,是否在捕获阶段触发)

     IE8:elem.attachEven("on事件名",函数对象);

     比如:btn.addEventListener("click",fun,false/true);

             btn.attachEvent("onclick",fun);

 

      事件周期:
        DOM: 3个阶段:
           1. 捕获: 从最外层元素,向内层元素,逐个记录绑定的事件处理函数。默认,暂不触发任何事件。
           2. 目标触发: 优先触发目标元素上绑定的事件处理函数目标元素: 实际点击的元素
           3. 冒泡: 按照捕获的顺序,由内层,向外层逐层触发捕获的事件处理函数

        IE8:2各阶段:

           1. 目标触发: 优先触发目标元素上绑定的事件处理函数目标元素: 实际点击的元素
           2. 冒泡: 按照捕获的顺序,由内层,向外层逐层触发捕获的事件处理函数

 

 技术分享

      是否可修改事件执行顺序:可以,修改addEventlistener的第三个参数为true,可以在捕获阶段触发,同一事件不可以触发两次。

 技术分享

        如果点在外层元素上,捕获只到目标元素结束

        2.在js中动态绑定事件处理函数:

            DOM标准:事件对象作为事件处理函数第一个参数,出入函数中arguments[0]==>事件对象

            IE8:事件对象是window下的一个全局属性:window.event

            兼容:var e = window.event||arguments[0];

                                       IE8                DOM

固定套路:  

   1.取消冒泡:在当前事件处理函数执行结尾,阻止继续冒泡

        DOM:e.stopPropagation();

        IE8:e.cancelBubble=true;

        兼容代码:if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}

   2.利用冒泡:

      优化:多个子元素,定义了相同的事件处理函数,其实只需要将事件处理函数在父元素上定义一次即可。

              Why:每个处理函数的绑定都是一个对象,处理函数绑定的越多,网页执行效率越低。

                       减少处理函数的绑定次数,可以提高执行效率。

             获得目标元素:var target = e.srcElement||e.target;

                                                         IE                DOM

             目标元素 vs this 

              this:会随事件冒泡而改变

              目标元素:不受冒泡影响,始终保存最初的目标元素对象

 

<html>
  <head>
    <title>取消与利用冒泡</title>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="http://www.mamicode.com/css/3.css"/>
  </head>
  <body>
    <div id="keys">
      <button>1</button>
      <button>2</button>
      <button>3</button>
      <button>4</button><br>
      <button>C</button>
      <button>+</button>
      <button>-</button>
      <button>=</button>
    </div>
  <textarea id="sc" style="resize:none;width:200px; height:50px;" readonly></textarea>
  <script>
    //定义函数calc,获得事件对象e
    function calc(e){
    //获得目标元素target
    var target=e.srcElement||e.target;
    //如果target是button
    if(target.nodeName=="BUTTON"){
             //判断target的内容
      switch(target.innerHTML){
        case "C"://是C
          //清除id为sc的元素的内容
          sc.value=""; break;
        case "="://是=
          try{//尝试:
          //将sc的内容传入eval中,将结果保存回sc的内容中
          sc.value=http://www.mamicode.com/eval(sc.value);
          }catch(err){//如果出错
          //将错误对象转为字符串,赋值给sc的内容
          sc.value=http://www.mamicode.com/String(err);
          }
          break;
       default: //否则
      //将target的内容拼接到sc的内容上
      sc.value+=target.innerHTML
    }
  }
}
//为id为keys的div添加单击事件监听,函数为calc
keys.addEventListener("click",calc);
    </script>
  </body>
</html>

3.取消事件:事件执行过程中,发生异常状况,可阻止事件触发

      比如:onsubmit:自动提交触发

                  如果验证未通过,可取消继续提交

      何时使用:取消元素默认的事件行为。 

       1.在html中绑定事件处理函数:2个return

       如果<form onsubmit="return valiAll()">
                  caliAll(){..... return true/false}

                          如果返回true,继续执行

                          如果返回false,取消执行

<html>
<head>
<meta charset="UTF-8">
<title>阻止自动表单提交</title>
<link rel="Stylesheet" href="http://www.mamicode.com/css/5.css" />

</head>
<body>
<!--1. 使用HTML绑定事件处理函数时-->
<form>
<h2>增加管理员</h2>
<table>
<tr>
<td>姓名:</td><td>
<input name="username" onfocus="getFocus(this)"
onblur="valiName(this)"/>
<span>*</span>
</td>
<td>
<div class="vali_Info">
10个字符以内的字母、数字和下划线的组合
</div>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input type="password" name="pwd" onfocus="getFocus(this)" onblur="valiPwd(this)"/>
<span>*</span>
</td>
<td>
<div class="vali_Info">6位数字</div>
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
<!--取消事件,2个return-->
<input type="submit" value="http://www.mamicode.com/保存"/>
<input type="reset" value="http://www.mamicode.com/重填"/>
</td>
</tr>
</table>
</form>
<script src="http://www.mamicode.com/js/5.js"></script>
</body>
</html>

 

function getFocus(txt){
txt.className="txt_focus";
txt.parentNode //td
.parentNode //tr
.querySelector("div")
.className="";
}
function valiName(txt){
txt.className="";
var div=txt.parentNode //td
.parentNode //tr
.querySelector("div");
if(/^\w{1,10}$/.test(txt.value)){
div.className="vali_success";
return true;
}else{//否则
div.className="vali_fail";
return false;
}
}
function valiPwd(txt){
txt.className="";
var div=txt.parentNode //td
.parentNode //tr
.querySelector("div");
if(/^\d{6}$/.test(txt.value)){
div.className="vali_success";
return true;
}else{//否则
div.className="vali_fail";
return false;
}
}
//为页面中第一个form绑定提交事件监听,函数为valiAll
document.forms[0].addEventListener(
"submit",valiAll);
function valiAll(e){
//获得页面中第一个form对象保存在form中
var form=document.forms[0];
//获得form中name为username的文本框,保存在txtName中
var txtName=form.username;
//调用valiName,传入txtName作为参数,将验证结果保存在rName中
var rName=valiName(txtName);
//获得form中的name为pwd的文本框,保存在txtPwd中
var txtPwd=form.pwd;
//调用valiPwd,传入txtPwd作为参数,将验证结果保存在rPwd中
var rPwd=valiPwd(txtPwd);
//如果rName和rPwd不都为true,就取消事件
!(rName&&rPwd)&&(e.preventDefault());
}

 

      如何取消:if(e.preventDefault){e.preventDefault();//DOM}else{e.returnValue=http://www.mamicode.com/flase;//IE}

 

BOM常用对象