JS中的事件&對象


一、JS中的事件


(一)JS中的事件分類


1、鼠標事件

  click/dblclick/onmouseover/onmouseout

2、HTML事件

  onload/onscroll/onsubmit/onchange/onfocus

3、鍵盤事件

  keydown:   鍵盤按下時觸發
  keypress:鍵盤按下並松開的瞬間觸發
  keyup:    鍵盤抬起時觸發
 
[注意事項]
  ① 執行順序:keydown->keypress->keyup
  ② 當長按時,會循環執行keydown->keypress
  ③ 有keydown並不一定有keyup,當事件觸發過程中,鼠標將光標移走,  將導致沒有keyup
  ④ keypress只能捕獲鍵盤上的數字、字母、符號鍵,不能捕獲各種符號鍵, 而keydown和keyup可以。
  ⑤ keypress支持區分大小寫,keydown和keyup並不支持。
[確定觸發的按鍵]
  ① 在觸發的函數中,傳入一個參數e,表示鍵盤事件;
  ② 使用e.keyCode,取到按鍵的Ascll碼值,進而確定觸發按鍵;
  ③ 所有瀏覽器的兼容寫法(一般並不需要):
      var evn = e || event;
      var code = evn.keyCode || evn.which || evn.charCode;

(二)JS中的DOM0事件模型


1、內聯模型(行內綁定):

  直接將函數名作為HTML標簽的某個事件屬性的屬性值;
eg:<button onclick="func()">DOM0內聯模型</button>
  優點:使用方便。
  缺點:違反了w3c關於HTML與JavaScript分離的基本原則;

2、腳本模型(動態綁定):

  在JS腳本中,取到某個節點,並添加事件屬性;
  優點:實現了HTML與JavaScript的分離;
  缺點:同一個節點只能綁定一個同類型事件。如果綁定多個,最后一個生效。

(三)JS中的DOM2事件模型


1、添加事件綁定方式:

  ① IE8之前:btn2.attachEvent("onclick",函數);
  ② 其他瀏覽器:btn2.addEventListener("click",函數,true/false);
    參數三:false(默認):表示事件冒泡   true:表示事件捕獲
  ③ 兼容寫法:if (btn2.attachEvent) {
         btn2.attachEvent();
            }else{
              btn2.addEventListener();
           }
   優點:① 可以給同一節點,添加多個同類型事件;
        ② 提供了可以取消事件綁定的函數。

2、取消DOM2事件綁定:

注意:如果要取消DOM2的事件綁定,那么在綁定事件時,處理函數必須 要使用有名函數,而不能使用匿名函數。
btn2.removeEventListener("click",func2);
btn2.detachEvent("onclick",func2);

 (四)JS中的事件流


1、事件冒泡

  當某DOM元素觸發一種事件時,會從當前節點開始,逐級往上觸發其祖 先節點的同類型事件,知道DOM根節點。
>>> 什么情況下會產生事件冒泡:
  ① DOM0模型綁定的事件,全部都是冒泡;
  ② IE8之前,使用attachEvent()綁定的事件,全部都是冒泡;
  ③ 其他瀏覽器,使用addEventListener()添加事件,當第三個參數省略或為 alse時,為事件冒泡;

2、事件捕獲

  當某DOM元素觸發一種事件時,會從文檔根節點開始,逐級向下觸發其 祖先節點的同類型事件,直到該節點自身。
>>> 什么情況下會產生事件捕獲:
  ① 使用addEventListener()添加事件,當第三個參數為true時,為事件捕獲;

3、阻止事件冒泡

  在IE瀏覽器中,使用e.cancelBubble()=true;
  在其他瀏覽器中,使用e.stopPropagation();
 
兼容所有瀏覽器的寫法:
   function myParagraphEventHandler(e) {
      e = e || window.event;
      if (e.stopPropagation) {
            e.stopPropagation(); //IE以外
      } else {
            e.cancelBubble = true; //IE
      }
   }

4、取消事件默認行為

  在IE瀏覽器中,使用e.returnValue = false;
  在其他瀏覽器中,使用e.preventDefault();
 
兼容所有瀏覽器的寫法:
function eventHandler(e) {
    e = e || window.event;
    // 防止默認行為
    if (e.preventDefault) {
        e.preventDefault(); //IE以外
    } else {
        e.returnValue = false; //IE
    }
}

二、JS中的內置對象


(一)JS中的數組


1、數組的基本概念?

  數組是在內存空間中連續存儲的一組有序數據的集合。
  元素在數組中的順序,成為下標。可以使用下標訪問數組的每個元素

2、如何聲明一個數組?

     ① 使用字面量聲明:var arr = [];
   在JS中,同一數組,可以存儲各種數據類型。
   例如:var arr=[1,"綰",true,null,func];
 
    ② 使用new關鍵字聲明:var arr = new Array(參數);
   >>> 參數可以是:
  a. 參數省略,表示創建一個空數組;
  b. 參數為一個整數,表示聲明一個length為指定長度的數組,
     但是這個length可以隨時可變可追加。
       c. 參數為逗號分隔的多個數值,表示數組的多個值。
  new Array(1,2,3)==[1,2,3]
 

