JavaScript

 1、JavaScript簡介                                                                                                                     javascript

JavaScript的組成:

JavaScript基礎分爲三個部分:css

  • ECMAScript:JavaScript的語法標準。包括變量、表達式、運算符、函數、if語句、for語句等。html

  • DOM:操做網頁上的元素的API。好比讓盒子移動、變色、輪播圖等。前端

  • BOM:操做瀏覽器部分功能的API。好比讓瀏覽器自動滾動。java

PS:JS機械重複性的勞動幾乎爲0,基本都是創造性的勞動。而不像HTML、CSS中margin、padding都是機械重複勞動。node

JavaScript的特色:

(1)簡單易用:可使用任何文本編輯工具編寫,只須要瀏覽器就能夠執行程序。python

(2)解釋執行(解釋語言):事先不編譯、逐行執行、無需進行嚴格的變量聲明。linux

(3)基於對象:內置大量現成對象,編寫少許程序能夠完成目標。 程序員

2、第一個JavaScript代碼                                                                                              es6

在頁面中,咱們能夠在body標籤中放入<script type=」text/javascript」></script>標籤對兒

alert語句

<script type="text/javascript">
       alert("111");
</script>

alert(英文翻譯爲「警報」)的用途:彈出「警告框」

語法規則:

學習程序,是有規律可循的,就是程序是有相同的部分,這些部分就是一種規定,不能更改,咱們成爲:語法。

(1)JavaScript對換行、縮進、空格不敏感。

      備註:每一條語句末尾要加上分號,雖然分號不是必須加的,可是爲了程序從此要壓縮,若是不加分號,壓縮以後將不能運行。

(2)全部的符號,都是英語的。好比括號、引號、分號。

(3)JavaScript的註釋:

  單行註釋:

// 我是註釋

  多行註釋: 

/*
    多行註釋1
    多行註釋2
*/

備註:sublime中,單行註釋的快捷鍵是ctrl+/,多行註釋的快捷鍵是ctrl+shift+/

JavaScript在網頁中輸出信息的寫法

彈出警告框:alert("")

控制檯輸出:console.log("")

console.log("")表示在控制檯中輸出。console表示「控制檯」,log表示「輸出」。

控制檯在Chrome瀏覽器的F12中。控制檯是工程師、程序員調試程序的地方。程序員常用這條語句輸出一些東西,來測試程序是否正確。 

用戶輸入:prompt()語句

prompt()就是專門用來彈出可以讓用戶輸入的對話框。

代碼以下:

<script type="text/javascript">
        var a = prompt('今天是什麼天氣?');
        console.log(a);
</script>

上方代碼中,用戶輸入的內容,將被傳遞到變量 a 裏面; f12打開控制檯查看結果。

prompt()語句中,用戶無論輸入什麼內容,都是字符串。

alert和prompt的區別:

alert("從前有座山");                //直接使用,不須要變量
var a = prompt("請輸入一個數字");   // 必須用一個變量,來接收用戶輸入的值

直接量:數字和字符串

「直接量」即常量,也稱爲「字面量」。看見什麼,它就是什麼。

簡單的直接量有2種:數字、字符串。

(1)數值的直接量的表達很是簡單,寫上去就好了,不須要任何的符號。例如:

alert(886);  //886是數字,因此不須要加引號。

(2)字符串也很簡單,但必定要加上引號。能夠是單詞、句子等。

變量:

變量的定義和賦值

   var a = 100;

var是英語「variant」變量的縮寫。後面要加一個空格,空格後面的東西就是「變量名」,

  • 定義變量:var就是一個關鍵字,用來定義變量。所謂關鍵字,就是有特殊功能的小詞語。關鍵字後面必定要有空格隔開。

  • 變量的賦值:等號表示賦值,將等號右邊的值,賦給左邊的變量。

  • 變量名:咱們能夠給變量任意的取名字。

 PS:在JavaScript中,永遠都是用var來定義變量,這和C、Java等語言不一樣(有興趣的同窗能夠看一下es6)

變量要先定義,才能使用。好比,咱們不設置變量,直接輸出,控制檯將會報錯:

 <script type="text/javascript">
        console.log(a);
  </script>

正確寫法:

  var a;   // 定義
    a = 100;  //賦值
    console.log(a);  //輸出100

有經驗的程序員,會把定義和賦值寫在一塊兒:

var a = 100;    //定義,而且賦值100
console.log(a);  //輸出100

變量的命名規範

變量名有命名規範:只能由英語字母、數字、下劃線、美圓符號$構成,且不能以數字開頭,而且不能是JavaScript保留字。

下列的單詞,叫作保留字,就是說不容許當作變量名,不用記:

abstract、booleanbytechar、class、const、debuggerdouble、enum、export、extends、final、float、goto
implements、import、int、interface、long、native、package、private、protected、public、short、static、super、synchronized、throws、transient、volatile

大寫字母是可使用的,而且大小寫敏感。也就是說A和a是兩個變量。

    var A = 250;    //變量1
    var a = 888;    //變量2

變量的類型:

變量裏面可以存儲數字、字符串等。變量會自動的根據存儲內容的類型不一樣,來決定本身的類型。

數值型:number

 若是一個變量中,存放了數字,那麼這個變量就是數值型的

    var a = 100;            //定義了一個變量a,而且賦值100
    console.log(typeof a);  //輸出a變量的類型

typeof()表示「獲取變量的類型」,語法爲:

typeof 變量

在JavaScript中,只要是數,就是數值型(number)的。不管整浮、浮點數(即小數)、不管大小、不管正負,都是number類型的。

字符串型:string

var a = "abcde";
    var b = "呵呵";
    var c = "123123";
    var d = "哈哈哈哈哈";
    var e = "";     //空字符串

    console.log(typeof a);
    console.log(typeof b);
    console.log(typeof c);
    console.log(typeof d);
    console.log(typeof e);
View Code

連字符和加號的區別:

鍵盤上的+多是連字符,也多是數字的加號。以下:

   console.log("我" + "愛" + "你");   //連字符,把三個獨立的漢字,鏈接在一塊兒了
    console.log("我+愛+你");           //原樣輸出
    console.log(1+2+3);             //輸出6

總結:若是加號兩邊都是數值,此時是加。不然,就是連字符(用來鏈接字符串)。 

變量值的傳遞(賦值)

把b的值賦給a,b不變。將等號右邊的值,賦給左邊的變量;等號右邊的變量,值不變。

舉個特殊的例子:

        var a = "3";
        var b = 2;
        console.log(a-b);

效果:(注意,字符串 - 數值 = 數值)

變量格式轉換:

用戶的輸入,咱們在上面的內容裏講過,prompt()就是專門用來彈出可以讓用戶輸入的對話框。重要的是:用戶無論輸入什麼,都是字符串。

parseInt():字符串轉數字

parseInt()能夠將字符串轉數字。parse表示「轉換」,Int表示「整數」(注意Int的拼寫)。例如:

字符串轉數字的方法:

 parseInt(「5」);

parseInt()還具備如下特性

(1)帶有自動淨化的功能;只保留字符串最開頭的數字,後面的中文自動消失。例如:

console.log(parseInt("2018你真帥!!");

(2)自動帶有截斷小數的功能:取整,不四捨五入

var a = parseInt(5.8) + parseInt(4.7);
console.log(a);
 var a = parseInt(5.8 + 4.7);
 console.log(a);

3、數據類型                                                                                                                                               

數據類型包括:基本數據類型和引用數據類型;

基本數據類型:指的是簡單的數據段;引用數據類型:指的是有多個值構成的對象。

1.基本數據類型
number:  

var a = 123;
  //typeof 檢查當前變量是什麼數據類型
  console.log(typeof a)
  //特殊狀況
  var a1 = 5/0;
  console.log(typeof e1) //Infinity 無限大. number類型

string:

var str = '123'
console.log(typeof str)
boolean:

var b1 = false;
console.log(typeof b1)

null:

var c1 = null;//空對象. object
console.log(c1)

undefined:

var d1;
//表示變量未定義
console.log(typeof d1)

2.引用數據類型

Function;Object;Arrray;String;Date。

4、運算符                                                                                                                                          

1.賦值運算符

以var x = 12,y=5來演示示例|

2.算數運算符

var a = 5,b=2

3.比較運算符

var x = 5;

4.特殊狀況

字符串拼接+字符串運算 特殊狀況。python中有拼接字符串中更簡便的辦法,其實在js中也有,你們能夠百度引擎搜索es6模板字符串。(擴展)

var name = '伊拉克';
var am = '美軍';
// 字符串拼接
var str = "2003年3月20日,"+name+"戰爭爆發,以美軍爲主的聯合部隊僅用20多天就擊潰了薩達姆的軍隊。這是繼十多年前的海灣戰爭後,"+am+"又一次取得的大規模壓倒性軍事勝利。"
var fullStr = str;
console.log(fullStr)

// ***** es6的模塊字符串 tab鍵上面的反引號 `` 添加變量使用${變量名}*****
var str = `2003年3月20日,${name}戰爭爆發,以${am}爲主的聯合部隊僅用20多天就擊潰了薩達姆的軍隊。這是繼十多年前的海灣戰爭後,美軍又一次取得的大規模壓倒性軍事勝利。`;
 
// 不能對字符串進行+運算 只能拼接
var a1 = '1';
var a2 = '2';
console.log(a1-a2) //12
var b1 = 'one';
var b2  = 'two';

// NaN. ==== not a number 是number類型
console.log(typeof(b1*b2))

 5、數據類型轉換                                                                                                          

1,將數據類型轉換成字符串類型:

var n1 = 123;
var n2 = '123';
var n3 = n1+n2;
// 隱式轉換
console.log(typeof n3);
// 強制類型轉換String(),toString()
var str1 = String(n1);
console.log(typeof str1);

var num = 234;
console.log(num.toString())

2,將字符串類型轉換成數值類型:

var  stringNum = '789.123wadjhkd';
var num2 =  Number(stringNum);
console.log(num2)

// parseInt()能夠解析一個字符串 而且返回一個整數
console.log(parseInt(stringNum))
console.log(parseFloat(stringNum));

3,任何數據類型均可以轉換爲boolean類型:

var b1 = '123';
var b2 = 0;
var b3 = -123

var b4 = Infinity; 
var b5 = NaN;

var b6; //undefined
var b7 = null;

// 非0既真
console.log(Boolean(b7))

 6、流程控制                                                                                                                      

1.if 、if-else:

var ji  = 20;
if(ji>=20){
    console.log('恭喜你,吃雞成功,大吉大利')
}else{
    console.log('很遺憾 下次繼續努力')

if (true) {
   //執行操做
}else if(true){
    //知足條件執行            
}else if(true){
   //知足條件執行        
}else{
  //知足條件執行
}
if

2.與&&、或||:

//1.模擬  若是總分 >400 而且數學成績 >89分 被清華大學錄入
//邏輯與&& 兩個條件都成立的時候 才成立
if(sum>400 && math>90){
    console.log('清華大學錄入成功')
}else{
    alert('高考失利')
}

//2.模擬 若是總分>400 或者你英語大於85 被複旦大學錄入
//邏輯或  只有有一個條件成立的時候 才成立
if(sum>500 || english>85){
    alert('被複旦大學錄入')
}else{
    alert('高考又失利了')
}
View Code

3.switch:

var gameScore = 'better';

switch(gameScore){

//case表示一個條件 知足這個條件就會走進來 遇到break跳出。break終止循環。若是某個條件中不寫 break,那麼直到該程序遇到下一個break中止
    case 'good':
    console.log('玩的很好')
    //break表示退出
    break;
    case  'better':
    console.log('玩的老牛逼了')
    break;
    case 'best':
    console.log('恭喜你 吃雞成功')
    break;

    default:
    console.log('很遺憾')

}
View Code

4.while循環:

循環三步走:
1.初始化循環變量;2.判斷循環條件;3.更新循環變量

var i = 1; //初始化循環變量

while(i<=9){ //判斷循環條件
    console.log(i);
    i = i+1; //更新循環條件
}
View Code

5.do_while:

//無論有沒有知足while中的條件do裏面的代碼都會走一次
var i = 3;//初始化循環變量
do{

    console.log(i)
    i++;//更新循環條件

}while (i<10) //判斷循環條件
View Code

6.for循環:

for(var i = 1;i<=10;i++){
     console.log(i)
 }
View Code

練習:

 1,輸出下面圖形:           
                *  
                ** 
                ***
                ****
                *****
                ******
代碼:
for(var i=1;i<=6;i++){
   for(var j=1;j<=i;j++){
        document.write("*");
   }
                
     document.write('<br>');
}

2,
           *  
         ***  
        ***** 
       ******* 
      ********* 
     ***********    
代碼:
  for(var i=1;i<=6;i++){ //行數
                
                //控制咱們的空格數
                for(var s=i;s<6;s++){
                    document.write('&nbsp;')
                }
            

                for(var j=1;j<=2*i-1;j++){
                    document.write('*')
                }
                document.write('<br>')
                
            }                   
View Code

 7、經常使用內置對象                                                                                                      

數組Array:

1.數組的建立方式:

  • 字面量方式建立(推薦你們使用這種方式,簡單粗暴)
var colors = ['red','color','yellow'];
  • 使用構造函數(後面會講)的方式建立 使用new關鍵詞對構造函數進行建立對象
  var colors2 = new Array();

2.數組的賦值:

var arr = [];
//經過下標進行一一賦值
arr[0] = 123;
arr[1] = '哈哈哈';
arr[2] = '嘿嘿嘿'

3.數組的經常使用方法:

 3.1 數組的合併 concat()

var north = ['北京','山東','天津'];
var south = ['東莞','深圳','上海'];
        
var newCity = north.concat(south);
console.log(newCity)

 3.2 join() 將數組中的元素使用指定的字符串鏈接起來,它會造成一個新的字符串

var score = [98,78,76,100,0];
var str = score.join('|');
console.log(str);//98|78|76|100|0

3.3 將數組轉換成字符串 toString()

var score = [98,78,76,100,0];
//toString() 直接轉換爲字符串  每一個元素之間使用逗號隔開
           
var str = score.toString();
console.log(str);//98,78,76,100,0

3.4 slice(start,end); 返回數組的一段,左閉右開

var arr = ['張三','李四','王文','趙六'];
var newArr  = arr.slice(1,3);
console.log(newArr);//["李四", "王文"]

3.5 pop 移除數組的最後一個元素

var arr = ['張三','李四','王文','趙六'];
var newArr  = arr.pop();
console.log(newArr);//["張三", "李四","王文"]

3.6 push() 向數組最後添加一個元素

var arr = ['張三','李四','王文','趙六'];
var newArr  = arr.push('小馬哥');
console.log(newArr);//["張三", "李四","王文","趙六","小馬哥"]

3.7 reverse() 翻轉數組

var names = ['alex','xiaoma','tanhuang','angle'];
       
//4.反轉數組
names.reverse();
console.log(names);

3.8 sort對數組排序

var names = ['alex','xiaoma','tanhuang','abngel'];
names.sort();
console.log(names);// ["alex", "angle", "tanhuang", "xiaoma"]

 3.9 判斷是否爲數組:isArray()

 布爾類型值 = Array.isArray(被檢測的值) ;

 4.字符串String:

字符串方法

 4.1 chartAt() 返回指定索引的位置的字符

var str = 'alex';
var charset = str.charAt(1);
console.log(charset);//l

4.2 concat 返回字符串值,表示兩個或多個字符串的拼接

var str1 = 'al';
var str2  = 'ex';
console.log(str1.concat(str2,str2));//alexex

4.3 replace(a,b) 將字符串a替換成字符串b

var a = '1234567755';
var newStr = a.replace("4567","****");
console.log(newStr);//123****755

4.4 indexof() 查找字符的下標,若是找到返回字符串的下標,找不到則返回-1 。跟seach()方法用法同樣

var str = 'alex';
console.log(str.indexOf('e'));//2
console.log(str.indexOf('p'));//-1

4.5 slice(start,end) 左閉右開 分割字符串

var str = '小馬哥';
console.log(str.slice(1,2));//馬

4.6 split('a',1) 以字符串a分割字符串,並返回新的數組。若是第二個參數沒寫,表示返回整個數組,若是定義了個數,則返回數組的最大長度

var  str =  '個人天呢,a是嘛,你在說什麼呢?a哈哈哈';
console.log(str.split('a'));//["個人天呢,", "是嘛,你在說什麼呢?", "哈哈哈"]

4.7 substr(statr,end) 左閉右開

var  str =  '個人天呢,a是嘛,你在說什麼呢?a哈哈哈';
console.log(str.substr(0,4));//個人天呢

4.8 toLowerCase()轉小寫

var str = 'XIAOMAGE';
console.log(str.toLowerCase());//xiaomage

4.9 toUpperCase()轉大寫

var str = 'xiaomage';
console.log(str.toUpperCase());

4.10 四捨五入

var newNum = num.toFixed(2)
console.log(newNum)

5.Date日期對象:

建立日期對象只有構造函數一種方式,使用new關鍵字:

var myDate = new Date();

//建立日期對象
var myDate=new Date();
        
//獲取一個月中的某一天
console.log(myDate.getDate());

//返回本地時間
console.log(myDate().toLocalString());//2018/5/27 下午10:36:23

 6.Math 內置對象

經常使用內置對象

 6.1 Math.ceil() 向上取整,'天花板函數'

var x = 1.234;
//天花板函數  表示大於等於 x,而且與它最接近的整數是2
var a = Math.ceil(x);
console.log(a);//2

6.2 Math.floor 向下取整,'地板函數'

var x = 1.234;
// 小於等於 x,而且與它最接近的整數 1
var b = Math.floor(x);
console.log(b);//1

6.3 求兩個數的最大值和最小值

//求 兩個數的最大值 最小值
console.log(Math.max(2,5));//5
console.log(Math.min(2,5));//2

6.4 隨機數 Math.random()

var ran = Math.random();
console.log(ran);[0,1)

 8、函數                                                                                                                           

函數:就是將一些語句進行封裝,而後經過調用的形式,執行這些語句。

函數的做用:

  • 將大量重複的語句寫在函數裏,之後須要這些語句的時候,能夠直接調用函數,避免重複勞動。

  • 簡化編程,讓編程模塊化。

第一步:函數的定義:

函數定義的語法:

function 函數名字(){ }

解釋以下:

  • function:是一個關鍵字。中文是「函數」、「功能」。

  • 函數名字:命名規定和變量的命名規定同樣。只能是字母、數字、下劃線、美圓符號,不能以數字開頭。

  • 參數:後面有一對小括號,裏面是放參數用的。

  • 大括號裏面,是這個函數的語句。

第二步:函數的調用:

函數調用的語法: 函數名字();

函數的參數:形參和實參:

函數的參數包括形參和實參,要保證明際參數和形式參數的個數相同。 

函數的返回值:例子: 

       console.log(sum(3, 4));
        //函數:求和
        function sum(a, b) {
            return a + b;
        }
9、僞數組 arguments                                                                               

 1,返回函數實參的個數:arguments.length

    fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    function fn(a,b,c) {
        console.log(arguments);
        console.log(fn.length);         //獲取形參的個數
        console.log(arguments.length);  //獲取實參的個數
     console.log("----------------");
    }

 

(2)之因此說arguments是僞數組,是由於:arguments能夠修改元素,但不能改變數組的長短。舉例:

  fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    function fn(a,b) {
        arguments[0] = 99;  //將實參的第一個數改成99
        arguments.push(8);  //此方法不經過,由於沒法增長元素
    }
View Code

清空數組的幾種方式:

   var array = [1,2,3,4,5,6];

    array.splice(0);      //方式1:刪除數組中全部項目
    array.length = 0;     //方式1:length屬性能夠賦值,在其它語言中length是隻讀
    array = []; 

 10、關於DOM的事件操做:                                                                                                

事件的三要素:事件源、事件、事件驅動程序。

總結以下:

  • 事件源:引起後續事件的html標籤。

  • 事件:js已經定義好了(見下圖)。

  • 事件驅動程序:對樣式和html的操做。也就是DOM。 

代碼書寫步驟以下:(重要)

  • (1)獲取事件源:document.getElementById(「box」);

  • (2)綁定事件: 事件源box.事件onclick = function(){ 事件驅動程序 };

  • (3)書寫事件驅動程序:關於DOM的操做 

<body>
<div id="box1"></div>

<script type="text/javascript">
    // 一、獲取事件源
    var div = document.getElementById("box1");
    // 二、綁定事件
    div.onclick = function () {
        // 三、書寫事件驅動程序
        alert("我是彈出的內容");
    }
</script>

</body>
代碼

常見事件以下:

一、獲取事件源的方式(DOM節點的獲取):

var div1 = document.getElementById("box1");      //方式一:經過id獲取單個標籤
 
var arr1 = document.getElementsByTagName("div");     //方式二:經過 標籤名 得到 標籤數組,因此有s
 
var arr2 = document.getElementsByClassName("hehe");  //方式三:經過 類名 得到 標籤數組,因此有s
獲取事件源

二、綁定事件的方式(三種):

方式一:直接綁定匿名函數

<div id="box1" ></div>

<script type="text/javascript">
    var div1 = document.getElementById("box1");
    //綁定事件的第一種方式
    div1.onclick = function () {
        alert("我是彈出的內容");
    }
</script>

方式二:先單獨定義函數,再綁定

 <div id="box1" ></div>

<script type="text/javascript">
    var div1 = document.getElementById("box1");
    //綁定事件的第二種方式
    div1.onclick = fn;   //注意,這裏是fn,不是fn()。fn()指的是返回值。
    //單獨定義函數
    function fn() {
        alert("我是彈出的內容");
    }
</script>
注意上方代碼的註釋。綁定的時候,是寫fn,不是寫fn()。fn表明的是整個函數,而fn()表明的是返回值。

方式三:行內綁定
<div id="box1" onclick="fn()"></div>

<script type="text/javascript">

    function fn() {
        alert("我是彈出的內容");
    }

</script>
V綁定事件的三種方式

三、事件驅動程序:

 <style>
        #box {
            width: 100px;
            height: 100px;
            background-color: pink;
            cursor: pointer;
        }
    </style>
</head>

<body>

<div id="box" ></div>

<script type="text/javascript">
    var oDiv = document.getElementById("box");
    //點擊鼠標時,本來粉色的div變大了,背景變紅了
    oDiv.onclick = function () {
        oDiv.style.width = "200px";   //屬性值要寫引號
        oDiv.style.height = "200px";
        oDiv.style.backgroundColor = "red";   //屬性名是backgroundColor,不是background-Color
    }
</script>
V事件驅動

onload事件    

當頁面加載(文本和圖片)完畢的時候,觸發onload事件。

舉例:

<script type="text/javascript">
    window.onload = function () {
        console.log("111");  //等頁面加載完畢時,打印字符串
    }
</script>

有一點咱們要知道:js的加載是和html同步加載的。所以,若是使用元素在定義元素以前,容易報錯。這個時候,onload事件就能派上用場了,咱們能夠把使用元素的代碼放在onload裏,就能保證這段代碼是最後執行。

建議是:整個頁面上全部元素加載完畢在執行js內容。因此,window.onload能夠預防使用標籤在定義標籤以前。

事件案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        .top-banner{
            /*position: relative;*/
            background-color: rgb(230, 15, 82);
        }
        .top-banner .w{
            width: 1190px;
            position: relative;
            margin: 0 auto;
        }
        .top-banner .banner{
            display: block;
            width: 100%;
            height: 80px;
            background: url('./close.jpg') no-repeat center 0;
        }
        .top-banner .close{
            position: absolute;
            right: 0;
            top:0;
            text-decoration: none;
            color: white;    
            width: 20px;
            height: 20px;
            line-height: 20px;
            text-align: center;    
        }
        .hide{
            display: none;
        }

    </style>
</head>
<body>
    <div class="top-banner" id="topBanner">
        <div class="w">
            <a href="#" class="banner"></a>
            <a href="#" class="close" id="closeBanner">x</a>
        </div>
    </div>
    <script type="text/javascript">
        // /需求:點擊案例,隱藏盒子。
            //思路:點擊a連接,讓top-banner這個盒子隱藏起來(加隱藏類名)。

        window.onload  = function(){
            // /1.獲取事件源和相關元素
            var closeBanner = document.getElementById('closeBanner');
            var topBanner = document.getElementById('topBanner');
            //2.綁定事件
            closeBanner.onclick = function(){
                //3.書寫事件驅動程序
                        //類控制
                //topBanner.className += ' hide';//保留原類名,添加新類名
                //topBanner.className = 'hide';
                //替換舊類名
                topBanner.style.display = 'none';
            }
        }
    </script>

    
</body>
</html>
京東頂部廣告欄
要求實現效果:當鼠標懸停在img上時,更換爲另一張圖片;鼠標離開時,還原爲原本的圖片。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script>
        //window.onload頁面加載完畢之後再執行此代碼
        window.onload = function () {
            //需求:鼠標放到img上,更換爲另外一張圖片,也就是修改路徑(src的值)。
            //步驟:
            //1.獲取事件源
            //2.綁定事件
            //3.書寫事件驅動程序

            //1.獲取事件源
            var img = document.getElementById("box");
            //2.綁定事件(懸停事件:鼠標進入到事件源中當即出發事件)
            img.onmouseover = function () {
                //3.書寫事件驅動程序(修改src)
                img.src = "image/jd2.png";
//                this.src = "image/jd2.png";
            }

            //1.獲取事件源
            var img = document.getElementById("box");
            //2.綁定事件(懸停事件:鼠標進入到事件源中當即出發事件)
            img.onmouseout = function () {
                //3.書寫事件驅動程序(修改src)
                img.src = "image/jd1.png";
            }
        }
    </script>
</head>
<body>

    <img id="box" src="image/jd1.png" style="cursor: pointer;border: 1px solid #ccc;"/>

</body>
</html>
V鼠標懸停切換背景

 11、DOM介紹                                                                                                    

DOM:文檔對象模型,爲文檔提供告終構化表示,並定義瞭如何經過腳原本訪問文檔結構。目的就是爲了讓js操做html元素而制定的一個規範。

 

解析過程:HTML加載完畢,渲染引擎會在內存中把HTML文檔生成一個DOM樹,getElementById是獲取DOM上的元素節點,而後操做的時候修改的是該元素的屬性。

DOM樹(一切都是節點):

 

上圖可知,在HTML當中,一切都是節點:(很是重要)

  • 元素節點:HMTL標籤。

  • 文本節點:標籤中的文字(好比標籤之間的空格、換行)

  • 屬性節點::標籤的屬性。

整個html文檔就是一個文檔節點。全部的節點都是Object。 

DOM能夠作什麼:

找對象(元素節點,); 2,設置元素的屬性值;3,設置元素的樣式;4,動態建立和刪除元素;5,事件的觸發響應:事件源、事件、事件的驅動程序。

DOM訪問關係的獲取:

DOM的節點並非孤立的,所以能夠經過DOM節點之間的相對關係對它們進行訪問。

JS中的父子兄訪問關係:

這裏咱們要重點知道parentNodechildren這兩個屬性的用法。 

獲取父節點:調用者就是節點。一個節點只有一個父節點,調用方式就是

    節點.parentNode

(1)nextSibling:

     指的是下一個節點(包括標籤、空文檔和換行節點)

  • 火狐、谷歌、IE9+版本:都指的是下一個節點(包括標籤、空文檔和換行節點)。

  • IE678版本:指下一個元素節點(標籤)。

(2)nextElementSibling:

  • 火狐、谷歌、IE9+版本:都指的是下一個元素節點(標籤)。

總結:爲了獲取下一個元素節點,咱們能夠這樣作:在IE678中用nextSibling,在火狐谷歌IE9+之後用nextElementSibling,因而,綜合這兩個屬性,能夠這樣寫:

下一個兄弟節點 = 節點.nextElementSibling || 節點.nextSibling

previous的中文是: 前一個

(1)previousSibling:

  • 火狐、谷歌、IE9+版本:都指的是前一個節點(包括標籤、空文檔和換行節點)。

  • IE678版本:指前一個元素節點(標籤)。

(2)previousElementSibling:

  • 火狐、谷歌、IE9+版本:都指的是前一個元素節點(標籤)。

總結:爲了獲取前一個元素節點,咱們能夠這樣作:在IE678中用previousSibling,在火狐谷歌IE9+之後用previousElementSibling,因而,綜合這兩個屬性,能夠這樣寫:

 前一個兄弟節點 = 節點.previousElementSibling || 節點.previousSibling

三、補充:得到任意一個兄弟節點:

節點本身.parentNode.children[index];  //隨意獲得兄弟節點

獲取單個的子節點:

一、第一個子節點 | 第一個子元素節點

(1)firstChild:

  • 火狐、谷歌、IE9+版本:都指的是第一個子節點(包括標籤、空文檔和換行節點)。

  • IE678版本:指第一個子元素節點(標籤)。

(2)firstElementChild:

  • 火狐、谷歌、IE9+版本:都指的是第一個子元素節點(標籤)。

總結:爲了獲取第一個子元素節點,咱們能夠這樣作:在IE678中用firstChild,在火狐谷歌IE9+之後用firstElementChild,因而,綜合這兩個屬性,能夠這樣寫:

 第一個子元素節點 = 節點.firstElementChild || 節點.firstChild

二、最後一個子節點 | 最後一個子元素節點

(1)lastChild:

  • 火狐、谷歌、IE9+版本:都指的是最後一個子節點(包括標籤、空文檔和換行節點)。

  • IE678版本:指最後一個子元素節點(標籤)。

(2)lastElementChild:

  • 火狐、谷歌、IE9+版本:都指的是最後一個子元素節點(標籤)。

總結:爲了獲取最後一個子元素節點,咱們能夠這樣作:在IE678中用lastChild,在火狐谷歌IE9+之後用lastElementChild,因而,綜合這兩個屬性,能夠這樣寫:

 最後一個子元素節點 = 節點.lastElementChild || 節點.lastChild

獲取全部的子節點:

(1)childNodes:標準屬性。返回的是指定元素的子節點的集合(包括元素節點、全部屬性、文本節點)。是W3C的親兒子。

  • 火狐 谷歌等高本版會把換行也看作是子節點。(瞭解)

用法:

子節點數組 = 父節點.childNodes;   //獲取全部節點。

(2)children:非標準屬性。返回的是指定元素的子元素節點的集合。【重要】

  • 它只返回HTML節點,甚至不返回文本節點。
  • 在IE6/7/8中包含註釋節點(在IE678中,註釋節點不要寫在裏面)。

雖然不是標準的DOM屬性,但它和innerHTML方法同樣,獲得了幾乎全部瀏覽器的支持。

用法:(用的最多

子節點數組 = 父節點.children;   //獲取全部節點。用的最多。

建立節點:

新的標籤(元素節點) = document.createElement("標籤名");

好比,若是咱們想建立一個li標籤,或者是建立一個不存在的adbc標籤,能夠這樣作:

<script type="text/javascript">
    var a1 = document.createElement("li");   //建立一個li標籤
    var a2 = document.createElement("adbc");   //建立一個不存在的標籤

    console.log(a1);
    console.log(a2);

    console.log(typeof a1);
    console.log(typeof a2);
</script>

結果:

插入節點:插入節點有兩種方式,它們的含義是不一樣的。

方式1:父節點的最後插入一個新的子節點。

 父節點.appendChild(新的子節點);

方式2:

在參考節點前插入一個新的節點;若是參考節點爲null,那麼他將在父節點最後插入一個子節點。

父節點.insertBefore(新的子節點,做爲參考的子節點);

刪除節點:用父節點刪除子節點。必需要指定是刪除哪一個子節點。

  父節點.removeChild(子節點);

若是我想刪除本身這個節點,能夠這麼作:

node1.parentNode.removeChild(node1);

複製節點(克隆節點):

  要複製的節點.cloneNode();       //括號裏不帶參數和帶參數false,效果是同樣的。

  要複製的節點.cloneNode(true);

括號裏帶不帶參數,效果是不一樣的。解釋以下:

  • 不帶參數/帶參數false:只複製節點自己,不復制子節點。

  • 帶參數true:既複製節點自己,也複製其全部的子節點。 

設置節點的屬性:

咱們能夠獲取節點的屬性值、設置節點的屬性值、刪除節點的屬性。

一、獲取節點的屬性值

方式1:

    元素節點.屬性;
    元素節點[屬性];

舉例:(獲取節點的屬性值)

<body>
<img src="images/1.jpg" class="image-box" title="美女圖片" alt="地鐵一瞥" id="a1">

<script type="text/javascript">
    var myNode = document.getElementsByTagName("img")[0];

    console.log(myNode.src);
    console.log(myNode.className);    //注意,是className,不是class
    console.log(myNode.title);

    console.log("------------");

    console.log(myNode["src"]);
    console.log(myNode["className"]); //注意,是className,不是class
    console.log(myNode["title"]);
</script>
</body>
View Code

方式2:(推薦)

素節點.getAttribute("屬性名稱");

例子:

    console.log(myNode.getAttribute("src"));
    console.log(myNode.getAttribute("class"));   //注意是class,不是className
    console.log(myNode.getAttribute("title"));

方式1和方式2的區別在於:前者是直接操做標籤,後者是把標籤做爲DOM節點。推薦方式2。

二、設置節點的屬性值

方式1舉例:(設置節點的屬性值)

    myNode.src = "images/2.jpg"   //修改src的屬性值
    myNode.className = "image2-box";  //修改class的name

方式2:(推薦)

 元素節點.setAttribute(屬性名, 新的屬性值);

方式2舉例:(設置節點的屬性值) 

    myNode.setAttribute("src","images/3.jpg");
    myNode.setAttribute("class","image3-box");
    myNode.setAttribute("id","你好");

三、刪除節點的屬性:

    元素節點.removeAttribute(屬性名);

舉例:(刪除節點的屬性)

    myNode.removeAttribute("class");
    myNode.removeAttribute("id");
  12、關於DOM操做的相關案例                                                                                         

1.模態框案例:

需求: 打開網頁時有一個普通的按鈕,點擊當前按鈕顯示一個背景圖,中心並彈出一個彈出框,點擊X的時候會關閉當前的模態框。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            html,body{
                height: 100%;
            }
            #box{
                width: 100%;
                height: 100%;
                background: rgba(0,0,0,.3);
            }
            #content{
                position: relative;
                top: 150px;
                width: 400px;
                height: 200px;
                line-height: 200px;
                text-align: center;
                color: red;
                background-color: #fff;
                margin: auto;
            }
            #span1{
                position: absolute;
                background-color: red;
                top: 0;
                right: 0;
                width: 30px;
                height: 30px;
                line-height: 30px;
                text-align: center;
                color: #fff;

            }
        </style>
    </head>
    <body>
        <button id="btn">彈出</button>
    </body>
    <script type="text/javascript">
        //獲取dom元素 1.獲取事件源
        var oBtn = document.getElementById('btn');
        //建立彈出模態框的相關DOM對象
        var oDiv = document.createElement('div');
        var oP = document.createElement('p');
        var oSpan = document.createElement('span');
        
        
        // 設置屬性
        oDiv.id = 'box';
        oP.id = 'content'
        oP.innerHTML = '模態框成功彈出'
        oSpan.innerHTML = 'X';
        oSpan.id = 'span1'
        
        // 追加元素
        oDiv.appendChild(oP);
        oP.appendChild(oSpan);

        // 點擊彈出按鈕 彈出模態框
        oBtn.onclick = function(){
            //動態的添加到body中一個div
            this.parentNode.insertBefore(oDiv,oBtn)
            
        }
        // 點擊X 關閉模態框
        oSpan.onclick = function(){
            // 移除oDiv元素
            oDiv.parentNode.removeChild(oDiv)
        }   
        
    </script>
</html>
代碼

2.簡易留言板:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>留言板</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            .close{
                display: inline-block;
                width: 20px;
                height: 20px;
                line-height: 20px;
                text-align: center;
                cursor: pointer;
                background-color: rgba(0,0,0,.1);
                margin-left: 20px;
            }
        </style>
    </head>
    <body>
        <h1>簡易留言板</h1>
        <div id="box">
            <!--<ul>
                
            </ul>-->
            
        </div>
        <textarea id="msg"></textarea>
        <input type="button" id="btn" value="留言"/>
        <button onclick="sum()">統計</button>
    </body>
    <script type="text/javascript">

        // 0 將ul標籤添加到div#box標籤中
        var oUl = document.createElement('ul');
        var oBox = document.getElementById('box');
        oBox.appendChild(oUl);
        
        var oBtn = document.getElementById('btn');
        var oMsg = document.getElementById('msg')
        // 控制留言的總數量
        var count = 0;
        oBtn.onclick = function(){
            
            
            // 點擊留言按鈕事件操做
            // 1.建立li標籤
            var oLi = document.createElement('li');        
            //2.設置內容
            oLi.innerHTML = oMsg.value + "<span class='close'>X</span>"
            
            // 3.若是想在插入的第一個li獲取的前面繼續添加li標籤
            //3.1獲取li標籤
            var olis = document.getElementsByTagName('li');
             //3.2 若是是第一次添加的li標籤,則直接添加到ul的後面
            if(olis.length == 0){
                oUl.appendChild(oLi);
                count++;
                
            }else{
                // 3.3 若是不是第一次添加的li標籤,則插入到第一個li標籤的前面
                oUl.insertBefore(oLi,olis[0]);
                count++;
            }
            // 4.添加完成以後 清空textarea的值
            oMsg.value = '';
            
            
            // 5.點擊X的時候刪除當前的一條數據
            //5.1先獲取全部的X
            var oSpans = document.getElementsByTagName('span');
            
            // 5.2for循環 對全部的X添加點擊事件
            for(var i = 0; i< oSpans.length; i++){
                oSpans[i].onclick  = function(){
                    // 5.3 移除當前的li標籤
                    oUl.removeChild(this.parentNode)
                    count--;
                }
            }
        
            
        }
    
        function sum(){
            alert('一共發佈了'+count+'條留言');
            
        }
    </script>
</html>
代碼

3.使用js模擬選擇器中hover:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        button {
            margin: 10px;
            width: 100px;
            height: 40px;
            cursor: pointer;
        }
        .current {
            background-color: red;
        }
    </style>
</head>
<body>
<button>按鈕1</button>
<button>按鈕2</button>
<button>按鈕3</button>
<button>按鈕4</button>
<button>按鈕5</button>

<script>
    //需求:鼠標放到哪一個button上,改button變成黃色背景(添加類)


    var btnArr = document.getElementsByTagName("button");
    //綁定事件
    for(var i=0;i<btnArr.length;i++){   //要爲每個按鈕綁定事件,因此用到了for循環
        btnArr[i].onmouseover = function () {
            //【重要】排他思想:先把全部按鈕的className設置爲空,而後把我(this)這個按鈕的className設置爲current
            //排他思想和for循環連用
            for(var j=0;j<btnArr.length;j++){
                btnArr[j].className = "";
            }
            this.className = "current";  //【重要】核心代碼
        }
    }

    //鼠標離開current時,還原背景色
    for(var i=0;i<btnArr.length;i++){   //要爲每個按鈕綁定事件,因此用到了for循環
        btnArr[i].onmouseout = function () { //鼠標離開任何一個按鈕時,就把按鈕的背景色還原
            this.className = "";
        }
    }

</script>

</body>


</html>

代碼解釋:

鼠標懸停時,current欄變色,這裏用到了排他思想:先把全部按鈕的className設置爲空,而後把我(this)這個按鈕的className設置爲current,就能夠達到變色的效果。核心代碼是:
//排他思想:先把全部按鈕的className設置爲空,而後把我(this)這個按鈕的className設置爲current
            //排他思想和for循環連用
            for(var j=0;j<btnArr.length;j++){
                btnArr[j].className = "";
            }
            this.className = "current";
代碼

4.tab欄選項卡:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            ul{
                list-style: none;
            }
            #tab{
                width: 480px;
                margin: 20px auto;
                border: 1px solid red;
            }
            ul{
                width: 100%;
                overflow: hidden;
            }
            ul li{
                float: left;
                width: 160px;
                height: 60px;
                line-height: 60px;
                text-align: center;
                background-color: #cccccc;
            }
            
            ul li a{
                text-decoration: none;
                color:black;
            }
            li.active{
                background-color: red;
            }
            p{
                display: none;
                height: 200px;
                text-align: center;
                line-height: 200px;
                background-color: red;
            }
            p.active{
                display: block;
                
            }
            
        </style>
    </head>
    <body>
        <div id="tab">
            <ul>
                <li class="active">
                    <a href="#">首頁</a>
                </li>
                <li>
                    <a href="#">新聞</a>
                </li>
                <li>
                    <a href="#">圖片</a>
                </li>        
            </ul>
            <p class="active">首頁內容</p>
            <p>新聞內容</p>
            <p>圖片內容</p>
            
            
        </div>
    </body>
    <script type="text/javascript">
        window.onload = function(){
            // //需求:鼠標放到上面的li上,li自己變色(添加類),對應的p也顯示出來(添加類);
                    //思路:1.點亮上面的盒子。   2.利用索引值顯示下面的盒子。

            var tabli = document.getElementsByTagName('li');
            var tabContent = document.getElementsByTagName('p')
        
            for(var i = 0; i < tabli.length; i++){
                // 綁定索引值(新增一個自定義屬性:index屬性)
                tabli[i].index  = i;
                tabli[i].onclick = function(){
                    
                    // 1.點亮上面的盒子。   2.利用索引值顯示下面的盒子。(排他思想)
                    for(var j = 0; j < tabli.length; j++){
                        tabli[j].className = '';
                        tabContent[j].className = '';
                    }    
                    this.className = 'active'
                    
                    tabContent[this.index].className = 'active';//【重要代碼】
                }
        }
        }
        
    </script>
</html>
代碼

 五、購物車案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        .box{
            width: 500px;
            height: 400px;
            margin: 100px auto;
            background-color: rgba(255,255,255,0.4);
            position: relative;
            
        }
        .car{
            width: 150px;
            height: 30px;
            background-color: #fff;
            padding-left: 30px;
            position: absolute;
            left: 130px;
            top: 3px;
            z-index: 3;
            border: 1px solid green;

        }
        .shop{
            width: 310px;
            height: 70px;
            background-color: #fff;
            position: absolute;
            top:33px;
            left: 0;
            display: none;

        }
        div.c{
            
            border-bottom-width: 0;
            
        }
        div.t{
            border:  1px solid green;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="car" id="myCar">個人購物車</div>
        <div class="shop t" id="shop"></div>
    </div>
    <script type="text/javascript">
        var myCar =  document.getElementById('myCar');
        var shop  = document.getElementById('shop');
        myCar.onmouseover = function(){
            shop.style.display = 'block';
            myCar.className +=' c';
        }
        myCar.onmouseout = function(){
            shop.style.display = 'none';
            myCar.removeAttribute('class');
            myCar.className = 'car';
        }
    </script>
</body>
</html>
V代碼

 十3、js中的面向對象                                                                                                                          

建立對象的幾種經常使用方式:

  1.使用Object或對象字面量建立對象

  2.工廠模式建立對象

  3.構造函數模式建立對象

  4.原型模式建立對象

1.使用Object或對象字面量建立對象:
JS中最基本建立對象的方式:

var student = new Object();
student.name = "easy";
student.age = "20";

這樣,一個student對象就建立完畢,擁有2個屬性name以及age,分別賦值爲"easy"和20。若是你嫌這種方法有一種封裝性不良的感受。來一個對象字面量方式建立對象。

var sutdent = {
name : "easy",
age : 20
};

這樣看起來彷佛就完美了。可是立刻咱們就會發現一個十分尖銳的問題:當咱們要建立同類的student1,student2,…,studentn時,咱們不得不將以上的代碼重複n次....

var sutdent1 = {
name : "easy1",
age : 20
};

var sutdent2 = {
name : "easy2",
age : 20
};

...

var sutdentn = {
name : "easyn",
age : 20
};

有個提問?能不能像工廠車間那樣,有一個車牀就不斷生產出對象呢?咱們看」工廠模式」。

2.工廠模式建立對象:
JS中沒有類的概念,那麼咱們不妨就使用一種函數將以上對象建立過程封裝起來以便於重複調用,同時能夠給出特定接口來初始化對象:

function createStudent(name, age) {
var obj = new Object();
obj.name = name;
obj.age = age;
return obj;
}

var student1 = createStudent("easy1", 20);
var student2 = createStudent("easy2", 20);
...
var studentn = createStudent("easyn", 20);

這樣一來咱們就能夠經過createStudent函數源源不斷地」生產」對象了。看起來已經高枕無憂了,但貪婪的人類總有不知足於現狀的天性:咱們不只但願」產品」的生產能夠像工廠車間通常源源不斷,咱們還想知道生產的產品到底是哪種類型的。

好比說,咱們同時又定義了」生產」水果對象的createFruit()函數:

function createFruit(name, color) {
var obj = new Object();
obj.name = name;
obj.color = color;
return obj;
}

var v1 = createStudent("easy1", 20);
var v2 = createFruit("apple", "green");

對於以上代碼建立的對象v一、v2,咱們用instanceof操做符去檢測,他們通通都是Object類型。咱們的固然不知足於此,咱們但願v1是Student類型的,而v2是Fruit類型的。爲了實現這個目標,咱們能夠用自定義構造函數的方法來建立對象

3.構造函數模式建立對象:
在上面建立Object這樣的原生對象的時候,咱們就使用過其構造函數:

var obj = new Object();

在建立原生數組Array類型對象時也使用過其構造函數:

var arr = new Array(10); //構造一個初始長度爲10的數組對象

在進行自定義構造函數建立對象以前,咱們首先了解一下構造函數和普通函數有什麼區別。

一、實際上並不存在建立構造函數的特殊語法,其與普通函數惟一的區別在於調用方法。對於任意函數,使用new操做符調用,那麼它就是構造函數;不使用new操做符調用,那麼它就是普通函數。

二、按照慣例,咱們約定構造函數名以大寫字母開頭,普通函數以小寫字母開頭,這樣有利於顯性區分兩者。例如上面的new Array(),new Object()。

三、使用new操做符調用構造函數時,會經歷(1)建立一個新對象;(2)將構造函數做用域賦給新對象(使this指向該新對象);(3)執行構造函數代碼;(4)返回新對象;4個階段。

ok,瞭解了構造函數和普通函數的區別以後,咱們使用構造函數將工廠模式的函數重寫,並添加一個方法屬性:

function Student(name, age) {
this.name = name;
this.age = age;
this.alertName = function(){
alert(this.name)
};
}

function Fruit(name, color) {
this.name = name;
this.color = color;
this.alertName = function(){
alert(this.name)
};
}

這樣咱們再分別建立Student和Fruit的對象:

var v1 = new Student("easy", 20);
var v2 = new Fruit("apple", "green");

這時咱們再來用instanceof操做符來檢測以上對象類型就能夠區分出Student以及Fruit了:

alert(v1 instanceof Student); //true
alert(v2 instanceof Student); //false
alert(v1 instanceof Fruit); //false
alert(v2 instanceof Fruit); //true

alert(v1 instanceof Object); //true 任何對象均繼承自Object
alert(v2 instanceof Object); //true 任何對象均繼承自Object

這樣咱們就解決了工廠模式沒法區分對象類型的尷尬。那麼使用構造方法來建立對象是否已經完美了呢?使用構造器函數一般在js中咱們來建立對象。

咱們會發現Student和Fruit對象中共有一樣的方法,當咱們進行調用的時候這無疑是內存的消耗。

咱們徹底能夠在執行該函數的時候再這樣作,辦法是將對象方法移到構造函數外部:

function Student(name, age) {
this.name = name;
this.age = age;
this.alertName = alertName;
}

function alertName() {
alert(this.name);
}

var stu1 = new Student("easy1", 20);
var stu2 = new Student("easy2", 20);

在調用stu1.alertName()時,this對象才被綁定到stu1上。

咱們經過將alertName()函數定義爲全局函數,這樣對象中的alertName屬性則被設置爲指向該全局函數的指針。由此stu1和stu2共享了該全局函數,解決了內存浪費的問題

可是,經過全局函數的方式解決對象內部共享的問題,終究不像一個好的解決方法。若是這樣定義的全局函數多了,咱們想要將自定義對象封裝的初衷便幾乎沒法實現了。更好的方案是經過原型對象模式來解決。

4.原型的模式建立對象:
原型鏈甚至原型繼承,是整個JS中最難的一部分也是最很差理解的一部分,在這裏因爲咱們課程定位的緣由,若是對js有興趣的同窗,能夠去查閱一下相關JS原型的一些知識點。更加有助於你之後前端JS的面試。

function Student() {
this.name = 'easy';
this.age = 20;
}

Student.prototype.alertName = function(){
alert(this.name);
};

var stu1 = new Student();
var stu2 = new Student();

stu1.alertName(); //easy
stu2.alertName(); //easy

alert(stu1.alertName == stu2.alertName); //true 兩者共享同一函數

 十4、定時器                                                                                                              

在js中的定時器分兩種:一、setTimeout() 二、setInterval()。

1.setTimeOut():只在指定時間後執行一次 

/定時器 異步運行  
function hello(){  
alert("hello");  
}  
//使用方法名字執行方法  
var t1 = window.setTimeout(hello,1000);  
var t2 = window.setTimeout("hello()",3000);//使用字符串執行方法  
window.clearTimeout(t1);//去掉定時器
View Code

2.setInterval():在指定時間爲週期循環執行

/實時刷新  時間單位爲毫秒  
setInterval('refreshQuery()',8000);   
/* 刷新查詢 */  
function refreshQuery(){  
  console.log('每8秒調一次') 
}
View Code

對於這兩個方法,須要注意的是若是要求在每隔一個固定的時間間隔後就精確地執行某動做,那麼最好使用setInterval,而若是不想因爲連續調用產生互相干擾的問題,尤爲是每次函數的調用須要繁重的計算以及很長的處理時間,那麼最好使用setTimeout。

十5、BOM                                                                                                                 

BOM:Browser Object Model,瀏覽器對象模型。

從上圖也能夠看出:

  • window對象是BOM的頂層(核心)對象,全部對象都是經過它延伸出來的,也能夠稱爲window的子對象。

  • DOM是BOM的一部分。

window對象:

  • window對象是JavaScript中的頂級對象

  • 全局變量、自定義函數也是window對象的屬性和方法。

  • window對象下的屬性和方法調用時,能夠省略window。

 BOM 的常見內置方法和內置對象: 

彈出系統對話框:

好比說,alert(1)window.alert(1)的簡寫,由於它是window的子方法。系統對話框有三種:

    alert();    //不一樣瀏覽器中的外觀是不同的
    confirm();  //兼容很差
    prompt();   //不推薦使用
 打開窗口、關閉窗口:

一、打開窗口:

window.open(url,target)

參數解釋:

  • url:要打開的地址。

  • target:新窗口的位置。能夠是:_blank 、_self、 _parent 父框架。 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        
        <!--行間的js中的open() window不能省略-->
        <button onclick="window.open('https://www.luffycity.com/')">路飛學城</button>
        
        <button>打開百度</button>
        <button onclick="window.close()">關閉</button>
        <button>關閉</button>
        
    </body>
    <script type="text/javascript">
        
        var oBtn = document.getElementsByTagName('button')[1];
        var closeBtn = document.getElementsByTagName('button')[3];
        
        oBtn.onclick = function(){
                      //open('https://www.baidu.com')
            
            //打開空白頁面
            open('about:blank',"_self")
        }
        closeBtn.onclick = function(){
            if(confirm("是否關閉?")){
                close();
            }
        }
        
    </script>
</html>
代碼

location對象    

window.location能夠簡寫成location。location至關於瀏覽器地址欄,能夠將url解析成獨立的片斷。

location對象的屬性:

  • href:跳轉

  • hash 返回url中#後面的內容,包含#

  • host 主機名,包括端口

  • hostname 主機名

  • pathname url中的路徑部分

  • protocol 協議 通常是http、https

  • search 查詢字符串 

location.href屬性舉例

舉例1:點擊盒子時,進行跳轉。 

<body>
<div>smyhvae</div>
<script>

    var div = document.getElementsByTagName("div")[0];

    div.onclick = function () {
        location.href = "http://www.baidu.com";   //點擊div時,跳轉到指定連接
 //     window.open("http://www.baidu.com","_blank");  //方式二
    }

</script>
</body>
View Code

舉例2:5秒後自動跳轉到百度。有時候,當咱們訪問一個不存在的網頁時,會提示5秒後自動跳轉到指定頁面,此時就能夠用到location。 

<script>

    setTimeout(function () {
        location.href = "http://www.baidu.com";
    }, 5000);
</script>
View Code

location對象的方法:

  -- location.reload():從新加載 

setTimeout(function(){
         //3秒以後讓網頁整個刷新
    window.location.reload();
            
            
},3000)
View Code

window.navigator 的一些屬性能夠獲取客戶端的一些信息。

  • userAgent:系統,瀏覽器

  • platform:瀏覽器支持的系統,win/mac/linux

console.log(navigator.userAgent);
console.log(navigator.platform);

history對象:

一、後退:history.back();history.go(-1):0是刷新

二、前進:history.forward();history.go(1)

用的很少;由於瀏覽器中已經自帶了這些功能的按鈕。

 十6、client、offset、scroll系列                                                                                         

client:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .box{
                width: 200px;
                height: 200px;
                position: absolute;
                border: 10px solid red;
                /*margin: 10px 0px 0px 0px;*/
                padding: 80px;
            }
        </style>
    </head>
    <body>
        <div class="box">
            哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
        </div>
    </body>
    <script type="text/javascript">
        /*
         *   clientTop 內容區域到邊框頂部的距離 ,說白了,就是邊框的高度
         *      clientLeft 內容區域到邊框左部的距離,說白了就是邊框的亂度
         *      clientWidth 內容區域+左右padding   可視寬度
         *      clientHeight 內容區域+ 上下padding   可視高度
         * */
        
        var oBox = document.getElementsByClassName('box')[0];
        console.log(oBox.clientTop);
        console.log(oBox.clientLeft);
        console.log(oBox.clientWidth);
        console.log(oBox.clientHeight);   
        
    </script>
    
</html>
代碼

屏幕的可視區域:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    </body>
    <script type="text/javascript">
        
        // 屏幕的可視區域
        window.onload = function(){
            
            // document.documentElement 獲取的是html標籤
            console.log(document.documentElement.clientWidth);
            console.log(document.documentElement.clientHeight);
            // 窗口大小發生變化時,會調用此方法
            window.onresize = function(){    
                console.log(document.documentElement.clientWidth);
                console.log(document.documentElement.clientHeight);
            }
            
            
            
        }
    </script>
</html>
View Code

offset:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
        </style>
        
    </head>
    <body style="height: 2000px">
        <div>
            <div class="wrap" style=" width: 300px;height: 300px;background-color: green">
                <div id="box" style="width: 200px;height: 200px;border: 5px solid red;position: absolute;top:50px;left: 30px;">            
                </div>
            </div>
        </div>
    </body>
    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementById('box')
            /*
             offsetWidth佔位寬  內容+padding+border
             offsetHeight佔位高 
             * offsetTop: 若是盒子沒有設置定位 到body的頂部的距離,若是盒子設置定位,那麼是以父輩爲基準的top值
             * offsetLeft: 若是盒子沒有設置定位 到body的左部的距離,若是盒子設置定位,那麼是以父輩爲基準的left值
             
             * */
            console.log(box.offsetTop)
            console.log(box.offsetLeft)
            console.log(box.offsetWidth)
            console.log(box.offsetHeight)
            
        }
        
    </script>
</html>
代碼

scroll:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{padding: 0;margin: 0;}
        </style>
    </head>
    <body style="width: 2000px;height: 2000px;">
        <div style="height: 200px;background-color: red;"></div>
        <div style="height: 200px;background-color: green;"></div>
        <div style="height: 200px;background-color: yellow;"></div>
        <div style="height: 200px;background-color: blue;"></div>
        <div style="height: 200px;background-color: gray;"></div>
        <div id = 'scroll' style="width: 200px;height: 200px;border: 1px solid red;overflow: auto;padding: 10px;margin: 5px 0px 0px 0px;">
            <p>路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城
                路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城
                路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城
                路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城路飛學城
            </p>
            
        </div>
        
        
    </body>
    <script type="text/javascript">
        
        window.onload = function(){
            
            //實施監聽滾動事件
            window.onscroll = function(){
//                console.log(1111)
//                console.log('上'+document.documentElement.scrollTop)
//                console.log('左'+document.documentElement.scrollLeft)
//                console.log('寬'+document.documentElement.scrollWidth)
//                console.log('高'+document.documentElement.scrollHeight)
                
                
            }
            
            var s = document.getElementById('scroll');
            
            s.onscroll = function(){
//            scrollHeight : 內容的高度+padding  不包含邊框
                console.log('上'+s.scrollTop)
                console.log('左'+s.scrollLeft)
                console.log('寬'+s.scrollWidth)
                console.log('高'+s.scrollHeight)
            }
        }
        
    </script>
