JavaScript-前端學習二階段-周5.md

目錄

 

## 一、匿名函數

## 二、閉包

## 三、ajax

## 四、json

## 五、移動端事件

## 六、touch.js


## 一、匿名函數

 

### 1、學過的函數

 

1.  普通函數: function 函數名(){}

 

2.  事件處理函數: onclick = function(){}

 

3.  構造函數: function Tab(){}

 

4.  表達式函數: var 變量名 = function(){}

 

5.  匿名函數: function (){ // 代碼塊 }

 

   ```javascript

   function (){

       console.log(123);

   }

   ```

 

### 2、立即執行函數

 

1. 立即執行函數: immediately invoked function expression 自執行函數

 

2. 優點: 避免全局變量污染 減少不必要的內存浪費

 

   ```javascript

   (function (){

       console.log(1);

   })();

   

   (function (){

       console.log(2);

   }());

   

   // 2. 有參數: 形參: 函數聲明後的括號中    實參: 函數調用的括號中

   (function (a, b){

       console.log(a, b);

   }(10,20));

   

   // 3. 有返回值: return 值

   var s = (function (a, b){

       console.log(a, b);

       return a + b;

   }(10,20));

   console.log(s);

   ```

 

## 二、閉包

 

### 1、閉包概念

>  能夠讀取其他函數內部變量的函數(函數裏面套函數, 內部函數訪問外部函數的變量), 本質上, 將函數內外連接起來的橋樑

 

### 2、閉包特點: 

> 閉包中使用的變量是一隻存儲在內存中, 類似全局變量, 避免全局污染

   ```javascript

   // 1. 閉包:

   function fn(){

       var s = 10;

       return function(){

           console.log(s++);

       }

   }

   // var f = fn(); 

   // console.log(f); // function(){ console.log(s++); }

   // f(); // 10

   // f(); // 11

   // f(); // 12

   // console.log(s); // 全局s 沒有

   

   fn()(); // 10

   fn()(); // 10

   fn()(); // 10

   ```

 

### 2、閉包作用

- 1---解決全局變量i帶來的影響

 

   ```javascript

   var li = document.getElementsByTagName('li');

   console.log(li);

   // for循環執行太快, i最後保留在結束條件

   // 解決全局變量i帶來的影響

   for (var i = 0; i < li.length; i++) {

       (function (s) {

           li[s].onclick = function () {

               alert(s); // 5

           }

       })(i);

   }

   ```

 

- 2---模擬私有變量

 

   ```javascript

   function myName(v){

       var val = v;

       return {

           'sayName': function(){

               console.log(val);

           },

           'setName': function(n){

               val = n;

           }

       }

   }    

   var s = myName('付小朋友');

   console.log(s);

   s.sayName();

   s.setName('付大朋友');

   s.sayName();

   ```

 

## 三、ajax

 

### 1、ajax概念

> asynchronous javascript and xml(異步js和xml), 是一種創建交互式網頁應用的網頁開發技術, 可以快速創建動態性網頁的技術, 是通過和後臺進行少量的數據交互, ajax可以實現網頁的異步更新。 

 

### 2、同步/異步

-  同步:客戶端和服務端進行數據交互的時候, 不可以做其他的事情

- 異步: 客戶端和服務端進行數據交互的時候, 可以做其他的事情

 

### 3、readyState: 5種

- 0: 創建了對象

- 1: 建立了連接

- 2: 發送了請求

- 3: 接收到了這個請求, 並且開始處理, 還沒有處理完成

- 4: 已經處理完成, 並返回響應包

 

### 4、status: 網絡狀態碼

- 1XX: 信息部分

- 2XX: 請求成功, 200 

- 3XX: 請求重定向, 304

- 4XX: 頁面錯誤, 404, 405

- 5XX: 服務器錯誤, 500, 504

 

### 5、ajax創建的過程

 

   1. get請求

 

      1. 創建ajax請求對象

 

      2. 建立連接 ajax.open(請求方式, 請求地址+data, 是否異步);

 

      3. 發送請求 ajax.send();

 

      4. 監聽處理情況

 

         ```javascript

         // 1. 創建ajax請求對象

         var ajax = new XMLHttpRequest(); // http: 超文本傳輸協議  request:請求

         // var ajax = new ActiveXObject('Microsoft.XMLHTTP'); // ie6創建

         

         // 2. 建立連接 ajax.open(請求方式, 請求地址+data, 是否異步);

         // 請求方式: get、post

         // 請求地址+data: 訪問的地址及傳輸的數據, 請求地址?key=value&key=value

         // 是否異步: 布爾值, true---異步   false---同步

         ajax.open('get', 'a.txt?a=1&b=2', true);

         

         // 3. 發送請求 ajax.send();

         ajax.send();

         

         // 4. 監聽處理情況

         ajax.onreadystatechange = function(){

             if(ajax.readyState == 4){// 請求處理完成

                 if(ajax.status == 200){ // 請求成功

                     console.log(ajax.response);

                 }

             }

         }

         ```

 

   2. post請求

 

      1. 創建ajax請求對象

 

      2. 建立連接 ajax.open(請求方式, 請求地址, 是否異步);

 

      3. 設置請求頭\編碼格式:告訴服務器當前提交數據的類型

 

      4. 發送請求 ajax.send(key=value&key=value);

 

      5. 監聽處理情況

 

         ```javascript

         // 1. 創建ajax請求對象

         var ajax = new XMLHttpRequest(); // http: 超文本傳輸協議 request:請求

         

         // 2. 建立連接 ajax.open(請求方式, 請求地址, 是否異步);

         // 請求方式: get、post

         // 請求地址: 訪問的地址及傳輸的數據, 請求地址

         // 是否異步: 布爾值, true---異步   false---同步

         ajax.open('post', 'a.txt', true);

         

         // 2.1 設置請求頭\編碼格式:告訴服務器當前提交數據的類型

         ajax.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');

         

         // 3. 發送請求 ajax.send(key=value&key=value);

         ajax.send('a=1&b=2');

         

         // 4. 監聽處理情況

         ajax.onreadystatechange = function(){

         if(ajax.readyState == 4){// 請求處理完成

             if(ajax.status == 200){ // 請求成功

                 console.log(ajax.response);

             }

         }

         }

         ```

 

   3. Content-type參數

 

      ​        application/x-www-form-urlencoded: 默認, 表單

 

      ​        text/plain: 文本

 

      ​        multiple/form-data: 上傳文件

 

## 四、json

 

### 1、json格式數據:

- 1.json文件後綴: .json

- 2.文件中2種數據格式: []\{}

- 3.key:value,key必須加雙引號

- 4.value只能是簡單數據類型: string\number\boolean\null\{}\[]   函數、undefined、變量不能用  

- 5.string必須要加雙引號

### 2、json數據轉成js數據

- js: {}默認就是完整的js代碼塊

- 方法一:eval(要轉的數據)

- 方法二:JSON.parse(要轉的數據)

```javascript

 myjsKu.ajax({

            'url': 'student.json', //相對html頁面的地址

            'success': function(res) {

                console.log(res); //string類型

                //js中 {}默認就是完整的js代碼塊

                //方法一:eval(要轉的數據),將字符串轉成js代碼並執行其中的js代碼

                // var r = eval(res);//res是字符串--轉成表達式加() 

                var r = eval('(' + res + ')'); //運行字符串中js的代碼

                console.log(r);

                console.log(eval('3+2')); //5

                //方法二、JSON.parse(要轉的數據):json數據轉成js數據

                console.log(JSON.parse(res));

                var r = JSON.parse(res);

                //字符串轉成數組後對其進行遍歷--獲取到每一個學生的信息

                //ajax請求後操作數組的方式

                for (var i = 0; i < r.length; i++) {

                    console.log(r[i]);

                    ul.innerHTML += '<li><span>' + r[i].name + '</span>&nbsp;&nbsp;<span>' + r[i].sex + '</span>&nbsp;&nbsp;&nbsp;&nbsp;<span>' + r[i].age + '</span></li>'

                }

            }

        })

```



 

## 五、移動端事件

 

1. touchstart: 當手指在屏幕上按下的時候

 

2. touchmove: 當手指在屏幕上移動的時候

 

3. touchend: 當手指離開屏幕的時候觸發

 

   ```javascript

   div.ontouchstart = function(){

       console.log('這是點擊touch');

   }

   div.addEventListener('touchmove', function(){

       console.log('touchmove');

   });

   div.addEventListener('touchend', function(){

       console.log('touchend');

   });

   // 注意: 在移動端一般使用事件綁定的方式添加事件

   ```

 

4. pc端事件在移動端中的問題: 有一個300ms的延遲

 

5. 移動端事件問題: 

 

   1. 點透: 當兩個元素疊加在一起,並且下方元素有點擊事件或連接跳轉時, 當上方元素點擊隱藏後,並且點擊事件時間不超過300ms, 事件會漂移到下方元素上, 造成了點透事件

 

   2. ```javascript

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

      div.addEventListener('touchstart', function(){

          div.style.display = 'none';

      });

      ```

    3.解決

    - 阻止默認事件,在 touch 時間的某個階段執行 event.preventDefault() ,去取消系統生成的 click 事件,一半在 touchend 中執行

    - 要消失的元素延時300ms,然後在消失

 

6. 事件對象

 

   1. 事件處理函數的第一個參數

 

   2. ```javascript

      div.addEventListener('touchstart', function(ev){

          console.log(ev); // TouchEvent

          console.log(ev.touches); // 當前位於整個屏幕上的手指列表

          console.log(ev.targetTouches); // 當前位於目標元素上的一個手指列表

          console.log(ev.changedTouches); // 當前事件的手指列表

      

          var touch = ev.changedTouches[0]; // 在事件的手指列表中拿出來第一個手指

          console.log(touch);

          console.log(touch.identifier); // 標識符

          console.log(touch.target); // 目標源

          console.log(touch.screenX, touch.screenY); // 顯示器

          console.log(touch.clientX, touch.clientY); // 到可視區域的左上角

          console.log(touch.pageX, touch.pageY); // 到頁面左上角的距離

          console.log(touch.radiusX, touch.radiusY); // 手指觸發的圓的半徑

          console.log(touch.force); // 壓力的大小

          console.log(touch.rotationAngle); // 旋轉角度

      });

      ```





 

## 六、touch.js

 

1. 介紹: 移動端的手勢識別和事件庫, 百度clouda團隊維護, 在百度內部也是廣泛應用的

 

2. 搜索: touch.js: touch cdn ---> bootcdn 0.2.14

 

3. touch.js: 標準格式版本, 學習

 

   touch.min.js: 壓縮版本, 工作

 

4. 作用: 專門爲移動設備設計, 請在webkit內核中使用

 

5. touch.on()

 

   1. touch.on(elem, type, callback);

 

      ​     elem: 要綁定事件的對象

 

      ​        type: 事件類型

 

      ​        callback: 回調函數

 

      + 給一個元素綁定一個事件

 

      + 給一個元素的同一事件添加不同的處理函數

 

      + 給一個元素不同事件添加同一處理函數

 

      + 給同一元素不同事件添加不同處理函數

 

        ```javascript

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

        // 1. 給一個元素綁定一個事件

        // tap: 單擊

        touch.on(div, 'tap', function (ev) {

            console.log(ev.type);

        });

        function callB(ev){

            console.log('當前事件類型是: ' + ev.type);

        }

        // 2. 給一個元素的同一事件添加不同的處理函數

        touch.on(div, 'tap', callB);

        

        // 3. 給一個元素不同事件添加同一處理函數

        // hold: 長按  doubletap:雙擊事件

        touch.on(div, 'tap hold doubletap', callB);

        

        // 4. 給同一元素不同事件添加不同處理函數

        // touch.on(elem, {'事件類型': 事件處理函數});

        touch.on(div, {

            'hold': function(){

                console.log('1');

            },

            'tap': function(){

                console.log(2);

            }

        });

        ```

 

   2. 事件委託:touch.on(父元素, type, selector, callback)

 

      父元素:父元素\選擇器

 

      type: 事件類型

 

      selector: 子元素的選擇器

 

      callback: 回調函數

 

      ```java

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

      touch.on(div, 'tap', 'span.box,em', function(ev){

          console.log(ev.target);

          console.log(this);

      });

      ```

 

6. 事件對象

 

   ```javascript

   console.log(ev);

   console.log(ev.originEvent); // 原生的事件對象

   console.log(ev.type); // 事件類型

   console.log(ev.rotation); // 旋轉角度

   console.log(ev.scale); // 縮放比例

   console.log(ev.direction); // 操作方向

   console.log(ev.position); // 位置信息

   console.log(ev.distanceX, ev.distanceY); // 手勢事件中滑動事件在橫線和縱向上的偏移量, 以當前點擊開始的位置作爲座標原點,分成四象限, 向上、左是負值, 向下、右是正值

   console.log(ev.angle); // rotate事件觸發的時候, 旋轉的角度

   console.log(ev.duration, '1----'); // 時長(touchstart到touchend)

   ```



 

| 類          | 事件           | 描述         |

| :---------- | -------------- | ------------ |

| 縮放類      | pinchstart     | 縮放手勢起點 |

| pinchend    | 縮放手勢終點   |              |

| pinch       | 縮放手勢       |              |

| pinchin     | 收縮           |              |

| pinchout    | 放大           |              |

| 旋轉類      | rotateleft     | 向左旋轉     |

| rotateright | 向右旋轉       |              |

| rotate      | 旋轉           |              |

| 滑動類      | swipestart     | 滑動手勢起點 |

| swiping     | 滑動中         |              |

| swipeend    | 滑動手勢終點   |              |

| swipeleft   | 向左滑動       |              |

| swiperight  | 向右滑動       |              |

| swipeup     | 向上滑動       |              |

| swipedown   | 向下滑動       |              |

| swipe       | 滑動           |              |

| 拖動類      | dragstart      | 拖動開始     |

| drag        | 拖動           |              |

| dragend     | 拖動結束       |              |

| 長按        | hold           |              |

| 單擊、雙擊  | Tap、doubletap |              |




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章