3、數組中元素的讀寫/增刪

     ① 讀寫:通過下標訪問元素。下標從0開始  arr[1]="hahaha";
     ② 增刪:
    a. 使用delete關鍵字,刪除數組的某一個值。刪除之后,數組的長度不變, 對應位置變為Undefined。 eg:delete arr[1];
    b. arr.pop():刪除數組的最后一個值。相當於arr.length -= 1;
    c. arr.shift():刪除數組的第一個值。
    d. arr.unshift(值):在數組的第0個位置新增一個值;
    e. arr.push(值):在數組的最后一個位置新增一個值;
    f. 直接訪問數組沒達到的下標,可以動態追加。 arr[100]=1; 中間如果有空余下標,將存入Undefined。

4、數組中的其他方法:

  ① join("分隔符號"):將數組用指定分隔符鏈接為字符串。當參數為空時,  默認用英文逗號分隔
  ② concat():【原數組不會被改變】將數組,與兩個或多個數組的值鏈接為新數組。c oncat連接時,如果有二維數組,則至多能拆一層[]
    [1,2].concat([3,4],[5,6])->[1,2,3,4,5,6]
    [1,2].concat([3,4,[5,6]])->[1,2,3,4,[5,6]]
  ③ push() 數組最后增加一個,unshift(值) 數組開頭增加一個。-返回數組的長度;
      pop() 數組最后刪除一個,shift() 數組開頭刪除一個。-返回被刪除的值
    【上述方法,均會改變原數組】
  ④ reverse():【原數組會改變】將數組翻轉,倒序輸出;
  ⑤ slice(begin,end):【原數組不會被改變】截取數組中的某一部分,並返回 被截取的新數組將
     >>> 傳入一個參數,表示開始區間,默認截到數組最后;
     >>> 傳入兩個參數,表示開始和結束的下標,左閉右開區間(包含begin,不包含end
     >>> 兩個參數可以為負數,表示從右邊開始數,最后一個值為-1;
  ⑥ sort():【原數組被改變】將數組進行升序排列;
     >>> 默認情況下,會按照每個元素首字母的ASCII值進行排序;
    [3,1,5,12].sort()->[1,12,3,5];
    >>> 可以傳入一個比較函數,手動指定排序的函數算法;
   函數將默認接收兩個值a,b 如果返回值>0,則證明a>b;
       arr.sort(function(a,b){           
      return a-b;//升序排列
      return b-a;//降序排列
  });                                             
 
  ⑦ indexOf(value,index):返回數組中第一個value值所在的下標,如果沒有找到返回-1
      lastIndexOf(value,index):返回數組中最后一個value值所在的下標,如果沒有找到  返回-1;
  >>> 如果沒有指定index,則表示全數組查找value;
  >>> 如果指定了index,則表示從index開始,向后查找value;  
  ⑧ forEach():專門用於循環遍歷數組。接收一個回調函數,回調函數接受兩個參數, 第一個參數為數組每一項的值,第二個參數為下標。
【IE8之前,不支持此函數】
   arr.forEach(function(item,index){
  console.log(item);
  console.log(index);
  });
 
  ⑨ map():數組映射。使用方式與forEach()相同。不同的是,map可以有return 返回值,表示將原數組的每個值進行操作后,返回給一個新數組。
【IE8之前,不支持此函數】
       var arr1=arr.map(function(item){
     console.log(item);
     return item+2;
  });
 

5、二維數組與稀疏數組(了解)

  ① 二維數組:數組中的值,依然是一個數組形式。
    eg:arr = [[1,2,3],[4,5,6]];//相當於兩行三列
    讀取二維數組:arr[行號][列號];
  ② 稀疏數組:數組中的索引是不連續的。(length要比數組中實際的元素個數大)

6、基本數據類型&引用數據類型:

  ① 基本數據類型:賦值時,是將原變量中的值,賦值給另一個變量。賦值完成后,兩個 變量相互獨立,修改其中一個的值,另一個不會變化。
  ② 引用數據類型:賦值時,是將原變量在內存中的地址,賦值給另一個變量。賦值完成 后,兩個變量中存儲的是同一個內存地址,訪問的是同一份數據,修改其中一個的 值,另一個也會變化。  
  ③ 數值型、字符串、布爾型等變量屬於基本數據類型;
        數組,對象屬於引用數據類型
 

(二)內置對象


1、Boolean類

    也有兩種聲明方式:
    可以使用字面量方式聲明一個單純的變量。用typeof檢測為Boolean類型;
    也可以使用new Boolean() 聲明一個Boolean類型的對象。用typeof檢測為Object類型
 

2、Number類

     Number.MAX_VALUE 返回Number類可表示的最大值;
     Number.MIN_VALUE 返回Number類可表示的最小值;
 
 toString():將數值類型轉換為字符串類型
 toLocaleString():將數值按照本地格式順序轉換為字符串,一般從右開始,
                     三個一組加逗號分隔;
 toFixed(n):將數字保留n位小數,並轉為字符串格式;
 toPrecision(n):將數字格式化為指定長度。n表示不含小數點的位數長度。
                  如果n<原數字長度,則用科學計數法表示;
                  如果n>原數字長度,則小數點后補0;
 valueOf():返回Number對象的基本數字值;
 

3、String 類

3.1、屬性:str.length 返回字符串的長度,字符數
   字符串支持類似數組的下標訪問方式:str[0];
3.2、方法:
  toLowerCase():將字符串所有字符轉成小寫;
  toUpperCase():將字符串所有字符轉成大寫;
  charAt(n):截取數組的第n個字符,相當於str[n];
  indexOf("str","index"):查找字串在字符串中出現的位置,如果沒有找到返回-1;
     其他同數組的indexOf方法;
  lastIndexOf():同數組
  substring(begin,end):從字符串中截取子串
>>> 傳入一個參數,表示從begin開始,到最后;
>>> 傳入兩個參數,表示從begin到end的區間,左閉右開;
  split("分隔符"):將字符串以指定分隔符分隔,存入數組中。傳入空""表示將字符串  的每個字符分開放入數組;
  replace("old","new"):將字符串中的第一個old替換為new;
>>> 第一個參數,可以是普通字符串,也可以是正則表達式;
>>> 如果是普通字符串,則只替換第一個old。
  如果是正則表達式,則可以根據正則的寫法要求,進行替換。

4、Date 日期類

4.1、new Date():返回當前最新時間;
  new Date("2017,12,12,12:12:12"):返回指定的時間;
4.2、常用方法
  getFullYear():獲取4位年份;
  getMonth():獲取月份0-11;
  getDate():獲取一個月中的第幾天 1-31;
  getDay():獲取一周中的第幾天 0-6,0表示周天
  getHours():獲取小時
  getMinutes():獲取分鍾
  getSeconds():獲取秒

 

    function getTime(){
                var dates=new Date();
                var year=dates.getFullYear();
                var month=dates.getMonth();
                var date1=dates.getDate();
                var day=dates.getDay();
                var weeks=["星期日","星期一","星期二","星期三","星期四","星期五","星期六",]
                var hours=dates.getHours()<10?"0"+dates.getHours():dates.getHours();
                var minutes=dates.getMinutes()<10?"0"+dates.getMinutes():dates.getMinutes();
                var seconds=dates.getSeconds()<10?"0"+dates.getSeconds():dates.getSeconds();
                
                var div1=document.getElementById("div1");
                div1.innerText=year+"年"+(month+1)+"月"+date1+"日"+weeks[day]
                               +hours+":"+minutes+":"+seconds;
            }
            
            setInterval(getTime,1000);
            window.onload=function(){
                getTime();
            }

  

(三)自定義對象


1、基本概念:

   ① 對象:對象是擁有一系列無序屬性和方法的集合。
  ② 鍵值對:對象中的數據,是以鍵值對的形式存在。對象的每個屬性和方法,都對應值得一個鍵名,以鍵取值。
  ③ 屬性:描述對象特征的一系列變量,稱為屬性。【對象中的變量】
  ④ 方法:描述對象行為的一系列函數,稱為方法。【對象中的函數】

2、對象的聲明:

   ① 字面量聲明:   var obj = {
             key1:value1,
               key2:value2,
               func1:function(){}
                    }
>>> 對象中的數據是以鍵值對形式存儲,鍵與值之間用:分隔。多個鍵之間用,分隔。
>>> 對象中的鍵,可以是除了數組/對象以外的任何數據類型。但是,一般我們只用 普通變量名作為鍵。
>>> 對象中的值,可以是任何數據類型。包括數組和對象。
  ② 使用new關鍵字聲明:var obj= new Object();
             obj.key1=value1;
                obj.key2=value2;
             obj.function=function(){}
 

3、對象中屬性和方法的讀寫:

① .運算符:
      對象內部:this.屬性   this.方法()
      對象外部:對象名.屬性    對象.方法();
② 通過["key"]調用:對象名.["屬性名"] 對象名.["方法名"]();
     >>> 如果鍵中包含特殊字符,則只能使用第②種方式;
  >>> 對象中,直接寫變量名,默認為調用全局變量。如果需要調用對象自身的屬性或者方法。需要使用對象名.屬性,或者this.屬性。
     person.age   this.age   都可以,但推薦使用this關鍵字。
③ 刪除對象的屬性和方法:delete 對象.屬性名/方法名
   delete person.age;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM