1. 程式人生 > >javaScript中的物件、BOM、DOM知識點總結

javaScript中的物件、BOM、DOM知識點總結

一、  什麼是javaScript物件?

        物件是javaScript中最重要的API。

        javaScript包含多種物件有:內建物件、外部物件(window物件、dom物件)、自定義物件。

二、  如何使用物件?

        物件包含屬性和方法。

        訪問物件屬性:物件.屬性

        訪問物件方法:物件.方法()

三、  常用內建物件

        JS中常用內建物件有:String物件、Number物件、Boolean物件、Array物件、Math物件、Date物件、RegExp物件、Function物件。

1.   String物件

(1)建立String物件有兩種方式:

var str1=”hello word”;

var str2=new String(“hello word”);

(2)String物件的屬性:

str.length;

(3)String物件的常用方法

##大小寫轉換方法

str1.toLowerCase()、str1.toUpperCase()

##獲取指定字元

srt1.charAt(index):返回指定位置的字元

str1.charCodeAt(index):返回指定位置字元的Unicode編碼。(index表示字元位置)

##查詢指定字串

str1.indexOf(findstr,[index])、str1.lastIndexOf(findstr,[index])

PS:findstr表示要查詢的字串,lastIndexOf表示從最後開始找起,如果沒有找到則返回-1.

##獲取子字串(含頭不含尾,下標均是從0開始)

str1.substring(start,[end])

##替換子字串

str1.replace(findstr,tostr)

PS:findstr為要找的子字元換,tostr替換為的字串,返回替換後的字串。

##拆分子字串

Str1.split(bystr,[howmany])

PS:bystr分割用的字串,howmany指定返回的陣列的最大長度,可以省略,返回分割後的字串。

注意:字串是不可變的,一些可以修改的字串的API,實際上是返回一個新的字串,並不改變原始字串.

2.Number物件

(1)Number是數值物件,建立Number物件如下:var a=1.1;

(2)Number物件的常用方法

##toFixed(num):轉換為字串,並保留小數點後一定位數。如果必要該數字可以被捨棄,也可以用0補足。

3.Array物件

##JS中的陣列均是Object,如var a1=[1,25,"男朋友",true];

陣列的長度是可變的。

##JS中的陣列可以像集合一樣操作

var a2=new Array();

   a2.push(8);

   a2.push(false);

   console.log(a2[2]);

##訪問陣列元素console.log(a1[0])

##陣列中元素倒轉:a1.reverse();

##陣列排序*重點*:a1.sort();預設按照字串的Unicode編碼排序,可以通過替換比較方法影響排序結果。(一般比較方法無需複用,採用匿名方法)


舉例如下:

a1.sort(Function(a,b){

return a-b;

});

Console.log(a1);

4.Math物件

Math物件用於執行數學任務,無需建立,直接使用即可。如下所示:

console.log(Math.PI);console.log(Math.E);

console.log(Math.round(Math.PI));

PS:Math.round()表示為取整。

5.Date物件

Date物件用於處理日期和時間,封裝了系統時間毫秒數。

##建立Date物件(Date物件會自動把當前的日期和時間儲存為初始值)

Datedate1=new Date();

Datedate2=new Date(“2015/1/1 1:12:11”);

##Date物件常用方法

讀寫時間毫秒數:date1.getTime()、date1.setTime(毫秒)

讀寫時間分量:

date1.getDate()、date1.getDay()、date1.getFullYear()等。

date1.setDate()、date1.setDay()、date1.setFullYear()等。

轉化為字串:

toString()、toLocaleTimeString()、toLocaleDateString()

6.RegExp物件

RegExp物件表示正則表示式,作用也就是用來檢查字串。

##建立RegExp物件

VarrgExp=new RegExp(“pattern”,[“flags”]);

VarrgExp=/pattern/flags;

PS:flags的標識有兩種

(1)   g:設定當前匹配為全域性模式。

(2)   i:忽略匹配中的大小寫檢測。

注意:全域性模式(第N次呼叫則找出第N個匹配的部分),非全域性模式(找出首次匹配的部分)。

##RegExp物件的常用方法

