前端基礎之JavaScript

前端基礎之JavaScript

 http://www.cnblogs.com/yuanchenqi/articles/6893904.html

JavaScript概述 

JavaScript的歷史

  • 1992年Nombas開發出C-minus-minus(C--)的嵌入式腳本語言(最初綁定在CEnvi軟件中).後將其更名ScriptEase.(客戶端執行的語言)css

  • Netscape(網景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0產品中開發出一套livescript的腳本語言.Sun和Netscape共同完成.後更名叫Javascripthtml

  • 微軟隨後模仿在其IE3.0的產品中搭載了一個JavaScript的克隆版叫Jscript.前端

  • 爲了統一三家,ECMA(歐洲計算機制造協會)定義了ECMA-262規範.國際標準化組織及國際電工委員會(ISO/IEC)也採納 ECMAScript 做爲標準(ISO/IEC-16262)。今後,Web 瀏覽器就開始努力(雖然有着不一樣的程度的成功和失敗)將 ECMAScript 做爲 JavaScript 實現的基礎。EcmaScript是規範.java

ECMAScript  

儘管 ECMAScript 是一個重要的標準,但它並非 JavaScript 惟一的部分,固然,也不是惟一被標準化的部分。實際上,一個完整的 JavaScript 實現是由如下 3 個不一樣部分組成的:node

  • 核心(ECMAScript) 
  • 文檔對象模型(DOM) Document object model (整合js,css,html)
  • 瀏覽器對象模型(BOM) Broswer object model(整合js和瀏覽器)
  • Javascript 在開發中絕大多數狀況是基於對象的.也是面向對象的. 

         

簡單地說,ECMAScript 描述瞭如下內容:python

  • 語法 
  • 類型 
  • 語句 
  • 關鍵字 
  • 保留字 
  • 運算符 
  • 對象 (封裝 繼承 多態) 基於對象的語言.使用對象.

二 JavaScript的基礎

2.1 JS的引入方式

1 直接編寫
    <script>
        alert('hello yuan')
    </script>
2 導入文件
    <script src="hello.js"></script>

2.2 JS的變量、常量和標識符

2.2.1 JS的變量

1
2
3
x=5
y=6
z=x+y

在代數中,咱們使用字母(好比 x)來保存值(好比 5)。經過上面的表達式 z=x+y,咱們可以計算出 z 的值爲 11。在 JavaScript 中,這些字母被稱爲變量。數組

那麼如何在JS中定義使用變量呢?瀏覽器

一、聲明變量時不用聲明變量類型. 全都使用var關鍵字;app

1
var  a;<br>a=3;

二、一行能夠聲明多個變量.而且能夠是不一樣類型

1
var  name= "yuan" , age=20, job= "lecturer" ;

三、聲明變量時 能夠不用var. 若是不用var 那麼它是全局變量

四、變量命名,首字符只能是字母,下劃線,$美圓符 三選一,餘下的字符能夠是下劃線、美圓符號或任何字母或數字字符且區分大小寫,x與X是兩個變量 

  命名規範

2.2.2 常量和標識符

常量 :直接在程序中出現的數據值

標識符:

  1. 由不以數字開頭的字母、數字、下劃線(_)、美圓符號($)組成
  2. 經常使用於表示函數、變量等的名稱
  3. 例如:_abc,$abc,abc,abc123是標識符,而1abc不是
  4. JavaScript語言中表明特定含義的詞稱爲保留字,不容許程序再定義爲標識符

         

            

2.3 JS的數據類型

            

複製代碼
 /*       
        number     -----  數值
        boolean    -----  布爾值
        string     -----  字符串
        undefined  -----  undefined
        null       -----   null  
      
 *
複製代碼

2.3.1 數字類型(number)

     

  • 不區分整型數值和浮點型數值;
  • 全部數字都採用64位浮點格式存儲,至關於Java和C語言中的double格式
  • 能表示的最大值是±1.7976931348623157 x 10308
  • 能表示的最小值是±5 x 10 -324  

整數:
           在JavaScript中10進制的整數由數字的序列組成
           精確表達的範圍是
-9007199254740992 (-253) 到 9007199254740992 (253)
           超出範圍的整數,精確度將受影響
浮點數:
           使用小數點記錄數據
           例如:3.4,5.6
           使用指數記錄數據
           例如:4.3e23 = 4.3 x 1023

16進制和8進制數的表達:
           16進制數據前面加上0x,八進制前面加0;16進制數是由0-9,A-F等16個字符組成;8進制數由0-7等8個數字組成

           16進制和8進制與2進制的換算:

1
2
2進制: 1111 0011 1101 0100   <-----> 16進制:0xF3D4 <-----> 10進制:62420
2進制: 1 111 001 111 010 100 <-----> 8進制:0171724

2.3.2 字符串類型(string)

是由Unicode字符、數字、標點符號組成的序列;字符串常量首尾由單引號或雙引號括起;JavaScript中沒有字符類型;經常使用特殊字符在字符串中的表達;
字符串中部分特殊字符必須加上右劃線\;經常使用的轉義字符 \n:換行 \':單引號 \":雙引號 \\:右劃線

2.3.3 布爾類型(boolean)

Boolean類型僅有兩個值:true和false,也表明1和0,實際運算中true=1,false=0
布爾值也能夠看做on/off、yes/no、1/0對應true/false
Boolean值主要用於JavaScript的控制語句,例如:

if (x==1){
      y=y+1;
}else{
      y=y-1;
      }

2.3.4 Null & Undefined類型

Undefined類型

Undefined 類型只有一個值,即 undefined。當聲明的變量未初始化時,該變量的默認值是 undefined。

當函數無明確返回值時,返回的也是值 "undefined";

Null類型

另外一種只有一個值的類型是 Null,它只有一個專用值 null,即它的字面量。值 undefined 其實是從值 null 派生來的,所以 ECMAScript 把它們定義爲相等的。

儘管這兩個值相等,但它們的含義不一樣。undefined 是聲明瞭變量但未對其初始化時賦予該變量的值,null 則用於表示還沒有存在的對象(在討論 typeof 運算符時,簡單地介紹過這一點)。若是函數或方法要返回的是對象,那麼找不到該對象時,返回的一般是 null。

2.4 運算符

複製代碼
算術運算符:
    +   -    *    /     %       ++        -- 

比較運算符:
    >   >=   <    <=    !=    ==    ===   !==

邏輯運算符:
     &&   ||   !

賦值運算符:
    =  +=   -=  *=   /=

字符串運算符:
    +  鏈接,兩邊操做數有一個或兩個是字符串就作鏈接運算
複製代碼

2.4.1 算術運算符

注意1: 自加自減

假如x=2,那麼x++表達式執行後的值爲3,x--表達式執行後的值爲1;i++至關於i=i+1,i--至關於i=i-1;
遞增和遞減運算符能夠放在變量前也能夠放在變量後:--i

複製代碼
var i=10;
console.log(i++);
console.log(i);
console.log(++i);
console.log(i);
console.log(i--);
console.log(--i);
複製代碼

注意2: 單元運算符

1
2
3
- 除了能夠表示減號還能夠表示負號  例如:x=-y
 
+ 除了能夠表示加法運算還能夠用於字符串的鏈接  例如: "abc" + "def" = "abcdef"

js不一樣於python,是一門弱類型語言

  View Code

注意3: NaN

複製代碼
    var d="yuan";
    d=+d;
    alert(d);//NaN:屬於Number類型的一個特殊值,當遇到將字符串轉成數字無效時,就會獲得一個NaN數據
    alert(typeof(d));//Number

    //NaN特色:
    
    var n=NaN;
    
    alert(n>3);
    alert(n<3);
    alert(n==3);
    alert(n==NaN);
    
    alert(n!=NaN);//NaN參與的全部的運算都是false,除了!=
複製代碼

2.4.2 比較運算符

1
>   >=   <    <=    !=    ==    ===   !==

用於控制語句時:

        if (2>1){       //  3  0  false null undefined []
            console.log("條件成立!")
        }

等號和非等號的同類運算符是全等號和非全等號。這兩個運算符所作的與等號和非等號相同,只是它們在檢查相等性前,不執行類型轉換。

console.log(2==2);
console.log(2=="2");
console.log(2==="2");
console.log(2!=="2");

注意1:

  View Code

注意2:

複製代碼
等性運算符:執行類型轉換的規則以下:

若是一個運算數是 Boolean 值,在檢查相等性以前,把它轉換成數字值。false 轉換成 0,true 爲 1。 
若是一個運算數是字符串,另外一個是數字,在檢查相等性以前,要嘗試把字符串轉換成數字。 
若是一個運算數是對象,另外一個是字符串,在檢查相等性以前,要嘗試把對象轉換成字符串。 
若是一個運算數是對象,另外一個是數字,在檢查相等性以前,要嘗試把對象轉換成數字。 
在比較時,該運算符還遵照下列規則:

值 null 和 undefined 相等。 
在檢查相等性時,不能把 null 和 undefined 轉換成其餘值。 
若是某個運算數是 NaN,等號將返回 false,非等號將返回 true。 
若是兩個運算數都是對象,那麼比較的是它們的引用值。若是兩個運算數指向同一對象,那麼等號返回 true,不然兩個運算數不等。 
複製代碼

2.4.3 邏輯運算符

複製代碼
if (2>1 && [1,2]){
    console.log("條件與")
}

// 思考返回內容?
console.log(1 && 3);
console.log(0 && 3);
console.log(0 || 3);
console.log(2 || 3);
複製代碼

2.5 流程控制

  • 順序結構(從上向下順序執行)
  • 分支結構
  • 循環結構

2.5.1 順序結構

    <script>
        console.log(「星期一」);
        console.log(「星期二」);
        console.log(「星期三」);
    </script>

2.5.1 分支結構

if-else結構:

複製代碼
if (表達式){
   語句1;
   ......
   } else{
   語句2;
   .....
   }
複製代碼

功能說明:若是表達式的值爲true則執行語句1,不然執行語句2

示例:

  View Code

if-elif-else結構:

複製代碼
if (表達式1) {
    語句1;
}else if (表達式2){
    語句2;
}else if (表達式3){
    語句3;
} else{
    語句4;
}
複製代碼

示例:

  View Code

switch-case結構

複製代碼
switch基本格式
switch (表達式) {
    case 值1:語句1;break;
    case 值2:語句2;break;
    case 值3:語句3;break;
    default:語句4;
}
複製代碼

 

示例:

複製代碼
switch(x){
case 1:y="星期一";    break;
case 2:y="星期二";    break;
case 3:y="星期三";    break;
case 4:y="星期四";    break;
case 5:y="星期五";    break;
case 6:y="星期六";    break;
case 7:y="星期日";    break;
default: y="未定義";
}
複製代碼

switch比else if結構更加簡潔清晰,使程序可讀性更強,效率更高。

2.5.2 循環結構

              

                循環語句流程圖     

for循環:

複製代碼
語法規則:

    for(初始表達式;條件表達式;自增或自減)
    {
            執行語句
            ……
    }
複製代碼

功能說明:實現條件循環,當條件成立時,執行語句1,不然跳出循環體

for循環的另外一種形式:

for( 變量 in 數組或對象)
    {
        執行語句
        ……
    }

while循環:

語法規則:

while (條件){ 語句1; ... }

功能說明:運行功能和for相似,當條件成立循環執行語句花括號{}內的語句,不然跳出循環;一樣支持continue與break語句。
示例:

  View Code

2.5.3 異常處理

複製代碼
try {
    //這段代碼從上往下運行,其中任何一個語句拋出異常該代碼塊就結束運行
}
catch (e) {
    // 若是try代碼塊中拋出了異常,catch代碼塊中的代碼就會被執行。
    //e是一個局部變量,用來指向Error對象或者其餘拋出的對象
}
finally {
     //不管try中代碼是否有異常拋出(甚至是try代碼塊中有return語句),finally代碼塊中始終會被執行。
}
複製代碼

注:主動拋出異常 throw Error('xxxx')

三 JavaScript的對象

簡介:

在JavaScript中除了null和undefined之外其餘的數據類型都被定義成了對象,也能夠用建立對象的方法定義變量,String、Math、Array、Date、RegExp都是JavaScript中重要的內置對象,在JavaScript程序大多數功能都是基於對象實現的。

複製代碼
<script language="javascript">
var aa=Number.MAX_VALUE; 
//利用數字對象獲取可表示最大數
var bb=new String("hello JavaScript"); 
//建立字符串對象
var cc=new Date();
//建立日期對象
var dd=new Array("星期一","星期二","星期三","星期四"); 
//數組對象
</script>
複製代碼

   

 

3.1 String對象

字符串對象建立

字符串建立(兩種方式)
       ① 變量 = 「字符串」
       ② 字串對象名稱 = new String (字符串)

1
2
var  str1= "hello world" ;
var  str1=  new  String( "hello word" );

字符串對象的屬性和函數

複製代碼
       x.length         ----獲取字符串的長度

 x.toLowerCase()        ----轉爲小寫
 x.toUpperCase()        ----轉爲大寫
x.trim() ----去除字符串兩邊空格 ----字符串查詢方法 x.charAt(index) ----str1.charAt(index);----獲取指定位置字符,其中index爲要獲取的字符索引 x.indexOf(findstr,index)----查詢字符串位置 x.lastIndexOf(findstr) x.match(regexp) ----match返回匹配字符串的數組,若是沒有匹配則返回null x.search(regexp) ----search返回匹配字符串的首字符位置索引 示例: var str1="welcome to the world of JS!"; var str2=str1.match("world"); var str3=str1.search("world"); alert(str2[0]); // 結果爲"world" alert(str3); // 結果爲15 ----子字符串處理方法 x.substr(start, length) ----start表示開始位置,length表示截取長度 x.substring(start, end) ----end是結束位置 x.slice(start, end) ----切片操做字符串 示例: var str1="abcdefgh"; var str2=str1.slice(2,4); var str3=str1.slice(4); var str4=str1.slice(2,-1); var str5=str1.slice(-3,-1); alert(str2); //結果爲"cd" alert(str3); //結果爲"efgh" alert(str4); //結果爲"cdefg" alert(str5); //結果爲"fg" x.replace(findstr,tostr) ---- 字符串替換 x.split(); ----分割字符串 var str1="一,二,三,四,五,六,日"; var strArray=str1.split(","); alert(strArray[1]);//結果爲"二" x.concat(addstr) ---- 拼接字符串
複製代碼

3.2 Array對象

3.2.1 數組建立

建立數組的三種方式:

複製代碼
建立方式1:
var arrname = [元素0,元素1,….];          // var arr=[1,2,3];

建立方式2:
var arrname = new Array(元素0,元素1,….); // var test=new Array(100,"a",true);

建立方式3:
var arrname = new Array(長度); 
            //  初始化數組對象:
                var cnweek=new Array(7);
                    cnweek[0]="星期日";
                    cnweek[1]="星期一";
                    ...
                    cnweek[6]="星期六";
複製代碼

建立二維數組:

  View Code

3.2.2 數組對象的屬性和方法

join方法:

  View Code

concat方法:

  View Code

數組排序-reverse sort:

  View Code

數組切片操做:

  View Code

刪除子數組:

  View Code

數組的push和pop:

  View Code

數組的shift和unshift:

  View Code

總結js的數組特性:

  View Code

3.3 Date對象

3.3.1 建立Date對象

複製代碼
//方法1:不指定參數
var nowd1=new Date();
alert(nowd1.toLocaleString( ));
//方法2:參數爲日期字符串
var nowd2=new Date("2004/3/20 11:12");
alert(nowd2.toLocaleString( ));
var nowd3=new Date("04/03/20 11:12");
alert(nowd3.toLocaleString( ));
//方法3:參數爲毫秒數
var nowd3=new Date(5000);
alert(nowd3.toLocaleString( ));
alert(nowd3.toUTCString());

//方法4:參數爲年月日小時分鐘秒毫秒
var nowd4=new Date(2004,2,20,11,12,0,300);
alert(nowd4.toLocaleString( ));//毫秒並不直接顯示
複製代碼

Date對象的方法—獲取日期和時間

複製代碼
獲取日期和時間
getDate()                 獲取日
getDay ()                 獲取星期
getMonth ()               獲取月(0-11)
getFullYear ()            獲取完全年份
getYear ()                獲取年
getHours ()               獲取小時
getMinutes ()             獲取分鐘
getSeconds ()             獲取秒
getMilliseconds ()        獲取毫秒
getTime ()                返回累計毫秒數(從1970/1/1午夜)
複製代碼

實例練習:

  View Code

Date對象的方法—設置日期和時間

  View Code

Date對象的方法—日期和時間的轉換

  View Code

3.4 Math對象

複製代碼
//該對象中的屬性方法 和數學有關.
   
abs(x) 返回數的絕對值。 exp(x) 返回 e 的指數。 floor(x)對數進行下舍入。 log(x) 返回數的天然對數(底爲e)。 max(x,y) 返回 x 和 y 中的最高值。 min(x,y) 返回 x 和 y 中的最低值。 pow(x,y) 返回 x 的 y 次冪。 random() 返回 0 ~ 1 之間的隨機數。 round(x) 把數四捨五入爲最接近的整數。 sin(x) 返回數的正弦。 sqrt(x) 返回數的平方根。 tan(x) 返回角的正切。 //方法練習: //alert(Math.random()); // 得到隨機數 0~1 不包括1. //alert(Math.round(1.5)); // 四捨五入 //練習:獲取1-100的隨機整數,包括1和100 //var num=Math.random(); //num=num*10; //num=Math.round(num); //alert(num) //============max min========================= /* alert(Math.max(1,2));// 2 alert(Math.min(1,2));// 1 */ //-------------pow-------------------------------- alert(Math.pow(2,4));// pow 計算參數1 的參數2 次方.
複製代碼

3.5 Function 對象(重點)

3.5.1 函數的定義

1
2
3
function  函數名 (參數){
<br>    函數體;
     return  返回值;
}

功能說明:

可使用變量、常量或表達式做爲函數調用的參數
函數由關鍵字function定義
函數名的定義規則與標識符一致,大小寫是敏感的
返回值必須使用return
Function 類能夠表示開發者定義的任何函數。

用 Function 類直接建立函數的語法以下:

1
var  函數名 =  new  Function( "參數1" , "參數n" , "function_body" );

雖然因爲字符串的關係,第二種形式寫起來有些困難,但有助於理解函數只不過是一種引用類型,它們的行爲與用 Function 類明確建立的函數行爲是相同的。

示例:

  View Code

注意:js的函數加載執行與python不一樣,它是總體加載完纔會執行,因此執行函數放在函數聲明上面或下面均可以:

  View Code

3.5.2 Function 對象的屬性

如前所述,函數屬於引用類型,因此它們也有屬性和方法。
好比,ECMAScript 定義的屬性 length 聲明瞭函數指望的參數個數。

1
alert(func1.length)

3.5.3 Function 的調用

  View Code

3.5.4 函數的內置對象arguments

  View Code

3.5.4 匿名函數

  View Code

BOM對象

window對象

全部瀏覽器都支持 window 對象。
概念上講.一個html文檔對應一個window對象.
功能上講: 控制瀏覽器窗口的.
使用上講: window對象不須要建立對象,直接使用便可.

Window 對象方法

複製代碼
alert()            顯示帶有一段消息和一個確認按鈕的警告框。
confirm()          顯示帶有一段消息以及確認按鈕和取消按鈕的對話框。
prompt()           顯示可提示用戶輸入的對話框。

open()             打開一個新的瀏覽器窗口或查找一個已命名的窗口。
close()            關閉瀏覽器窗口。
setInterval() 按照指定的週期(以毫秒計)來調用函數或計算表達式。 clearInterval() 取消由 setInterval() 設置的 timeout。 setTimeout() 在指定的毫秒數後調用函數或計算表達式。 clearTimeout() 取消由 setTimeout() 方法設置的 timeout。 scrollTo() 把內容滾動到指定的座標。
複製代碼

方法使用

一、alert confirm prompt以及open函數

  View Code

示例:

  View Code

二、setInterval,clearInterval

setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。由 setInterval() 返回的 ID 值可用做 clearInterval() 方法的參數。

1
2
語法:<br>     setInterval(code,millisec)
其中,code爲要調用的函數或要執行的代碼串。millisec週期性執行或調用 code 之間的時間間隔,以毫秒計。

示例:

  View Code

DOM對象

什麼是HTML  DOM

  •     HTML  Document Object Model(文檔對象模型)
  •     HTML DOM 定義了訪問和操做HTML文檔的標準方法
  •     HTML DOM 把 HTML 文檔呈現爲帶有元素、屬性和文本的樹結構(節點樹)

DOM樹

 

              

 

 畫dom樹是爲了展現文檔中各個對象之間的關係,用於對象的導航。

DOM節點

節點類型

HTML 文檔中的每一個成分都是一個節點。

DOM 是這樣規定的:
    整個文檔是一個文檔節點 
    每一個 HTML 標籤是一個元素節點 
    包含在 HTML 元素中的文本是文本節點 
    每個 HTML 屬性是一個屬性節點

 

其中,document與element節點是重點。

節點關係

節點樹中的節點彼此擁有層級關係。
父(parent),子(child)和同胞(sibling)等術語用於描述這些關係。父節點擁有子節點。同級的子節點被稱爲同胞(兄弟或姐妹)。

  •     在節點樹中,頂端節點被稱爲根(root)
  •     每一個節點都有父節點、除了根(它沒有父節點)
  •     一個節點可擁有任意數量的子
  •     同胞是擁有相同父節點的節點

下面的圖片展現了節點樹的一部分,以及節點之間的關係:



訪問 HTML 元素(節點),訪問 HTML 元素等同於訪問節點,咱們可以以不一樣的方式來訪問 HTML 元素。

節點查找

直接查找節點

1
2
3
4
document.getElementById(「idname」)
document.getElementsByTagName(「tagname」)
document.getElementsByName(「name」)
document.getElementsByClassName(「name」)
  局部查找

注意:設計到尋找元素,注意<script>標籤的位置!

導航節點屬性

複製代碼
'''
parentElement // 父節點標籤元素
children // 全部子標籤
firstElementChild // 第一個子標籤元素
lastElementChild // 最後一個子標籤元素
nextElementtSibling // 下一個兄弟標籤元素
previousElementSibling // 上一個兄弟標籤元素 '''
複製代碼

注意,js中沒有辦法找到全部的兄弟標籤!

節點操做

建立節點:

1
createElement(標籤名) :建立一個指定名稱的元素。

例:var  tag=document.createElement(「input")
            tag.setAttribute('type','text');

添加節點:

1
2
3
4
5
追加一個子節點(做爲最後的子節點)
somenode.appendChild(newnode)
 
把增長的節點放到某個節點的前邊
somenode.insertBefore(newnode,某個節點);

刪除節點:

1
removeChild():得到要刪除的元素,經過父元素調用刪除

替換節點:

1
somenode.replaceChild(newnode, 某個節點);

節點屬性操做:

一、獲取文本節點的值:innerText    innerHTML

二、attribute操做

     elementNode.setAttribute(name,value)    

     elementNode.getAttribute(屬性名)        <-------------->elementNode.屬性名(DHTML)

     elementNode.removeAttribute(「屬性名」);

三、value獲取當前選中的value值
        1.input   
        2.select (selectedIndex)
        3.textarea  
四、innerHTML 給節點添加html代碼:
        該方法不是w3c的標準,可是主流瀏覽器支持    
        tag.innerHTML = 「<p>要顯示內容</p>」;

五、關於class的操做:

1
2
3
elementNode.className
elementNode.classList.add
elementNode.classList.remove

 六、改變css樣式:

1
2
3
<p  id = "p2" >Hello world!< / p>
document.getElementById( "p2" ).style.color = "blue" ;
                              .style.fontSize = 48px

DOM Event(事件)

事件類型

複製代碼
onclick        當用戶點擊某個對象時調用的事件句柄。
ondblclick     當用戶雙擊某個對象時調用的事件句柄。

onfocus        元素得到焦點。               練習:輸入框
onblur         元素失去焦點。               應用場景:用於表單驗證,用戶離開某個輸入框時,表明已經輸入完了,咱們能夠對它進行驗證.
onchange       域的內容被改變。             應用場景:一般用於表單元素,當元素內容被改變時觸發.(三級聯動)

onkeydown      某個鍵盤按鍵被按下。          應用場景: 當用戶在最後一個輸入框按下回車按鍵時,表單提交.
onkeypress     某個鍵盤按鍵被按下並鬆開。
onkeyup        某個鍵盤按鍵被鬆開。
onload 一張頁面或一幅圖像完成加載。
onmousedown 鼠標按鈕被按下。 onmousemove 鼠標被移動。 onmouseout 鼠標從某元素移開。 onmouseover 鼠標移到某元素之上。 onmouseleave 鼠標從元素離開 onselect 文本被選中。 onsubmit 確認按鈕被點擊。
複製代碼

綁定事件方式

方式1:

複製代碼
<div id="div" onclick="foo(this)">點我呀</div>

<script>
    function foo(self){           // 形參不能是this;
        console.log("點你大爺!");
        console.log(self);   
    }
</script>
複製代碼

方式2:

複製代碼
<p id="abc">試一試!</p>

<script>

    var ele=document.getElementById("abc");

    ele.onclick=function(){
        console.log("ok");
        console.log(this);    // this直接用
    };

</script>
複製代碼

事件介紹

一、onload:

onload 屬性開發中 只給 body元素加.這個屬性的觸發 標誌着 頁面內容被加載完成.應用場景: 當有些事情咱們但願頁面加載完馬上執行,那麼可使用該事件屬性.

  View Code

二、onsubmit:

當表單在提交時觸發. 該屬性也只能給form元素使用.應用場景: 在表單提交前驗證用戶輸入是否正確.若是驗證失敗.在該方法中咱們應該阻止表單的提交.

  View Code

三、事件傳播:

  View Code

四、onselect:

  View Code

五、onchange:

  View Code

六、onkeydown:

Event 對象:Event 對象表明事件的狀態,好比事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。
事件一般與函數結合使用,函數不會在事件發生前被執行!event對象在事件發生時系統已經建立好了,而且會在事件函數被調用時傳給事件函數.咱們得到僅僅須要接收一下便可.好比onkeydown,咱們想知道哪一個鍵被按下了,須要問下event對象的屬性,這裏就時KeyCode.

  View Code

七、onmouseout與onmouseleave事件的區別:

  View Code

實例練習

1 左側菜單

  View Code

2 搜索框

  View Code

3 模態對話框

  View Code

4 表格案例

  View Code

5 select移動

  View Code

6 二級聯動

  View Code

7 跑馬燈與tab切換

  View Code

js擴展

js的做用域

做用域是JavaScript最重要的概念之一,想要學好JavaScript就須要理解JavaScript做用域和做用域鏈的工做原理。

任何程序設計語言都有做用域的概念,簡單的說,做用域就是變量與函數的可訪問範圍,即做用域控制着變量與函數的可見性和生命週期。在JavaScript中,變量的做用域有全局做用域和局部做用域兩種。

做用域

1. 全局做用域(Global Scope)

在代碼中任何地方都能訪問到的對象擁有全局做用域,通常來講一下幾種情形擁有全局做用域:

(1)最外層函數和在最外層函數外面定義的變量擁有全局做用域

複製代碼
var name="yuan";

    function foo(){
        var age=23;
        function inner(){
            console.log(age);
        }

        inner();
    }

    console.log(name);    // yuan
    //console.log(age);   // Uncaught ReferenceError: age is not defined
    foo();                // 23
    inner();              // Uncaught ReferenceError: inner is not defined
複製代碼

(2)全部末定義直接賦值的變量自動聲明爲擁有全局做用域,例如:

複製代碼
    var name="yuan";

    function foo(){
        age=23;

        var sex="male"
    }
    foo();
    console.log(age);   //  23
    console.log(sex);   // sex is not defined
複製代碼

變量blog擁有全局做用域,而sex在函數外部沒法訪問到。

(3)全部window對象的屬性擁有全局做用域

通常狀況下,window對象的內置屬性都都擁有全局做用域,例如window.alert()、window.location、window.top等等。

2. 局部做用域(Local Scope)

和全局做用域相反,局部做用域通常只在固定的代碼片斷內可訪問到,最多見的例如函數內部,全部在一些地方也會看到有人把這種做用域成爲函數做用域.

如示例1中的age與inner都只有局部做用域。(js中if、for沒有本身的做用域)

做用域鏈(Scope Chain)

在JavaScript中,函數也是對象,實際上,JavaScript裏一切都是對象。函數對象和其它對象同樣,擁有能夠經過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],由ECMA-262標準第三版定義,該內部屬性包含了函數被建立的做用域中對象的集合,這個集合被稱爲函數的做用域鏈,它決定了哪些數據能被函數訪問。

示例演示

please have a try:

複製代碼
//-----**********************例1*********************************

var s=12;
    function f(){
        console.log(s);
         var s=12;          // if s=12
        console.log(s)
    }
    f();

//-----**********************例2*********************************

var s=10;
function foo(){
  console.log(s);
  var s=5;
  console.log(s);
  function s(){console.log("ok")}// 函數的定於或聲明是在詞法分析時完成的,執行時已再也不有任何操做

  console.log(s);
}

foo();

//-----***********************例3********************************

function bar(age) {

        console.log(age);
        var age = 99;
var sex= 'male'; console.log(age); function age() {
alert(123) }; console.log(age);
return 100; } result=bar(5); //-----********************************************************
複製代碼

結果分析

我相信你們必定會有想不到的結果,接下來咱們就以最複雜的例3來分析整個過程。

當一個函數建立後,它的做用域鏈會被建立此函數的做用域中可訪問的數據對象填充。在函數bar建立時,它的做用域鏈中會填入一個全局對象,該全局對象包含了全部全局變量,以下圖所示:

解析到函數調用時,即bar(5),會生成一個active object的對象,該對象包含了函數的全部局部變量、命名參數、參數集合以及this,而後此對象會被推入做用域鏈的前端,當運行期上下文被銷燬,活動對象也隨之銷燬。新的做用域鏈以下圖所示:

過程解析:

複製代碼
function bar(age) {

        console.log(age);
        var age = 99;
        var sex="male";
        console.log(age);
        function age(){
            alert(123);
        } ;
        console.log(age);
        return 100;
}

result=bar(5);

一 詞法分析過程(涉及參數,局部變量聲明,函數聲明表達式):
    1-1 、分析參數,有一個參數,造成一個 AO.age=undefine;
    1-2 、接收參數 AO.age=5;
    1-3 、分析變量聲明,有一個 var age, 發現 AO 上面有一個 AO.age ,則不作任何處理
    1-4 、分析變量聲明,有一個 var sex,造成一個 AO.sex=undefine;
    1-5 、分析函數聲明,有一個 function age(){} 聲明, 則把原有的 age 覆蓋成 AO.age=function(){};
二 執行過程:
    2-1 、執行第一個 console.log(age) 時,當前的 AO.age 是一個函數,因此輸出的一個函數
    2-2 、這句 var age=99; 是對不 AO.age 的屬性賦值, AO.age=99 ,因此在第二個輸出的age是 99;
    2-3 、同理第三個輸出的是 99, 由於中間沒有改變 age 值的語句了。

          注意:執行階段:
                        function age(){
                            alert(123)
                        } ;

            不進行任何操做,將執行語句複製給age這部操做是在詞法分析時,即運行前完成的。
複製代碼
相關文章
相關標籤/搜索