整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JavaScript對(duì)象

          JavaScript對(duì)象

          avaScript對(duì)象分類

          • 內(nèi)置對(duì)象:包括string,number,boolean等
          • BOM: Browser Object Model, 瀏覽器對(duì)象模型, 包括和瀏覽器相關(guān)的內(nèi)容
          • DOM: Document Object Model, 文檔對(duì)象模型,包括和頁(yè)面標(biāo)簽相關(guān)的內(nèi)容

          BOM瀏覽器對(duì)象模型

          • window: 此對(duì)象里面的屬性和方法稱為全局的屬性和方法,訪問時(shí)可以省略掉window.
          • window中常見的方法:
          1. alert("xxx")彈出提示框
          2. confirm("xxx") 彈出確認(rèn)框
          3. prompt("xxx") 彈出文本框
          4. isNaN(x) 判斷變量是否是
          5. NaNparseInt()和parseFloat() 把字符串轉(zhuǎn)成整數(shù)或小數(shù)
          6. console.log() 控制臺(tái)輸出
          7. let timer=setInterval(方法,時(shí)間間隔) 開啟定時(shí)器
          8. clearInterval(timer) 停止定時(shí)器
          9. setTimeout(方法,時(shí)間間隔) 開啟只執(zhí)行一次的定時(shí)器
          • window對(duì)象中常見的屬性

          location位置

          1. location.href 獲取和修改瀏覽器的請(qǐng)求地址
          2. location.reload() 刷新頁(yè)面

          history歷史

          1. history.length 獲取歷史頁(yè)面數(shù)量
          2. history.back() 返回上一頁(yè)面
          3. history.forward() 前往下一頁(yè)面
          4. history.go(n) n=1是前往下1頁(yè)面 n=-1 返回上一頁(yè)面 n=2 前往下2個(gè)頁(yè)面 n=0代表刷新
          <h1>0</h1>
          <h2>0</h2>
          <script>
              setInterval(f,1000);
              let  i=document.querySelector("h1");
              let count=0;
              function f() {
                  count++;
                  i.innerText=count;
              }
              let num=0;
              let  j=document.querySelector("h2");
              let  timer=setInterval(function () {
                  num++;
                  j.innerText=num;
                  if(num==50){
                      clearInterval(timer)
                  }
              },200)
              //只執(zhí)行一次
              setTimeout(function () {
                  alert("時(shí)間到")
              },5000)
          </script>

          DOM文檔對(duì)象模型

          包含和頁(yè)面元素相關(guān)的內(nèi)容

          • 通過選擇器獲取頁(yè)面中的元素對(duì)象
          1. let 元素對(duì)象=document.querySelector("選擇器")
          • 獲取和修改元素的文本內(nèi)容
          1. 元素對(duì)象.innerText="xxx"; 修改文本內(nèi)容
          2. 元素對(duì)象.innerText 獲取文本內(nèi)容
          • 獲取和修改input控件的值
          1. 控件對(duì)象.value="xxx"; 修改
          2. 控件對(duì)象.value 獲取
          • 創(chuàng)建元素對(duì)象
          1. let 元素對(duì)象=document.createElement("標(biāo)簽名");
          • 添加元素對(duì)象到某個(gè)元素里面
          1. document.body.appendChild(元素對(duì)象);
          2. 父元素.appendChild(元素對(duì)象);
          3. 父元素.append(元素對(duì)象,元素對(duì)象,元素對(duì)象);
          <input type="text" id="i1">
          <input type="button" value="飛機(jī)" onclick="f(1)">
          <input type="button" value="炸彈" onclick="f(2)">
          <script>
              let num=document.querySelector("#i1");
              function f(x) {
                  if(isNaN(num.value)){
                      let error=document.createElement("div");
                      error.innerText="請(qǐng)輸入數(shù)字"
                      document.body.appendChild(error)
                      return;
                  }
                  let imgNum=x==1?"../airplane.png":"../bom3.png";
                  for(i=0;i<num.value;i++){
                      let computer=document.createElement("img");
                      computer.src=imgNum;
                      document.body.append(computer);
                  }
              }
          </script>
          //======--------------=========<input type="text" id="i1" placeholder="姓名">
          <input type="text" id="i2" placeholder="工資">
          <input type="text" id="i3" placeholder="工作">
          <input type="button" value="添加" onclick="f()">
          <table border="1">
              <tr>
                  <th>姓名</th>
                  <th>工資</th>
                  <th>工作</th>
              </tr>
          </table>
          <script>
               //通過標(biāo)簽名獲取table
               let table=document.querySelector("table");
               function f() {
                  //創(chuàng)建 tr 和td
                  let trs=document.createElement("tr")
                  let td_name=document.createElement("td")
                  let td_salary=document.createElement("td")
                  let td_work=document.createElement("td")
                  td_name.innerText=i1.value;
                  td_salary.innerText=i2.value;
                  td_work.innerText=i3.value;
                  //td 裝入 tr
                  trs.append(td_name,td_salary,td_work);
                  //tr 裝進(jìn)table
                  table.append(trs);
              }
          </script>

          什么是 JSON?

          • JSON 英文全稱 JavaScript Object Notation
          • JSON 是一種輕量級(jí)的數(shù)據(jù)交換格式。
          • JSON是獨(dú)立的語(yǔ)言 *
          • JSON 易于理解。

          【注】JSON 使用 JavaScript 語(yǔ)法,但是 JSON 格式僅僅是一個(gè)文本。文本可以被任何編程語(yǔ)言讀取及作為數(shù)據(jù)格式傳遞。

          //json實(shí)例
          {"sites":[
              {"name":"Runoob", "url":"www.runoob.com"}, 
              {"name":"Google", "url":"www.google.com"},
              {"name":"Taobao", "url":"www.taobao.com"}
          ]}

          JSON 語(yǔ)法規(guī)則

          1. 數(shù)據(jù)為 鍵/值 對(duì)。
          2. 數(shù)據(jù)由逗號(hào)分隔。
          3. 大括號(hào)保存對(duì)象
          4. 方括號(hào)保存數(shù)組

          JSON 對(duì)象

          JSON 對(duì)象保存在大括號(hào)內(nèi)。

          //就像在 JavaScript 中, 對(duì)象可以保存多個(gè) 鍵/值 對(duì):
          {"name":"Wong", "url":"www.celinf.cn"}

          JSON函數(shù)

          • JSON.parse() 用于將一個(gè) JSON 字符串轉(zhuǎn)換為 JavaScript 對(duì)象。
          • JSON.stringify() 用于將 JavaScript 值轉(zhuǎn)換為 JSON 字符串。
          var text='{ "sites" : [' +
              '{ "name":"celinf" , "url":"www.celinf.com" },' +
              '{ "name":"Google" , "url":"www.google.com" },' +
              '{ "name":"Taobao" , "url":"www.taobao.com" } ]}';
          obj=JSON.parse(text);
          document.getElementById("demo").innerHTML=obj.sites[1].name + " " + obj.sites[1].url;

          HTML 事件屬性

          • onclick 點(diǎn)擊事件:
          • onload 用戶進(jìn)入頁(yè)面時(shí)被觸發(fā)
          • onunload 用戶離開頁(yè)面時(shí)被觸發(fā)
          • onchange 事件常結(jié)合對(duì)輸入字段的驗(yàn)證來使用。
          //使用 onchange 的例子。當(dāng)用戶改變輸入字段的內(nèi)容時(shí),會(huì)調(diào)用 upperCase() 函數(shù)。
          <input type="text" id="fname" onchange="upperCase()">
          • onmouseover 鼠標(biāo)移至 HTML 元素上方觸發(fā)函數(shù)
          • onmouseout 鼠標(biāo)移出元素時(shí)觸發(fā)函數(shù)。

          練習(xí)Demo

          <table border="1">
              <caption>個(gè)人信息</caption>
              <tr>
                  <td>照片</td>
                  <td><img src="head.jpg" width="50px" alt="" id="head_img"></td>
              </tr>
              <tr>
                  <td>名字:</td>
                  <td id="name_td">XXX</td>
              </tr>
              <tr>
                  <td>年齡:</td>
                  <td id="age_td">XXX</td>
              </tr>
              <tr>
                  <td>好友</td>
                  <td>
                      <ul id="firend_ul">
                      </ul></td>
              </tr>
          </table>
          <input type="button" value="請(qǐng)求數(shù)據(jù)" onclick="f()">
          
          <script>
          let person={name:"張三",url:"../bee.png",age:20,friend:["李四","王五","趙六"]}
              function f() {
                  head_img.src=person.url;
                  name_td.innerText=person.name;
                  age_td.innerText=person.age;
                  for (let p of person.friend) {
                      let li=document.createElement("li")
                      li.innerText=p;
                      firend_ul.append(li)
                  }
              }
          </script>

          學(xué)習(xí)記錄,如有侵權(quán)請(qǐng)聯(lián)系刪除

          覽器對(duì)象

          一、參考資料

          • 瀏覽器對(duì)象模型
          • 聊聊 H5 的 pushState 與 replaceState
          • 用 Javascript 獲取頁(yè)面元素的位置
          • js 獲取操作元素位置

          二、認(rèn)識(shí)瀏覽器運(yùn)行態(tài)下的 js

          1.問:是否了解瀏覽器的執(zhí)行態(tài)(分層設(shè)計(jì))?

          • ECMAScript - 基礎(chǔ)邏輯、數(shù)據(jù)處理,js 語(yǔ)法塊
          • BOM - 瀏覽器本身的能力操作
          • Browser Object Model(瀏覽器對(duì)象模型)
          • 瀏覽器模型提供了獨(dú)立于內(nèi)容的、可以與瀏覽器窗口進(jìn)行滑動(dòng)的對(duì)象結(jié)構(gòu),就是瀏覽器提供的 API
          • DOM - 瀏覽器文本的操作

          2.BOM

          1.location

          提供當(dāng)前窗口中的加載的文檔有關(guān)的信息和一些導(dǎo)航功能。 既是 window 對(duì)象屬性,也是 document 的對(duì)象屬性

          window.location===document.location; //true
          
          // https://www.zhihu.com/search?type=content&q=123
          
          location.href='https://www.zhihu.com/search?type=content&q=123'.origin=// 完整的url
            'https://www.zhihu.com'.host=// 頁(yè)面的標(biāo)準(zhǔn)域名
            'www.zhihu.com'.hash=// 服務(wù)器名稱+端口 例如:‘www.zhihu.com:8080’
            '#hash'.pathname=// url中#號(hào)后面的哈希值
            '/search'.search=// url中[/]后面內(nèi)容
            '?type=content&q=123'.protocol=// url中[?]后面內(nèi)容
            'https:'.port=// 協(xié)議[http:]
              ''; //端口號(hào):[ 80 | 8080 | ... ]
          

          方法:

          1. assign()
          2. 不會(huì)打開新窗口,把請(qǐng)求 url 中的資源,加載到當(dāng)前窗口
          3. 會(huì)給瀏覽器的History中增加一條歷史記錄
          4. replace(url)
          5. 用 url 中的內(nèi)容,替換掉當(dāng)前的 location 資源
          6. 不會(huì)在瀏覽器的History中增加記錄,意味著用戶不能使用回退按鈕
          7. reload()
          8. 重新加載當(dāng)前 url 的內(nèi)容
          9. 當(dāng) reload(true)時(shí),會(huì)強(qiáng)制從服務(wù)器獲取所有內(nèi)容
          10. 若沒有參數(shù),重新加載時(shí),可能從瀏覽器緩存加載頁(yè)面

          拓展方向:

          • location 本身 api 操作
          • assign VS replace 的區(qū)別
          • 解析 url 中的查詢字符串,返回一個(gè)對(duì)象
          • 思路:
          • 可以通過正則的方式獲取,或者通過字符串分割的方式
          • 通過location.search獲取查詢字符串內(nèi)容,如果有[?]就截取[?]后面的內(nèi)容
          • 然后通過[&]進(jìn)行分割成為['key=val1','key=val2']的形式
          • 通過[=]對(duì)數(shù)組進(jìn)行分割,使用decodeURIComponent對(duì) key 和 val 進(jìn)行解碼,存放到對(duì)象中
          • 路由相關(guān): 跳轉(zhuǎn)、參數(shù)、操作
          • 頁(yè)面能否返回(history)
          • 頁(yè)面是否刷新(hash)
          • reload、assign、replace 參數(shù)等
          • URI or URL 的區(qū)別?
          • URI Uniform Resource Identifier - 統(tǒng)一資源標(biāo)識(shí)符
          • URL Uniform Resource Locator - 統(tǒng)一資源定位符

          2.History

          history.state.length; // 當(dāng)前頁(yè)面的狀態(tài) // 返回當(dāng)前 `會(huì)話` 中的 history 個(gè)數(shù)
          

          方法:

          • pushState(state, title, url)
          • 給當(dāng)前的 history 中添加一個(gè)狀態(tài)
          • 瀏覽器地址會(huì)改變,但是不會(huì)加載頁(yè)面,本質(zhì)上頁(yè)面還是停留在原來的頁(yè)面
          • replaceState()
          • 與 pushState 方法類似,但是不會(huì)添加一個(gè)新的 state 到 history 中,而是直接修改當(dāng)前state

          相關(guān)聯(lián)的方法

          • window.onpopstate()
          • 每當(dāng)處于激活狀態(tài)的歷史記錄條目發(fā)生變化時(shí),popstate事件就會(huì)在對(duì)應(yīng) window 對(duì)象上觸發(fā)
          • 調(diào)用history.pushState() 或者 history.replaceState() 不會(huì)觸發(fā) popstate 事件。
          • popstate 事件只會(huì)在瀏覽器某些行為下觸發(fā)
          • 比如點(diǎn)擊后退、前進(jìn)按鈕(或者在 JavaScript 中調(diào)用 history.back()、history.forward()、history.go()方法)

          例子:

          window.onpopstate=function (event) {
            alert(
              'location: ' +
                document.location +
                ', state: ' +
                JSON.stringify(event.state),
            );
          };
          //綁定事件處理函數(shù).
          history.pushState({ page: 1 }, 'title 1', '?page=1'); //添加并激活一個(gè)歷史記錄條目 http://example.com/example.html?page=1,條目索引為1
          history.pushState({ page: 2 }, 'title 2', '?page=2'); //添加并激活一個(gè)歷史記錄條目 http://example.com/example.html?page=2,條目索引為2
          history.replaceState({ page: 3 }, 'title 3', '?page=3'); //修改當(dāng)前激活的歷史記錄條目 http://ex..?page=2 變?yōu)?http://ex..?page=3,條目索引為3
          history.back(); // 彈出 "location: http://example.com/example.html?page=1, state: {"page":1}"
          history.back(); // 彈出 "location: http://example.com/example.html, state: null
          history.go(2); // 彈出 "location: http://example.com/example.html?page=3, state: {"page":3}
          

          3.navigator

          瀏覽器系統(tǒng)信息大集合

          • clipboard
          • 系統(tǒng)剪切板相關(guān)信息
          • userAgent
          • 當(dāng)前用戶的設(shè)備信息
          • onLine
          • 返回瀏覽器的在線狀態(tài)
          • serial
          • 返回串口對(duì)象,Web Serial API 的入口點(diǎn)
          • bluetooth
          • 系統(tǒng)藍(lán)牙相關(guān) …

          4.screen

          用來表示瀏覽器窗口外部的顯示器的信息等

          window.screen.deviceXDPI/deviceYDPI 屏幕實(shí)際的水平 DPI、垂直 DPI

          三、瀏覽器事件

          瀏覽器事件模型主要分為三個(gè)階段:

          • 捕獲階段(IE)
          • 事件由最外層元素(window),層層向內(nèi)傳遞,直到最具體的元素
          • 目標(biāo)階段
          • 冒泡階段(網(wǎng)景)
          • 事件由最具體的元素(事件的觸發(fā)者),層層向外傳遞(傳遞給父節(jié)點(diǎn)),直到 window 對(duì)象停止

          1.addEventListener 第三個(gè)參數(shù)

          el.addEventListener(event, function, useCapture)
          // useCapture默認(rèn)值false,也就是默認(rèn)冒泡
          // true為捕獲階段
          

          2.阻斷事件傳播

          • event.stopPropagation()
          • 阻斷事件的傳播
          • 但是無法阻止默認(rèn)事件
          • event.stopImmediatePropagation()
          • 如果有多個(gè)相同類型的事件監(jiān)聽函數(shù)綁定到同一個(gè)元素
          • 當(dāng)該類型的事件觸發(fā)時(shí),它們會(huì)按照被添加的順序執(zhí)行
          • 如果其中某個(gè)監(jiān)聽函數(shù)執(zhí)行了此方法,則當(dāng)前元素剩下的監(jiān)聽函數(shù)將不會(huì)被執(zhí)行

          3.阻止默認(rèn)行為

          • e.preventDefault()
          • e.preventDefault()可以阻止事件的默認(rèn)行為發(fā)生
          • 默認(rèn)行為是指:點(diǎn)擊 a 標(biāo)簽就轉(zhuǎn)跳到其他頁(yè)面、拖拽一個(gè)圖片到瀏覽器會(huì)自動(dòng)打開、點(diǎn)擊表單的提交按鈕會(huì)提交表單等等,因?yàn)橛械臅r(shí)候我們并不希望發(fā)生這些事情,所以需要阻止默認(rèn)行為

          拓展方向

          性能方向

          • 如:事件委托的運(yùn)用,一個(gè) ul 和多個(gè) li,點(diǎn)擊 li 時(shí),改變背景顏色
          {
            /* 
          <ul class="list">
              <li>1</li>
              <li>2</li>
              <li>3</li>
          </ul>  
          */
          }
          var list=document.querySelector('list');
          
          function onClick(e) {
            var e=e || window.event;
            if (e.target.tagName.toLowerCase()==='li') {
              // 業(yè)務(wù)邏輯...
              e.target.style.backgroundColor='pink';
            }
          }
          
          list.addEventListener('click', onClick, false);
          

          兼容性方向

          • 如:寫一個(gè)兼容 IE 的事件綁定

          先區(qū)別 IE 的不同之處

          • 綁定事件的函數(shù)和傳參不同: 使用 attachEvent綁定,事件名要加on
          • 解綁時(shí)使用的函數(shù)和參數(shù)不同: 使用detachEvent解綁
          • 阻斷時(shí)的不同: event.cancelBubble=true
          • 阻止默認(rèn)行為的不同: event.returnValue=false
          class BindEvent {
            constructor(el) {
              this.el=el;
            }
          
            addEventListener(type, handler) {
              if (this.el.addEventListener) {
                this.el.addEventListener(type, handler, false);
              } else if (this.el.attachEvent) {
                this.el.attachEvent('on' + type, handler);
              } else {
                this.el['on' + type]=handler;
              }
            }
          
            removeEventListener(type, handler) {
              if (this.el.removeEventListener) {
                this.el.removeEventListener(type, handler, false);
              } else if (this.el.detachEvent) {
                this.el.detachEvent('on' + type, handler);
              } else {
                this.el['on' + type]=null;
              }
            }
          
            static stopPropagation() {
              if (e.stopPropagation) {
                e.stopPropagation();
              } else {
                e.cancelBubble=true;
              }
            }
          
            static preventDefault() {
              if (e.preventDefault) {
                e.preventDefault();
              } else {
                e.returnValue=false;
              }
            }
          }
          

          四、網(wǎng)絡(luò)請(qǐng)求

          1.XMLHttpRequest

          • 屬性
          • responseText(服務(wù)端響應(yīng)的文本數(shù)據(jù))
          • responseXML(服務(wù)點(diǎn)響應(yīng)的 xml 或者 html 類型數(shù)據(jù))
          • status(響應(yīng) HTTP 狀態(tài))
          • statusText(響應(yīng) HTTP 狀態(tài)描述)
          • readyState(發(fā)出請(qǐng)求的狀態(tài)碼)對(duì)應(yīng)onreadystatechange事件0:創(chuàng)建成功,但是沒有調(diào)用 open 方法1:open 方法被調(diào)用2:send 方法被調(diào)用3:loading,下載中4:下載操作完成
          • timeout(超時(shí)時(shí)間,對(duì)應(yīng)超時(shí)事件ontimeout,ontimeout 事件被棄用)
          • upload(上傳進(jìn)度)
          • 方法
          • open() 初始化請(qǐng)求(method, url, async),async 表示是否異步操作,默認(rèn) true
          • send() 發(fā)送請(qǐng)求數(shù)據(jù),get 請(qǐng)求時(shí),send 可以不傳或者 null
          • abort() 中止已經(jīng)發(fā)出的請(qǐng)求
          • setRequestHeader() 設(shè)置請(qǐng)求頭信息
          • getRequestHeader() 獲取指定響應(yīng)頭信息
          • getAllResponseHeaders() 獲取所有響應(yīng)頭信息

          封裝 XMLHttpRequest 請(qǐng)求

          function ajax({ method='get', url='', params=undefined }) {
            return new Promise((resolve, reject)=> {
              let xhr=new XMLHttpRequest();
              if (method.toLowerCase()==='get' && params !==undefined) {
                url=url + '?' + params;
              }
              xhr.open(method, url, true);
              xhr.onreadystatechange=function () {
                if (xhr.readyState===4) {
                  if (xhr.status===200) {
                    resolve(xhr.responseText);
                  } else {
                    reject(xhr.status);
                  }
                }
              };
          
              if (method.toLocaleLowerCase()==='get') {
                xhr.send();
              } else {
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                xhr.send(params);
              }
          
              xhr.onerror=(err)=> reject(err);
              xhr.timeout=()=> reject('timeout');
          
              // progress事件可以報(bào)告長(zhǎng)時(shí)間運(yùn)行的文件上傳
              xhr.upload.onprogress=(p)=> {
                console.log(Math.round((p.loaded / p.total) * 100) + '%');
              };
            });
          }
          

          2.fetch

          • 方法:fetch(url,{}| init 對(duì)象 ),返回 Promise 對(duì)象,只支持異步
          • 響應(yīng)通過 response 對(duì)象獲取:
          • fetch().then((response)=>{}).catch(()=>{})
          • response 對(duì)象混入了 body,提供了 5 個(gè)方法,將 ReadableStream 轉(zhuǎn)存到緩沖區(qū)的內(nèi)存里,將緩沖區(qū)轉(zhuǎn)換為 js 對(duì)象,通過 Promise 返回
          • response.text() //轉(zhuǎn)為 text
          • response.json() //轉(zhuǎn)為 json
          • response.formData()
          • response.arrayBuffer()
          • response.blob()
          • 不支持超時(shí)設(shè)置
          • 但是可以使用promise+setTimeout進(jìn)行控制
          • 默認(rèn)不攜帶cookies,但是可以設(shè)置
          • fetch(url, {credentials: 'include'});
          • omit 不發(fā)送 cookie
          • same-origin 同源發(fā)送 cookie(默認(rèn))
          • include 都發(fā)送 cookie
          • resolve 若發(fā)生在網(wǎng)絡(luò)通信正常(404,500)也是 resolve
          • .catch()也不會(huì)被執(zhí)行。
          • reject 只發(fā)生在網(wǎng)絡(luò)通信異常
          • 想要精確的判斷 fetch 是否成功
          • 需要包含 promise resolved 的情況,此時(shí)再判斷 response.ok 是不是為 true
          • 需要借用 AbortController 中止 fetch
          // resolve若發(fā)生在網(wǎng)絡(luò)通信正常(404,500)也是resolve
          fetch('http://domain/service', {
            method: 'GET',
          })
            .then((response)=> {
              // 想要精確的判斷 fetch是否成功
              // 需要包含 promise resolved 的情況,此時(shí)再判斷 response.ok是不是為 true
              if (response.ok) {
                return response.json();
              }
              throw new Error('Network response was not ok.');
            })
            .then((json)=> console.log(json))
            // .catch()也不會(huì)被執(zhí)行
            .catch((error)=> console.error('error:', error));
          
          // ************************************
          // 不支持直接設(shè)置超時(shí), 可以用promise
          function fetchTimeout(url, init, timeout=3000) {
            return new Promise((resolve, reject)=> {
              fetch(url, init).then(resolve).catch(reject);
              setTimeout(reject, timeout);
            });
          }
          // ************************************
          // 中止fetch
          // signal用于支持AbortController中斷請(qǐng)求
          const controller=new AbortController();
          // AbortController接口表示一個(gè)控制器對(duì)象
          // 允許你根據(jù)需要中止一個(gè)或多個(gè) Web請(qǐng)求
          fetch('http://domain/service', {
            method: 'GET',
            signal: controller.signal,
          })
            .then((response)=> response.json())
            .then((json)=> console.log(json))
            .catch((error)=> console.error('Error:', error));
          controller.abort();
          

          3.Http 狀態(tài)碼和 Header

          1.狀態(tài)碼

          100 信息性|200 成功|300 重定向|400 客戶端錯(cuò)誤|500 服務(wù)器錯(cuò)誤

          [1|2|3]xx

          • 101 切換協(xié)議
          • 200 Ok
          • 301 永久重定向(設(shè)備會(huì)緩存)
          • 302 臨時(shí)重定向(以前是臨時(shí)轉(zhuǎn)移,已經(jīng)不推薦使用了,建議使用 307)
          • 307 臨時(shí)重定向
          • 如果是 POST/DELETE 過來的會(huì)繼續(xù)使用
          • 302 只會(huì)使用 get
          • 304 (Not Modified)服務(wù)器文件未修改,協(xié)商緩存
          • 308 永久重定向

          4xx

          • 400 客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器識(shí)別
          • 403 服務(wù)器受到請(qǐng)求,但是拒絕提供服務(wù),可能是跨域也可是權(quán)限不夠
          • 404 請(qǐng)求的資源不存在
          • 405 請(qǐng)求的 method 不允許

          5xx

          • 500 服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤

          2.字段

          • Content-Length:? 發(fā)送給接收者給 Body 內(nèi)容長(zhǎng)度(字節(jié))
          • ? 一個(gè) Byte 是 8bit
          • utf-8 編碼的字符是 1-4 個(gè)字節(jié)
          • ?User-Agent?:客戶端特性的字符串
          • ?Content-Type:? 媒體類型
          • ?Origin?:描述請(qǐng)求來源地址
          • ?Accept
          • 建議服務(wù)端返回何種媒體類型?/表示所有類型(默認(rèn))?text/html,application/json?
          • Accept-Encoding
          • ? 建議服務(wù)端發(fā)送什么編碼(壓縮算法)
          • ?deflate,gzip;q=1.0,*;q=0.5
          • ?Accept-Language:? 建議服務(wù)端傳遞那種語(yǔ)言
          • ?Referer
          • 告訴服務(wù)端打開當(dāng)前頁(yè)面的上一張頁(yè)面的 URL;
          • 如果是 ajax 請(qǐng)求那么就告訴服務(wù)端發(fā)送請(qǐng)求的 URL 的什么 ?
          • 非瀏覽器環(huán)境有時(shí)候不發(fā)生 Referer(或者虛擬 Referer,通常是爬蟲)
          • 常用來做用戶行為分析
          • ?Connection?
          • 決定鏈接是否在當(dāng)前事務(wù)完成后關(guān)閉
          • ?http1.0 默認(rèn)是 close
          • ?http1.1 默認(rèn)是 keep-alive

          4.拓展方向

          如何應(yīng)對(duì)網(wǎng)絡(luò)不穩(wěn)定(波動(dòng))的情況?

          • 失敗了重發(fā),指數(shù)補(bǔ)償
          const request=(url)=> {
            let resolved=false;
            let t=1;
            return new Promise((resolve, reject)=> {
              // Promise.race([
              //     fetch(url),
              //     wait(100, ()=> fetch(url)),
              //     wait(200, ()=> fetch(url)),
              //     wait(400, ()=> fetch(url)),
              //     wait(800, ()=> fetch(url)),
              //     wait(1600, ()=> fetch(url)),
              // ])
              function doFetch() {
                if (resolved || t > 16) return;
                fetch(url)
                  .then((resp)=> resp.text())
                  .then((data)=> {
                    if (!resolved) {
                      resolved=true;
                      resolve(data);
                    }
                  });
          
                setTimeout(()=> {
                  doFetch();
                  t *=2;
                }, t * 100);
              }
              doFetch();
            });
          };
          

          如何處理并發(fā)請(qǐng)求?

          • 相同的請(qǐng)求,多次發(fā)送,會(huì)照成帶寬的浪費(fèi)
          • 處理思路:做緩存
          • 因?yàn)檎?qǐng)求具有時(shí)效性,所以不能做永久緩存
          • 相同的請(qǐng)求在一定的時(shí)間內(nèi)只發(fā)生一次
          • 使用w保存請(qǐng)求信息,若同一時(shí)間發(fā)送多次相同對(duì)請(qǐng)求
          • 使用w[hash].resolves保存 resolve 函數(shù)當(dāng)請(qǐng)求函數(shù)w[hash].func發(fā)送成功,執(zhí)行 resolves 中的函數(shù),保證每次請(qǐng)求都有響應(yīng)信息

          端瀏覽器對(duì)象模型BOM常用對(duì)象介紹,BOM即Broswer Object Model 瀏覽器對(duì)象模型,在JavaScript中可以理解為window對(duì)象,用來進(jìn)行與瀏覽器相關(guān)的一些操作,學(xué)習(xí)BOM就是學(xué)習(xí) JavaScript中的window對(duì)象。


          一、window對(duì)象

          BOM的核心對(duì)象是 window,它代表瀏覽器的一個(gè)實(shí)例。在瀏覽器中,window有著雙重的角色:JavaScript訪問瀏覽器的接口對(duì)象,ES中的Global對(duì)象意味著網(wǎng)頁(yè)中的任何一個(gè)對(duì)象,變量,函數(shù)都是以window作為其Global對(duì)象。

          1、全局作用域,在ECMAScript中,window對(duì)象扮演著Global對(duì)象的角色,也就是說,所有在全局作用域聲明的變量,函數(shù)都會(huì)變成window的屬性和方法,都可以通過 window.屬性名(或方法名) 直接調(diào)。

          2、導(dǎo)航和打開窗口,通過 window.open() 既可以導(dǎo)航到一個(gè)特定的URL,也可以打開一個(gè)新的瀏覽器窗口

          二、location對(duì)象

          [^location 是最有用的BOM對(duì)象之一,它提供了與當(dāng)前窗口中加載的文檔有關(guān)的信息]: JavaScript高級(jí)程序設(shè)計(jì)。

          注: window.location 和 document.location?引用的是同一個(gè)對(duì)象。location 既是 window 對(duì)象的屬性,也是 document?對(duì)象的屬性。

          三、 navigator對(duì)象

          navigator 對(duì)象主要用來獲取瀏覽器的屬性,區(qū)分瀏覽器類型;

          navigator 對(duì)象屬性較多,且兼容性比較復(fù)雜。

          四、history對(duì)象

          history 對(duì)象保存著用戶上網(wǎng)的歷史記錄,從窗口被打開的那一刻算起,因?yàn)?history 是 window 對(duì)象的屬性,因此每個(gè)瀏覽器窗口,每個(gè)標(biāo)簽?zāi)酥撩總€(gè)框架,都有自己的 history對(duì)象與特定的 window 對(duì)象關(guān)聯(lián)。

          總結(jié)瀏覽器對(duì)象模型BOM中常用的對(duì)象有navigator,window, location, history

          window既是 JavaScript 的全局對(duì)象,也是BOM的一個(gè)實(shí)例,所有的全局方法,屬性,BOM中的屬性,都可以通過 window. 來調(diào)用;

          window作為BOM的實(shí)例,最常用的幾個(gè)方法分別是:window.open(),window.close(),,分別用來打開和關(guān)閉瀏覽器窗口頁(yè)面,這里需要注意的是,通過 open 方法打開的頁(yè)面,才能通過close 方法關(guān)閉;

          location對(duì)象也是用的比較多的一個(gè)BOM對(duì)象,主要用來操作URL相關(guān)的一些信息,除了修改 Hash 之外的任何屬性,頁(yè)面都會(huì)重新加載,歷史記錄會(huì)多加一條歷史記錄;

          location對(duì)象還有一個(gè) reload() 方法用于手動(dòng)重新加載頁(yè)面,該方法接收一個(gè)可選參數(shù),為 true 的時(shí)候表示從服務(wù)器重新加載,否則可能從瀏覽器緩存中重新加載頁(yè)面;

          location對(duì)象 還有一個(gè)比較特殊的方法,location.replace(),該方法可以覆蓋當(dāng)前頁(yè)面并重新加載,同時(shí)不會(huì)在 history 中生成歷史記錄;

          navigator對(duì)象主要用來獲取瀏覽器相關(guān)的一些信息,使用的時(shí)候需要注意兼容性。可以用來獲取瀏覽器類(Chrome,safrai,FireFox,Edge,IE)等;

          history對(duì)象主要用來操作瀏覽器URL的歷史記錄,可以通過參數(shù)向前,向后,或者向指定URL跳轉(zhuǎn)。可以通過 length 屬性獲取記錄數(shù),判斷當(dāng)前頁(yè)面是否是打開的首個(gè)頁(yè)面;


          主站蜘蛛池模板: 亚洲av无码一区二区三区四区| 国模吧一区二区三区精品视频| 一区在线观看视频| 亚洲av乱码一区二区三区香蕉| 日韩精品一区二区三区中文版 | 一区二区视频传媒有限公司| 国产免费一区二区三区免费视频| 在线免费视频一区二区| 亚洲av成人一区二区三区观看在线| 亲子乱av一区二区三区| 国产精品毛片a∨一区二区三区| 日本一区免费电影| 日韩精品一区在线| 色精品一区二区三区| 国产乱码精品一区二区三区四川| 国模极品一区二区三区| 国产在线第一区二区三区| 精品久久久中文字幕一区| 在线视频国产一区| 一区二区三区www| 国产高清在线精品一区| 无码囯产精品一区二区免费| 国产成人久久精品一区二区三区 | 国产一区二区成人| 久久精品无码一区二区无码 | 国模无码视频一区| 成人欧美一区二区三区在线视频| 在线欧美精品一区二区三区 | 一区二区三区波多野结衣 | 无码一区二区三区| 日本一区二区三区爆乳| 国产精品无码一区二区三区毛片 | 免费看一区二区三区四区| 日本免费精品一区二区三区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 中文字幕亚洲综合精品一区| 福利一区福利二区| 中文字幕国产一区| 国产成人久久一区二区不卡三区 | 无码人妻精品一区二区三| 国产麻豆剧果冻传媒一区|