RegExpObject.test(string)*重點*

如果字串string中含有與RegExpObject匹配的文字,則返回true,否則返回false.

reg.exec(str):檢測字串中指定的值,返回指定的值。

reg.test(str):檢測字串中指定的值,返回false或true.

##String物件與正則表示式(regexp代表正則表示式或字串)

--x.replace(regexp,tostr),返回替換後的結果。

--x.match(regexp),返回匹配字串的陣列。

--x.search(regexp),返回匹配字串的首字元位置索引。

7.Function物件

JS中的函式就是Function物件。

函式名就是指向Function物件的引用,使用函式名可以訪問函式物件,函式名()是呼叫函式。

##定義函式物件

函式的返回值預設為undefined,也可以使用return返回具體的值。

##函式的引數

JS的函式沒有過載。

呼叫時只要函式名一樣,無論傳入多少個引數,呼叫的都是同一個函式。

沒有接收到實參的引數值是undefined.

所有的引數傳遞給arguments陣列物件。

##arguments物件*重點*..

Arguments是一種特殊的物件,在函式程式碼中,表示函式的引數陣列。

在函式程式碼中,可以使用arguments訪問所有引數。

arguments.length:函式的引數個數

arguments[i]:第i個引數

可以利用arguments實現可變引數的函式。


##eval函式*重點*

eval函式用於計算表示式字串,或者用於執行字串中的javascript程式碼。

只接受原始字串作為引數。

如果函式中沒有合法的表示式或語句,則丟擲異常。


小案例

1.登入頁面的程式碼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登入頁面</title>
<style>
    .ok {
       color:green;
       border:1px solid green;
    }
    .error {
       color:red;
       border:1px solid red;
    }
    
</style>
<script>
//校驗賬號的格式
   function check_code() {
console.log(1);
//獲取賬號
var code=document.getElementById("code").value;
//校驗其格式(\w 字母或數字或下劃線)
var span=document.getElementById("code_msg");
var reg=/^\w{6,10}$/;
if(reg.test(code)){
//通過,增加OK樣式
span.className="ok";
return true;
}else{
//不通過,增加error樣式
span.className="error";
return false;
}
}
</script>
<script>
//校驗密碼
  function check_pass() {
//獲取密碼
var pass=document.getElementById("pass").value;
//校驗
var span=document.getElementById("pass_msg");
var reg=/^\w{8,20}$/;
if(reg.test(pass)){
//通過,增加OK樣式
span.className="ok";
return true;
}else{
//沒通過,增加error樣式
span.className="error";
return false;
}
}
</script>
</head>
<body>
   <!--check_code() && check_pass(),中的與&&會發生短路,為防止短路,可以利用一個boolean值中的true值為1,false值為0進行改進-->
   <form action="http://www.tmooc.cn" onsubmit="return check_code()+check_pass()==2;">
       <p>
                                 賬號:
            <input type="text" id="code" 
             onblur="check_code();"/>
            <span id="code_msg">6-10位字母、數字、下劃線</span>
       </p>
       <p>
                                 密碼:
           <input type="password" id="pass"
           onblur="check_pass();"/>
           <span id="pass_msg">8-20位字母、數字、下劃線</span>
       </p>
       <p><input type="submit" value="登入"/></p>   
   </form>
</body>
</html>

補充:onsubmit,表單提交事件,是form的事件,當點選表單內的submit按鈕時觸發,在該事件內返回true,則提交成功,預設就是返回true,若返回false,則不提交。

網頁效果顯示:


2.計算器程式碼:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>計算器</title>
<script>
   function cal() {
 //獲取文字框
 var input=document.getElementById("num");
 //獲取span
 var span=document.getElementById("jg");
 //獲取框內的算式
 var ss=input.value;
 try {
 var result=eval(ss);
//計算成功,將結果寫入文字框input
span.innerHTML=result;
 }catch(e) {
 //出錯時給予提示
span.innerHTML="Error";
 }
   }
</script>
</head>
<body>
    <input type="text" id="num"/>
    <input type="button" value="=" onclick="cal();"/>
    <span id="jg"></span>
</body>
</html>

