前端系統(tǒng)學(xué)習(xí) 3. 瀏覽器相關(guān)

1. 瀏覽器事件模型

  • 事件的捕獲和冒泡
  • addEventListener & removeEventListener
  • 兼容IE7 8 attachEvent
  • 事件代理/事件委托

事件代理/事件委托

將孩子的事件監(jiān)聽委托給父親荷鼠,優(yōu)化同類型監(jiān)聽綁定帶來的大量內(nèi)存消耗

// 每一個子節(jié)點單獨綁定
const liList = document.querySelectorAll('li')
for (let i = 0; i < liList.length; i++) {
  liList[i].addEventListener('click', (e) => {
    alert(i + '' + liList[i].innerHtml)
  })
}

// 委托父親節(jié)點來綁定事件
const ul = document.querySelector('ul')
ul.addEventListener('click', (e) => {
  const liList = document.querySelectorAll('li')
  const index = Array.prototype.indexOf.call(liList, e.target)
  if (index >= 0) {
    alert(`${index}, ${e.target.innerHTML}`)
  }
})

2. 瀏覽器請求相關(guān)

2.1 XML 請求

const xhr = new XMLHttpRequest()
xhr.open('GET', 'https://baidu.com')

xhr.onreadystatechange = () => {
  if (xhr.readyState !== 4) {
    return
  }
  if (xhr.state === 200) {
    console.log(xhr.responseText)
  } else {
    console.log('HTTP error', xhr.status, xhr.statusText)
  }
}
// xhr.timeout = 1000

// xhr.ontimeout = () => {
//   console.log(xhr.responseURL)
// }

// xhr.upload.onprogress = p => {
//   console.log (Math.round((p.loaded / p.total) * 100) + '%')
// }

xhr.send()

2.2 fetch

使用 promise 來實現(xiàn) timeout,統(tǒng)一的狀態(tài)管理十分好用

fetch('https://domain/service', {
  method: 'GET',
  credentials: 'same-origin'
}).then(response => {
  if (response.ok) {
    return response.json()
  }
  throw new Error('http error')
}).then(json => {
  console.log(json)
}).catch(e => {
  console.log(e)
})

function fetchTimeout (url, opts, timeout) {
  return new Promise((resolve, reject) => {
    fetch(url, opts).then(resolve).catch(reject)
    // 時間到了執(zhí)行 resolve, 后面 fetch 就算執(zhí)行到 resolve 也不會扭轉(zhuǎn)狀態(tài)了
    setTimeout(reject, timeout)
  })
}

中止 fetch凄贩,AbortController 與 fetch 搭配使用

AbortController 接口表示一個控制器對象晌柬,允許你根據(jù)需要中止一個或多個 Web 請求

const controller = new AbortController()

fetch('http://domain/service', {
  method: 'GET',
  signal: controller.signal
})
.then(res => res.json)
.then(json => console.log(json))
.catch(error => console.log(error))

controller.abort()

2.3 ajax

手寫 ajax

interface IOptions {
  url: string;
  method: 'GET' | 'POST';
  timeout?: number;
  data?: any;
}

function objToQuery (obj: Record<string, any>) {
  const arr = []
  for (let key in obj) {
    arr.push(`${key}=${encodeURIComponent(obj[key])}`)
  }
  return arr.join('&')
}


function ajax (options: IOptions = {
  url: '',
  method: 'GET'
}) {
  return new Promise((resolve, reject) => {
    let xhr
    let timer
    if ((window as any).XMLHttpRequest) {
      xhr = new XMLHttpRequest()
    } else {
      xhr = new ActiveXObject('Microsoft.XMLHTTP')
    }
    xhr.onreadystatechange = () => {
      if (xhr.readState === 4) {
        if (xhr.state >= 200 && xhr.state < 300 || xhr.state === 304) {
          resolve(xhr.responseText)
        } else {
          reject(xhr.state + ' ' + xhr.stateText)
        }
        clearTimeout(timer)
      }
    }
    if (options.method.toUpperCase() === 'GET') {
      xhr.open('GET', options.url + '?' + objToQuery(options.data), true)
      xhr.send()
    } else if (options.method.toUpperCase() === 'POST') {
      xhr.open('POST', options.url, true)
      xhr.setRequestHeader('ContentType', 'application/x-www-form-urlencoded')
      xhr.send(options.data)
    }

    if (options.timeout) {
      timer = setTimeout(() => {
        reject('http timeout')
        xhr.abort()
      }, options.timeout);
    }
  })
}

2.4 請求頭

2.4.1 cookie

為什么常見的 CDN 域名和業(yè)務(wù)域名不一樣?

// www.baidu.com 業(yè)務(wù)域名
// cdn.aa-baidu.com cdn 域名

為了不攜帶 cookie

  1. 安全問題。公司不想把攜帶用戶信息的 cookie 給到三方廠商
  2. cdn 本意為了加速靜態(tài)文件的加載烦秩,與用戶態(tài)無關(guān)狞贱,本不需要 cookie刻获,所以不攜帶 cookie 可以減少請求頭的體積。
  3. 避免靜態(tài)資源加載阻塞了服務(wù)端請求瞎嬉。HTTP 1.1 / 1.0 同源請求并發(fā)限制 chrome蝎毡、IE、Safari 為 6

2.4.2 referer 來源

2.4.3 user-agent 判斷 webview

User-Agent 首部包含了一個特征字符串氧枣,用來讓網(wǎng)絡(luò)協(xié)議的對端來識別發(fā)起請求的用戶代理軟件的應(yīng)用類型沐兵、操作系統(tǒng)、軟件開發(fā)商以及版本號便监。

2.5 響應(yīng)頭

access-control-allow-origin: *

content-encoding: gzip

set-cookie

2.6 status

200 success
201 created 用于 POST 請求成功
301 永久重定向
302 臨時重定向
304 協(xié)商緩存扎谎,服務(wù)器文件未修改
last-modified: 文件最后一次修改時間
etag: 計算 hash 來判斷文件是否修改

強緩存
Cache-Control: max-age=1000 秒
expires 過期時間 (客戶端時間和服務(wù)端時間可能有偏差)

優(yōu)先級

Cache-Control > expires > Etag > Last-Modified

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烧董,隨后出現(xiàn)的幾起案子毁靶,更是在濱河造成了極大的恐慌,老刑警劉巖逊移,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件预吆,死亡現(xiàn)場離奇詭異,居然都是意外死亡螟左,警方通過查閱死者的電腦和手機啡浊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胶背,“玉大人巷嚣,你說我怎么就攤上這事∏鳎” “怎么了廷粒?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我坝茎,道長涤姊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任嗤放,我火速辦了婚禮思喊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘次酌。我一直安慰自己恨课,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布岳服。 她就那樣靜靜地躺著剂公,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吊宋。 梳的紋絲不亂的頭發(fā)上纲辽,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音璃搜,去河邊找鬼拖吼。 笑死,一個胖子當(dāng)著我的面吹牛这吻,可吹牛的內(nèi)容都是我干的绿贞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼橘原,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涡上?” 一聲冷哼從身側(cè)響起趾断,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吩愧,沒想到半個月后芋酌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡雁佳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年脐帝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糖权。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡堵腹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出星澳,到底是詐尸還是另有隱情疚顷,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站腿堤,受9級特大地震影響阀坏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笆檀,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一忌堂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酗洒,春花似錦士修、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箫老,卻和暖如春封字,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耍鬓。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工阔籽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牲蜀。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓笆制,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涣达。 傳聞我的和親對象是個殘疾皇子在辆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容