javascript中BOM部分基礎知識總結

1、什麼是BOM
     BOM(Browser Object Model)即瀏覽器對象模型。
     BOM提供了獨立於內容 而與瀏覽器窗口進行交互的對象;
     因爲BOM主要用於管理窗口與窗口之間的通信,所以其核心對象是window;
     BOM由一系列相關的對象構成,而且每一個對象都提供了不少方法與屬性;
     BOM缺少標準,JavaScript語法的標準化組織是ECMA,DOM的標準化組織是W3C,BOM最初是Netscape瀏覽器標準的一部分。
 
2、學習BOM學什麼
     咱們將學到與瀏覽器窗口交互的一些對象,例如能夠移動、調整瀏覽器大小的window對象,能夠用於導航的location對象與history對象,能夠獲取瀏覽器、操做系統與用戶屏幕信息的navigator與screen對象,可使用document做爲訪問HTML文檔的入口,管理框架的frames對象等。在這裏,只介紹一些window對象等的基礎知識,其中會有一些ECMAscript的知識還會說明。其餘對象Location、Screen、Navigator、History不一一詳細介紹了。。
 
BOM結構圖
 
3、window對象
     window對象是js中的頂級對象,全部定義在全局做用域中的變量、函數都會變成window對象的屬性和方法,在調用的時候能夠省略window。
          例:打開窗口 window.open(url,target,param);
               //  url 要打開的地址
     //target  新窗口的位置   _blank  _self  _parent(父框架)
     //param  新窗口的一些設置
     //返回值,新窗口的句柄
          關閉窗口:window.close();
 

4、BOM零碎知識(window對象)
1.定時器
      延遲執行     setTimeout( [string | function] code, interval);
                       clearTimeout([number] intervalId);
 1 <body>
 2 <input type="button" value="closeTimerId" id="btn">
 3 <script>
 4     var btn = document.getElementById("btn");
 5     var timerId = setTimeout(function () {
 6         alert("23333");
 7     }, 3000);
 8     btn.onclick = function () {     //在設置的時間以前(3s內)點擊能夠取消定時器
 9         clearTimeout(timerId);
10     }
11 </script>
12 </body>
    
      定時執行     var timerId = setInterval(code, interval);
                       clearInterval(timerId);     //清除定時器
 倒計時案例:
 1 <body>
 2 <input type="button" value="倒計時開始10" id="btn" disabled/>
 3 <script>
 4     var btn = document.getElementById("btn");
 5     var num = 10;
 6     var timerId = setInterval(function () {
 7         num--;
 8         btn.value = "到時器開始" + num;
 9         if (num == 0) {
10             clearInterval(timerId);
11             btn.disabled = false;
12             btn.value = "贊成,能夠點了";
13         }
14     },1000);
15 </script>    
16 </body>

 

2.offset系列方法
 
offsetWidth和offsetHeight
offsetHeight的構成
offsetHeight = height + padding + border
offsetWidth相同
 
offsetHeight和style.height的區別
1. demo.style.height只能獲取行內樣式,不然沒法獲取到
2. .style.height是字符串(有單位px), offsetHeight是數值(無單位)
3. .style.height能夠設置行內樣式,但offsetHeight是隻讀屬性,不可設置
因此:demo.style.height獲取 某元素的真實高度/寬度,用.style.height來設置高度/寬度
offsetLeft和offsetTop
offsetLeft的構成
1,到距離自身最近的(帶有定位的)父元素的 左側/頂部
2,若是全部父級元素都沒有定位,則以body爲準
3,offsetLeft是自身border左側到父級padding左側的距離
 
offsetLeft和style.left的區別
1,style.left只能獲取行內樣式
2,offsetLeft只讀,style.left可讀可寫
3,offsetLeft是數值,style.left是字符串而且有單位px
4,若是沒有定位,style.left獲取的數值多是無效的
5,最大的區別:offsetLeft以border左上角爲基準, style.left以margin左上角爲基準
offsetParent
構成
1. 返回該對象距離最近的帶有定位的父級元素
2. 若是當前元素的全部父級元素都沒有定位(position爲absolute或relative),那麼offsetParent爲body
3. offsetLeft獲取的就是相對於offsetParent的距離
 
與parentNode的區別
parentNode始終指向的是當前元素的最近的父元素,不管定位與否
 
offset示意圖
 
3.scroll系列方法
 