網頁效果顯示:


四、  外部物件

     瀏覽器提供的物件,瀏覽器的API,用來操作瀏覽器。

1.BOM(Browser Object Model):

     #瀏覽器物件模型,用來訪問和操縱瀏覽器視窗,使JAVAScript有能力與瀏覽器“對話”。(瀏覽器與JS是兩個不相關的內容,JS依附於瀏覽器上)

#通過使用BOM,可移動視窗、更改狀態列文字,執行其他不與頁面內容發生直接聯絡的操作。

2.DOM(Document Object Model):

     #文件物件模型,用來操作文件。定義了訪問和操作HTML文件的標準方法。

     #應用程式通過對DOM樹的操作,來實現對HTML文件資料的操作。

BOM與DOM關係如下圖示:


      PS:window代表瀏覽器,它的子物件(屬性)代表瀏覽器的不同部位。

外部物件分為兩個部分BOM與DOM,其中BOM包含DOM.

3.window物件(BOM)

      window表示瀏覽器視窗,所有JAVAScript全域性物件、函式以及變數均自動成為window物件的成員。

##常用屬性:

#history:瀏覽過視窗的歷史記錄物件

       history物件包含使用者(在瀏覽器視窗中)訪問過的URL,常用方法:

--back()

--forward()

--go(num):num可以取正數或者負數,正數表示前進,負數表示後退。

#location:視窗檔案地址物件。

location物件常用於獲取和改變當前瀏覽器的網址。

href:當前視窗正在瀏覽器的網頁地址,也可以用於修改網址。

--reload():重新載入當前網址,就像按下重新整理按鈕。

PS:location與超連結都可以改變當前視窗,兩者的區別是---location改變當前視窗時可以新增條件,比如可以在頁面上顯示“您確定要離開此頁面嗎?”,而超連結不能新增條件,不靈活,一般建議採用location。

顯示小程式碼:

functiontarena() {

   var b=confirm("您確定要離開此頁面嗎?");

   if(b){

        //確認為true時,跳轉。

        //location=位址列

        //修改href就是修改網址。

        location.href="http://www.tmooc.cn";

    }

     }

 #screen:當前螢幕物件。

        screen物件包含有關客戶端顯示螢幕(比如說ipad、膝上型電腦、手機)的資訊,常用於獲取螢幕的解析度和色彩,常用屬性:

--width/height

--availWidth/availHeight

#navigator:瀏覽器相關資訊。

常用於獲取客戶端瀏覽器和作業系統資訊。

Navigator.userAgent;

##常用方法:

(1)alter(str),提示對話方塊,顯示str字串的內容。

(2)confirm(),確認對話方塊,顯示str字串的內容,按確定按鈕返回true,其他操作返回false.

(3)定時器*重點*

多用於網頁動態時鐘、製作倒計時、跑馬燈效果等。分為兩種:

#週期性定時器:以一定的間隔執行程式碼,迴圈往復。

setInterval(exp,time):週期性觸發程式碼exp.返回已經啟動的定時器物件。

exp為執行語句,time為時間週期,單位為毫秒。

clearInterval(tID):停止啟動的定時器。

tID:啟動的定時器物件。

小案例:動態時鐘程式碼如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>動態時鐘</title>
<style>
    #clock {
        width:150px;
        border:1px solid red;
        line-height:30px;
        height:30px;
        font-size:20px;
        text-align:center;
    }
</style>
<script>
     //id為空時表示未啟動。
     var id=null;
     function ks(){
    //若id非空,表示已啟動,不要再次啟動了
    if(id){
    return;
    }
    id=setInterval(function(){
    var date=new Date();
    var now=date.toLocaleTimeString();
    var p=document.getElementById("clock");
    p.innerHTML=now;
    },1000);
     }
     function zt(){
    clearInterval(id);
    //將id重置為null,便於下次啟動時做判斷
    id=null;
     }


</script>
</head>
<body>
   <p>
       <input type="button" value="開始" onclick="ks();">
       <input type="button" value="暫停" onclick="zt();">
   </p>
   <p id="clock"></p>
</body>
</html>

網頁顯示如下圖:


