1. 程式人生 > 其它 >在物件的原型上新增方法?

在物件的原型上新增方法?

1.瞭解同源策略和跨域

1.1同源策略

1.什麼是同源

如果兩個頁面的協議,域名和埠都相同,則兩個頁面具有相同的源。

2.什麼是同源策略

同源策略是瀏覽器提供的一個安全功能

通俗的說就是瀏覽器規定A網站的JavaScript不允許和非同源的網站C之間進行資源互動。

1.無法讀取非同源網頁的Cookie、LocalStorage和IndexedDB

2.無法接觸非同源網也的DOM

3.無法向非同源地址傳送Ajax請求

1.2跨域

1.什麼是跨域

同源值的是兩個URL的協議、域名和埠一致,反之、則是跨域

出現跨域的根本原因:瀏覽器的同源策略不允許非同源的URL之間進行資源的互動。

2.瀏覽器對跨域請求的攔截

注意:瀏覽器允許發起跨域請求,但是,跨域請求回來的資料,會被瀏覽器攔截,無法被頁面獲取到!

3.如何實現跨域資料請求

現如今,實現跨域資料請求,最主要的兩種方案,分別是JSONP和CORS。

JSONP:出現的早,相容性好,是前端程式設計師為了解決跨域問題,被迫想出來的一種臨時解決方案。缺點是隻支援GET請求,不支援POST請求。

CORS:出現的較晚,他是W3C標準,屬於跨域Ajax請求的根本解決方案。支援GET和POST請求,缺點是不相容某些低版本的瀏覽器。

2.JSONP

2.1什麼是JSONP

JSONP是JSON的一種“使用模式”,可用於解決主流瀏覽器的跨域資料訪問的問題

2.2 JSONP的實現原理

由於瀏覽器同源策略的限制,網頁中無法通過Ajax請求非同源的介面資料。但是<script>標籤不受瀏覽器同源策略的影響,可以通過src屬性,請求非同源的js指令碼。

因此,JSONP的實現原理,就是通過<script>標籤的src屬性,請求跨域的資料介面,並通過函式呼叫的形式,接收跨域介面響應回來的資料。

2.3自己實現一個簡單的JSONP

 定義一個success回撥函式:

 

 

 通過<script>標籤,請求介面資料:

 

 

 2.4JSONP的缺點

由於JSONP是通過<script>標籤的src屬性,來實現跨域資料獲取的,所以,JSONP只支援GET資料請求,不支援POST請求

注意:JSONP和Ajax之間沒有任何關係,不能把JSONP請求資料的方式叫做Ajax,因為JSONP沒有用到XMLHttpRequest這個物件

2.5jQuery中的JSPNP

jQuery提供了$.ajax()函式,除了可以發起真正的Ajax資料請求之外,還能夠發起JSONP資料請求

 

 

 在預設情況下,使用jQuery發起的JSONP請求,會自動攜帶一個callback=jQueryxxx的引數,jQuery是隨機生成的一個回撥函式名稱

2.6自定義引數及回撥函式名稱

在使用jQuery發起JSONP請求時,如果想要自定義JSONP的引數以及回撥函式,可以通過下面兩種方式來指定:

 

 

 2.7jQuery中JSONP的實現過程

jQuery中的JSONP,也是通過<script>標籤的src屬性實現跨域資料訪問,只不過,jQuery採用的是動態建立和移除<script>標籤方式來發起JSONP資料請求

在發起JSONP請求的時候,動態向<header>中append一個<script>標籤

在JSONP請求成功以後,動態從<heaber>中移除剛才append進去的<script>標籤

3.案例-淘寶搜尋

3.1需要實現的UI效果

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <!-- 匯入頁面的基本樣式 -->
    <link rel="stylesheet" href="./css/search.css" />
    <!-- 匯入 jQuery -->
    <script src="./lib/jquery.js"></script>
  </head>
  <body>
    <div class="container">
      <!-- Logo -->
      <img src="./images/taobao_logo.png" alt="" class="logo" />

      <div class="box">
        <!-- tab 欄 -->
        <div class="tabs">
          <div class="tab-active">寶貝</div>
          <div>店鋪</div>
        </div>
        <!-- 搜尋區域(搜尋框和搜尋按鈕) -->
        <div class="search-box">
          <input type="text" class="ipt" placeholder="請輸入要搜尋的內容" /><button class="btnSearch">
            搜尋
          </button>
        </div>
      </div>
    </div>
  </body>
</html>

 3.2獲取使用者輸入的搜尋關鍵詞

為了獲取到使用者每次按下鍵盤所輸入內容,需要監聽輸入框的keyup事件,示例程式碼如下

 

 

 3.3封裝getSuggestList函式

將獲取搜尋建議列表的程式碼,封裝到getSuggestList函式中,程式碼結構如下

 function getSuggestList(kw) {
        $.ajax({
          url: 'https://suggest.taobao.com/sug?q=' + kw,
          dataType: 'jsonp',
          success: function (res) {
            console.log(res);
          }
        })
      }