scrollHeight和scrollWidth 對象內部的實際內容的高度/寬度(不包括border)
scrollTop和scrollLeft 被捲去部分的頂部/左側 到 可視區域 頂部/左側 的距離
onscroll事件 滾動條滾動觸發的事件
頁面滾動座標 var scrollTop = window.pageYoffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
 
scroll示意圖
 
4.client系列
 
clientX和clientY     獲取鼠標在可視區域的位置     clientX = width + padding,clientY = height + padding
clientLeft     邊框的寬度,如有滾動條的話,包括滾動條
client示意圖
 
例: 得到頁面可視區域的大小
1 function client() {
2             return {
3                         clientWidth: window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth || 0;
4                         clientHeight: window.innerHeight || document.body.clientHeitght || document.documentElement.clientHeight || 0;
5             };
6 }
 
5.事件參數e
當事件發生的時候,系統會自動的給事件處理函數傳遞一個參數,會提供事件相關的一些數據,事件參數e瀏覽器的兼容性檢測: e = e || window.event
 
e.pageX和e.pageY
獲取鼠標在頁面中的位置(IE8中不支持pageX和pageY,支持window.event獲取參數事件) pageX = clientX + 頁面滾動出去的距離
 
6.得到計算後樣式的方法
 
w3c標準 window.get ComputedStyle(element, null)[屬性]
IE瀏覽器 element.currentStyle[屬性]
封裝瀏覽器兼容性函數
function getStyle(element, attr) {
        if(window.getComputedStyle) {
            return window.getComputedStyle(element, null)[attr];
        } else {
            return element.currentStyle[attr];
        }
    }
 
7.事件補充
  • 註冊事件
  • 註冊事件的性能問題
  • 移除事件
  • 事件冒泡
  • 事件捕獲  事件的三個階段
  • 事件對象的常見屬性
DOM筆記裏有提到註冊事件和移除事件,這裏着重講事件對象,事件對象的常見屬性
      7.1 target 和currentTarget
 
target 始終是點擊的元素(IE8及以前是srcElement)
currentTarget 執行事件處理函數的元素
this 始終和currentTarget同樣
 
      7.2 事件冒泡
用addEventListener註冊事件的時候,第三個參數是false,便是冒泡。
 
     冒泡的好處 - 事件委託
從一個例子中說明
 1 <body>
 2 <ul id="ul">
 3     <li>我是第1個li標籤</li>
 4     <li>我是第2個li標籤</li>
 5     <li>我是第3個li標籤</li>
 6     <li>我是第4個li標籤</li>
 7 </ul>
 8 <input type="button" value="insertLi" id="btn">
 9 <script>
10     var ul = document.getElementById("ul");
11     var btn = document.getElementById("btn");
12 //把原本應該給li註冊的事件,委託給ul,只須要給一個元素註冊事件
13 //動態建立的li,也會執行預期的效果
14     ul.addEventListener("click", test, false);     //註冊點擊事件
15     btn.onclick = function () {     //點擊一樣會有alert
16         var li = document.createElement("li");
17         li.innerHTML = "我是新插入的li標籤";
18         ul.appendChild(li);
19     };
20 //函數寫在註冊事件代碼以外,提升性能
21     function test(e) {
22         alert(e.target.innerText);
23     }
24 </script>
25 </body>

    

     當事件冒泡影響到了其餘功能的實現時,須要阻止冒泡     
 
e.stopPropagation( ) IE8及以前:   event.cancleBubble = true;
     
     阻止默認行爲的執行
 
e.preventDefault() IE8及以前:  event.returnValue = false;
看一下阻止跳轉到百度的例子:
 1 <body>
 2     <a href="http://www.baidu.com" id="link">百度</a>
 3 <script>
 4     var link = document.getElementById("link");
 5     link.addEventListener("click", fn, false);
 6     function fn(e) {
 7         e.preventDefault();
 8         //若用return false; 不起做用,若用link.onclick = function();return false能夠阻止
 9     }
10 </script>
11 </body>
 
 
      7.3 鼠標事件的參數
 
e.type 事件的類型,如click,mouseover
事件的3個階段 1 捕獲階段 2 目標階段 3 冒泡階段
e.eventPhase 事件階段
shiftKey/ctrlKey/altKey 按下鼠標同時按下組合鍵
button 獲取鼠標的按鍵
e.clientX和e.clientY 獲取鼠標在可視區域的位置
還有7.2中的取消事件冒泡和阻止默認行爲的執行
 
8.正則表達式
     定義:
     正則表達式是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。
 
     規則:
 
1 元字符
        .   匹配任何單個字符,除了換行
        d  數字   \D 非數字       [0-9]
        w  數字 字母 下劃線   \W 非     [0-9a-zA-Z_]
        \s  空白   \S 非空白
        \n  換行
        \t  製表符
2 範圍-- 匹配的是一個字符 [0-9]  [0123]  [a-z]  [A-Z]  匹配的是一個字符
3 | 或者 | 或者
4 量詞  -只修飾一個字符
        a+  1個或多個a
        a?   1個或0個a
        a*   0個或多個a
   a{x}  x個n
   a{x,} 至少x個a
   a{x,y}  x-y個a
5 開始結束
          ^a  以a開始
          a$  以a結束
6 ( ) 當作是一個總體,即分組  
7 匹配漢字 [\u4e00-\u9fa5]
8 參數
i  忽略大小寫
g 全局匹配
9 ^在[ ]中的做用——取反  
10 貪婪模式和非貪婪模式
默認狀況  貪婪模式  <.+>
               非貪婪模式  <.+?>
   
 
      8.1 正則表達式對象RegExp
 
1 <body>
2     <a href="http://www.baidu.com" id="link">百度</a>
3 <script>
4 //    var regularExpression =  new RegExp("\\d");     //第一種寫法
5     var regularExpression = /\d/;     //第二種寫法
6     var str = "adfj23dald";
7     console.log(regularExpression.test(str));     //test就是匹配方法,結果是true
8 </script>
9 </body>
 
      8.2 正則之匹配
例:驗證電子郵箱
//驗證電子郵箱
    // abc@sohu.com
    // 11111@qq.com
    // aaaaa@163.com
    // abc@sina.com.cn 
     var reg = /^\w+@\w+\.\w+(\.\w+)?$/;
     var str = "abc@sina.com.cn";
     console.log(reg.test(str));
 
      8.3 正則之提取
例:找數字
1 var str = "張三: 1000,李四:5000,王五:8000。";
2 var reg = /\d+/g;
3 //默認狀況下,找到第一個匹配的結果就返回,後面加個g,就是全局找
4  var arr = str.match(reg);
5 console.log(arr);

 

 
 
      8.4 正則之替換
例:全部的逗號替換成句號
1 var str = "abc,efg,123,abc,123,a";
2 str = str.replace(/,/g,".");
3 console.log(str);
 
      8.5 正則的分組( )
     在正則表達式中用( )把要分到一組的內容括起來, 組分別是RegExp.$1    RegExp.$2等等
例:交換位置  源字符串"5=a, 6=b, 7=c"  要的結果"a=5, b=6, c=7"
    
1 var str = "5=a, 6=b, 7=c";
2 str = str.replace(/(\d+)=(\w+)/g, "$2=$1");
3console.log(str);

 

 
9.鍵盤事件對象
 
方法
keydown  按下時
keypress  按下
keyup  擡起時
屬性
 
keyCode  鍵盤碼,只有數字和字母對應ASCII碼
charCode  對應ASCII碼,只有在keypress中才生效(IE9+)
例:在切換鼠標焦點時,用enter鍵代替tab鍵
 
 1 <body>
 2 <input type="text"><input type="text"><input id="t1" type="text"><input type="text"><input type="text"><input type="text"><inputtype="text"><input type="text"><input type="text"><input type="text">
 3 <script>
 4     var inputs = document.body.getElementsByTagName("input");
 5     for(var i = 0, length = inputs.length; i < length ; i++) {
 6         var input = inputs[i];
 7         //回車鍵的keyCode是13
 8         if(input.type === "text") {
 9             //按下回車,讓下一個文本框得到焦點
10             input.onkeydown = function (e) {
11                 if(e.keyCode === 13) {
12                     this.nextElementSibling.focus();//focus() 他觸發了onfocus事件
13                 }
14             }
15         }
16     }
17 </script>
18 </body>

 

 
補充:js中的instanceof運算符介紹
判斷某個變量是否是某種類型的對象
1 var num = 5;
2 var arr = [];
3 console.log(num instanceof Array);          //false
4 console.log(arr instanceof Array);            //true
相關文章
相關標籤/搜索