#一次性定時器:在一個設定的時間間隔之後來執行程式碼,而不是在函式被呼叫後立即執行。

setTimeout(exp,time):一次性觸發程式碼exp.返回已經啟動的定時器。

exp為執行語句,time為時間間隔,單位為毫秒。

clearTimeout(tID):停止啟動的定時器。

小案例:傳送訊息程式碼如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>傳送訊息</title>
<style>
     #msg {
        width:150px;
        height:30px;
        line-height:30px;
        border:1px solid red;
        font-size:20px;
        text-align:center;
     }
</style>
<script>
    //預設id為null
    var id=null;
    function fs() {
    var p=document.getElementById("msg");
    p.innerHTML="正在傳送...";
    //啟動定時器後id非空
    id=setTimeout(function(){
    p.innerHTML="傳送成功";
    //傳送成功是id為null
           id=null;
    },3000);
    }
    function cx(){
    //id非空時表示已啟動定時器但未完成,只有此時才能停止定時器。
    if(id){
    var p=document.getElementById("msg");
    p.innerHTML="已撤銷";
    clearTimeout(id);
    }
    }
</script>
</head>
<body>
   <p>
      <input type="button" value="傳送" onclick="fs();"/>
      <input type="button" value="撤銷" onclick="cx();"/>
   </p>
   <p id="msg"></p>


</body>
</html>

網頁顯示如下圖:


4.document物件

4.1  DOM(文件物件模型)

當網頁被載入時,瀏覽器會建立頁面的文件物件模型。

DOM節點樹(DOM模型被構造為物件的樹,這棵樹的根就是document物件)

 

#DOM操作:查詢節點、讀取節點資訊、修改節點資訊、建立新節點、刪除節點。

4.2          讀取、修改

##讀取節點的名稱和型別

#nodeName:節點名稱

--元素節點和屬性節點:標籤或屬性名稱。

--文字節點:永遠是#text.

--文件節點:永遠是#document

#nodeType:節點型別(返回數值)

元素節點返回1,屬性節點返回2,文字節點返回3,註釋節點返回8,文件節點返回9.

##讀寫節點的內容(<x>這就是內容</x>),雙標籤中間的文字。

#innerHTML:設定或獲取位於物件起始和結束標籤內的HTML(帶標籤)。

#innerText:設定或獲取位於物件起始和結束標籤內的文字(不帶標籤)。

##讀寫節點的屬性

#通用API,任何版本瀏覽器都支援

getAttribute()方法:根據屬性名稱獲取屬性的值。

setAttribute(),removeAttribute().

#新的API,低版本的瀏覽器不支援(只要增和改)

節點.屬性名(class例外,需要寫className)

小案例:圖片輪播程式碼演示如下

PS:凡是在funciton外的方法,讀取時均是按照順序讀取。

4.3查詢

##通過id查詢(標準)

document.getElementById(),通過制定的ID來返回元素節點,忽略文件的結構,如果ID錯誤,則返回null。

##根據標籤名查詢(標準)

#在整個頁面上根據標籤名查詢節點。

document.getElementsByTagName(“li”),

#在某節點下根據標籤名查詢其子節點。

ul. getElementsByTagName(“li”),

PS:”li”為要查詢的子節點。

##根據name查詢(標準)

document.getElementsByName().

##根據class查詢某節點(非標準)

getElementsByClassName(),

##根據層次(關係)查詢

#查詢父親(標準)

parentNode

#查詢孩子(標準)

childNodes.

getElementsByTagName(“li”),建議使用此根據標籤名查詢孩子的方法。

#查詢孩子(非標準)

children.

#查詢兄弟(標準)

//某節點.父親.孩子[n]

jd.parentNode. getElementsByTagName(“li”)[1];

#查詢兄弟(非標準)

jd.previousElementSibling;

jd.nextElementSibling;

4.4增刪節點

##建立節點

document.createElement(“li”);

li為要建立的元素標籤名稱,返回新建立的節點。

##增加節點

#追加到所有子節點之後

parentNode.appendChild(newNode);新節點作為父節點的最後一個子節點新增。

 #插入到某子節點之前