</html>
代碼

十7、案例                                                                                                                        

模擬百度導航欄滾動監聽:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        ul{
            list-style: none;
        }
        a{
            text-decoration: none;
        }
        input{
            border: 0;
            outline: none;
        }
        body{
            /*padding-top: 80px;*/
        }
        .header{
            width: 100%;
            height: 70px;
            background-color: black;
            /*display: none;*/
        }
        .w{
            width: 1210px;
            overflow: hidden;
            margin: 0 auto;
        }
        .header ul li{
            float: left;
            width: 242px;
            height: 70px;
            line-height: 70px;
            text-align: center;
            background-color: blue;

        }
        .header ul li a{
            display: block;
            width: 242px;
            height: 70px;
            color: #fff;
        }

        /*固定導航欄*/
        .header-fix{
            width: 100%;
            height: 80px;
            background-color: white;
            box-shadow: 0 0 5px #888;
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            z-index: 99999;
            /*margin-bottom: 10px;*/
        }
        .header-fix .logo{
            float: left;
            width: 117px;
            height: 57px;
            padding-top: 23px;
        }
        .header-fix .fm{
            float: left;
            width: 700px;
            height: 80px;
            margin-left: 100px;
        }
        .fm input[type='text']{
            float: left;
            width: 578px;
            height: 50px;
            border-top: 1px solid #999;
            border-left: 1px solid #999;
            border-bottom: 1px solid #999;
            margin-top: 15px;
            padding-left: 20px;
            font-size: 20px;
        }
        .fm input[type='submit']{
            float: left;
            width: 100px;
            height: 52px;
            background-color: #38f;
            position: relative;
            top: 15px;
            color: #fff;
            line-height: 52px;
            font-size: 18px;
        }
        .box1{
            width: 100%;
            height: 200px;
            background-color: red;
        }
        .box2{
            width: 100%;
            height: 300px;
            background-color: green;
        }

    </style>
</head>
<body style="height: 2000px">
    <div class="header">
        <div class="w">
            <ul>
                <li><a href="#">網站導航</a></li>
                <li><a href="#">網站導航</a></li>
                <li><a href="#">網站導航</a></li>
                <li><a href="#">網站導航</a></li>
                <li><a href="#">網站導航</a></li>
            </ul>
        </div>
    </div>
    <div class="header-fix">
        <div class="w">
            <div class="logo">
                <img src="./logo_top.png" alt="">
            </div>
            <form class="fm">
                <input type="text" name="">
                <input type="submit" name="" value="百度一下">
            </form>
        </div>
    </div>
    <div class="box1"></div>
    <div class="box2"></div>

    <script type="text/javascript">
        window.onload = function(){
            var box2Height = document.getElementsByClassName('box2')[0];
            var fixBox = document.getElementsByClassName('header-fix')[0];
            var headerBox = document.getElementsByClassName('header')[0];

            window.onscroll = function(){
                console.log(box2Height.offsetTop);
                if (document.documentElement.scrollTop >=box2Height.offsetTop) {
                    fixBox.style.display = 'block';
                    document.body.style.paddingTop = '80'+ 'px';
                    headerBox.style.display = 'none';
                }else{
                    fixBox.style.display = 'none';
                    document.body.style.paddingTop = '0'+ 'px';
                    headerBox.style.display = 'block';
                }
            }
        }
    </script>





    
</body>
</html>
代碼
相關文章
相關標籤/搜索