3.4渲染建議列表的UI結構

1.定義搜尋建議列表

 

 

 2.定義模板結構

 

 

 3.定義渲染模板結構的函式

 

 

 4.搜尋關鍵詞為空時隱藏搜尋建議列表

 

 

 3.5輸入框的防抖

1.什麼是防抖

防抖策略(debounce)是當事件被觸發後,延遲n秒後在執行回撥,如果在這n秒內事件又被觸發,則重新計時

2.防抖的應用場景

使用者在輸入框中連續輸入一串字元時,可以通過防抖策略,只在輸入完成後,才執行查詢的請求,這樣可以有效減少請求次數,節約資源;

3.實現輸入框防抖

 

 

 3.6快取搜尋的建議列表

1.定義全域性快取物件

 

 2.將搜尋結果儲存到快取物件中

 

 3.優先從快取中獲取搜尋建議

案例全部程式碼

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Document</title>
  <!-- 匯入頁面的基本樣式 -->
  <link rel="stylesheet" href="./css/search.css" />
  <!-- 匯入 jQuery -->
  <script src="./lib/jquery.js"></script>
  <script src="/lib/template-web.js"></script>
</head>

<body>
  <div class="container">
    <!-- Logo -->
    <img src="./images/taobao_logo.png" alt="" class="logo" />

    <div class="box">
      <!-- tab 欄 -->
      <div class="tabs">
        <div class="tab-active">寶貝</div>
        <div>店鋪</div>
      </div>
      <!-- 搜尋區域(搜尋框和搜尋按鈕) -->
      <div class="search-box">
        <input type="text" id="ipt" class="ipt" placeholder="請輸入要搜尋的內容" /><button class="btnSearch">
          搜尋
        </button>
      </div>
      <!-- 搜尋建議列表 -->
      <div id="suggest-list">

      </div>
    </div>
  </div>
  <!-- 模板引擎結構 -->
  <script type="text/html" id="tpl-suggestList">
{{each result}}
  <!-- 搜尋建議項 -->
<div class="suggest-item">{{$value[0]}}</div>
{{/each}}
  </script>

  <script>
    $(function () {
      // 1.定義延時器的ID
      let timer = null
      // 定義全域性快取物件
      let cacheObj = {}

      // 2.定義防抖的函式
      function debounceSearch(kw) {
        timer = setTimeout(function () {
          getSuggestList(kw);
        }, 500)
      }

      // 為輸入框繫結keyup事件
      $('#ipt').on('keyup', function () {
        // 3.清空 timer
        let keywords = $(this).val().trim();
        if (keywords.length <= 0) {
          return $("#suggest-list").empty().hide()
        }

        // 先判斷快取中是否有資料
        if (cacheObj[keywords]) {
          return renderSiggestList(cacheObj[keywords])
        }

        // TODO:獲取搜尋建議列表
        // console.log(keywords);
        // getSuggestList(keywords);
        debounceSearch(keywords)
      })

      function getSuggestList(kw) {
        $.ajax({
          url: 'https://suggest.taobao.com/sug?q=' + kw,
          dataType: 'jsonp',
          success: function (res) {
            // console.log(res);
            renderSiggestList(res)
          }
        })
      }

      // 渲染UI結構
      function renderSiggestList(res) {
        if (res.length <= 0) {
          return $('#suggest-list').empty().hide()
        }
        let htmlStr = template('tpl-suggestList', res)
        $('#suggest-list').html(htmlStr).show()

        // 1.獲取到使用者輸入的內容,當做鍵
        let k = $('#ipt').val().trim()
        // 2.需要將資料作為值進行快取
        cacheObj[k] = res
      }
    })
  </script>
</body>

</html>

4.防抖和節流

4.1節流策略(throttle),故名思義,可以減少一段時間內事件的觸發頻率。

4.2節流的應用場景

1.當滑鼠連續不斷的觸發某個事件,只在單位時間內觸發一次

2.懶載入時要監聽計算滾動條的位置,但不必每次滑動都觸發,可以降低計算的頻率,而不必去浪費CPU資源

4.3節流案例-滑鼠跟隨效果

1.渲染UI結構並美化樣式

 

 2.不使用節流時實現滑鼠跟隨效果

 

 3.節流閥的概念

 

 節流閥為空,表示可以執行下次操作;不為空,表示不能執行下次操作

當前操作執行完,必須將節流閥重置為空,表示可以執行下次操作了

每次執行操作前,必須先判斷節流閥是否為空。

4.使用節流優化滑鼠跟隨效果

 

 

 4.4防抖和節流的區別

防抖:如果事件被頻繁觸發,防抖只能保證只有最有一次觸發生效,前面N多次的觸發都會被忽略

節流:如果事件被頻繁觸發,節流能夠減少事件觸發的頻率,因此,節流是有選擇性的執行一部分事件