parentNode.insertBefore(newNode,refNode);refNode為參考節點,新節點位於此節點之前新增。

##刪除節點

#父親刪孩子

node.removeChild(childNode);node為childNode的父節點。

#自己刪自己(非標準)

1sz.parentNode.removeChild("sz");

2var tj=document.getElementById("tj");

      tj.remove();

小案例:聯動選單程式碼:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>聯動選單</title>
</head>
<body>
       省:
   <select id="province" onchange="chg();">
        <option value="-1">請選擇</option>
        <option value="0">河北省</option>
        <option value="1">山東省</option>
        <option value="2">山西省</option>
   </select>
   市:
   <select id="city">
        <option>請選擇</option>
   </select>
   
   <script>
      //模擬載入城市
      function loadCities() {
     return [
         ["石家莊","廊坊","保定"],
         ["濟南","青島","德州"],
         ["太原","大同","陽泉"]
             ];
      }
     var cities=loadCities();
     
     function chg() {
    //獲取省份的下拉選
    var sel1=document.getElementById("province");
    //獲取省份的序號
    var pindex=sel1.value;
    //獲取該省份對應的城市
    var pcities=cities[pindex];
    //先刪除城市下拉選內所有的城市
    var sel2=document.getElementById("city");
    //
    //sel2.innerHTML="<option>請選擇</option>";
    var options=sel2.getElementsByTagName("option");
    for(var i=options.length-1;i;i--){
    sel2.removeChild(options[i]);
    }
    //再增加該省份的城市。
    if(pcities){
    for(var i=0;i<pcities.length;i++){
    var opn=document.createElement("option");
    opn.innerHTML=pcities[i];
    sel2.appendChild(opn);
    }
    }
     }
   </script>
</body>
</html>

 網頁顯示效果如下:


五、自定義物件

自定義物件是一種特殊的資料型別,由屬性和方法封裝而成。

---屬性指與物件有關的值:物件名.屬性名。

---方法指物件可以執行的行為或者可以完成的功能:物件名.方法名()

1.建立自定義物件

(1)採用直接量(JSON"JavaScript Object Notation"是一種輕量級的資料交換格式)的方式建立自定義物件

名稱需要使用“”引起來,多對定義之間使用,隔開,名稱可以是屬性。

function f1() {
  var stu= {"name":"zs","age":25,"work":function(){alert("我學Java")}};
  alert(stu.name);
  alert(stu.age);
  //work的function方法無返回值,則不需要加alert。
  stu.work();
   }

(2)採用構造器建立物件

##採用自定義構造器建立物件(自定義了一個構造器Coder,然後每次寫時都可以呼叫Coder構造器)

function f3() {
  var c=new Coder("lisi",26,function(){alert("我寫Java")});
  alert(c.name);
  alert(c.age);
  c.work();
   }
   function Coder(name,age,work) {
  //this=創建出來的物件
  //this.name給該物件宣告一個屬性
  this.name=name;
  this.age=age;
  this.work=work;
   }

 六、事件

 1.事件概述

       事件:指頁面元素狀態改變,使用者在操作滑鼠或者鍵盤時觸發的動作。分為滑鼠事件、鍵盤事件、狀態改變事件。

       event物件:事件觸發後將會產生一個event物件。

       事件屬性:通過一個事件屬性,可以在某個事件發生時對某個元素進行某種操作。


2.事件定義

    (1)直接定義事件:在html屬性定義中直接處理事件。

    <input type="button" value="小蘋果" onclick="alert('小蘋果 ');"/>

   (2)後繫結事件//:在頁面載入後執行,寫在<body>的整個頁面後。(過度的,僅需要了解)

   (3)後繫結事件(onload):onload是網頁載入事件,在網頁載入後自動觸發。

    為了便於格式的完美性,該段程式碼,放在<head>中的<script>標籤中。

window.onload=function() {
  //在這裡寫的程式碼相當於在body後一樣
  var c=document.getElementById("c");
  c.onclick=function() {
  alert("小姑娘");
  }
   
   }

(4)取消事件

e.stopPropagation()
e.cancelBubbule=true;
e={"stopPropagation":function(){}}
e.stopPropagation()/e.stopPropagation
物件的方法可以看做方法的屬性
    if(e.stopPropagation){
    //如果寫成e.stopPropagation(),則沒有的話會報錯,不帶括號的屬性沒有的話不會報錯。
    e.stopPropagation();
    }else{
    e.cancelBubble=true;
    }
    }
3.event物件

     ##任何事件出發後都將產生一個event物件,event物件記錄事件發生時的滑鼠位置、鍵盤按鍵狀態、觸發物件等資訊。

    ##獲得event物件,使用event物件獲得相關資訊,如單擊位置、觸發物件等。

   ##常用屬性:clientX,clientY,cancleBubble

    ##獲取event物件,

    在事件定義時,使用event關鍵字將事件物件作為引數傳入方法。

<input type="button" value="DDD" onclick="d(event);"/>

<input type="button" value="EEE" id="e"/>

window.onload=function() {
  var ee=document.getElementById("e");
  ee.onclick=function(e) {
  //後繫結事件時,瀏覽器會自動傳入event,
  //且該物件存在arguments第0個位置。
 console.log(arguments[0]);
  console.log(e);
  }
   }
   
   function d(e) {
  console.log(e);
  alert(e.clientX+","+e.clientY);
   }

4.事件處理機制

(1)JS事件處理機制是:冒泡機制(JS的事件是由內向外觸發的,觸發到最外層為止)

(2)作用:不需要再子元素上定義N次事件,只需要在父元素上定義一次事件。

 PS:在採用冒泡機制簡化事件時,必須知道事件源(事件發生的源頭“具體位置”),事件源可以通過事件物件獲取。

案例:計算器程式碼如下

<!DOCTYPE html>
<html>
  <head>
    <title>計算器</title>
    <meta charset="utf-8" />
    <style type="text/css">
      .panel {
        border: 4px solid #ddd;
        width: 192px;
        margin: 100px auto;
        /*border-radius: 6px;*/
      }
      .panel p, .panel input {
        font-family: "微軟雅黑";
        font-size: 20px;
        margin: 4px;
        float: left;
        /*border-radius: 4px;*/
      }
      .panel p {
        width: 122px;
        height: 26px;
        border: 1px solid #ddd;
        padding: 6px;
        overflow: hidden;
      }
      .panel input {
        width: 40px;
        height: 40px;
        border:1px solid #ddd;
      }
    </style>
    <script>
       window.onload=function() {
      var div=document.getElementById("panel");
      div.onclick=function(e) {
      //console.log(e.srcElement||e.target);
      cal(e);
      }
       }
       
       function cal(e) {
      //獲取事件源
      var obj=e.srcElement||e.target;
      //只處理按鈕(INPUT)
      if(obj.nodeName!="INPUT"){
      return;
      }
      //判斷按鈕型別
      var p=document.getElementById("screen");
      if(obj.value=="C") {
      //清空
      p.innerHTML="";
      }else if(obj.value=="="){
      //計算
      try {
      var result=eval(p.innerHTML);
      p.innerHTML=result;
      }catch(ex){
      p.innerHTML="Error";
      }
      }else {
      //累加                      舊的值                           新的值
      p.innerHTML=p.innerHTML+obj.value;
      }
       }
    </script>
  </head>
  <body>
    <div class="panel" id="panel">
      <div>
        <p id="screen"></p>
        <input type="button" value="C">
        <div style="clear:both"></div>
      </div>
      <div >
        <input type="button" value="7">
        <input type="button" value="8">
        <input type="button" value="9">
        <input type="button" value="/">
        
        <input type="button" value="4">
        <input type="button" value="5">
        <input type="button" value="6">
        <input type="button" value="*">
        
        <input type="button" value="1">
        <input type="button" value="2">
        <input type="button" value="3">
        <input type="button" value="-">
        
        <input type="button" value="0">
        <input type="button" value=".">
        <input type="button" value="=">
        <input type="button" value="+">
        
        <div style="clear:both"></div>
      </div>
    </div>    
  </body>
</html>

頁面顯示效果: