JS前端同源策略和跨域及防抖節(jié)流詳解
引言
協(xié)議,域名,端口相同,就具有相同的源
同源策略:瀏覽器提供的一個(gè)安全策略
跨域的出現(xiàn)原因:瀏覽器的同源策略不允許非同源的URL之間進(jìn)行資源的交互
解決跨域由兩種方式:JSONP, CORS
JSONP: 只支持GET請求
通過script標(biāo)簽的src屬性,請求跨域的數(shù)據(jù)接口,并通過函數(shù)調(diào)用的形式,接收跨域接口響應(yīng)回來的數(shù)據(jù)
CORS:出現(xiàn)的較晚,是W3C標(biāo)準(zhǔn),屬于跨域Ajax請求的根本解決方案,支持GET和POST請求,不兼容低版本的瀏覽器
jQuery中JSONP的實(shí)現(xiàn)
jQuery中的JSONP 通過script標(biāo)簽的src屬性,實(shí)現(xiàn)跨域數(shù)據(jù)訪問的,jQuery采用的是動(dòng)態(tài)創(chuàng)建和移除script標(biāo)簽的方式,來發(fā)起JSONP數(shù)據(jù)請求
在發(fā)起JSONP請求的時(shí)候,動(dòng)態(tài)向head中append一個(gè)script標(biāo)簽
JSONP請求成功之后,動(dòng)態(tài)從head中移除剛才append進(jìn)去的script標(biāo)簽
$(function () { $.ajax({ url: "http://www.liulongbin.top:3006/api/jsonp?name='zs'&age=12", dataType: 'jsonp', // 發(fā)送到服務(wù)器的參數(shù)名稱,默認(rèn)值為callback jsonp: 'callback', // 自定義回調(diào)函數(shù)名稱 默認(rèn)值為jQueryxxxx jsonpCallback: 'abc', success(res) { console.log(res) }, }) })
防抖【重要】
防抖策略:當(dāng)事件被觸發(fā)后,延遲n秒后再執(zhí)行回調(diào),如果在這n秒內(nèi)事件又被觸發(fā),則重新計(jì)時(shí)
應(yīng)用場景:
用戶在輸入框中連續(xù)輸入一串字符串,可以通過防抖策略,只在輸入完后,才執(zhí)行查詢的請求,這樣可以有效的減少請求次數(shù),節(jié)約請求資源
var timer = null //1-1防抖的timer $('#ipt').on('keyup', function () { // 1-3 清除timer clearTimeout(timer) //省略其他代碼.... // 1-2定義防抖 // 獲取搜索列表 timer = setTimeout(function () { getSuggestList(keywords) }, 800) })
緩存搜索的列表
1 定義全局緩存對象
var cacheObj= {}
2:將搜索結(jié)果存儲(chǔ)到緩存對象中
// 渲染UI結(jié)構(gòu) function renderSUggestList(res) { // 如果沒有數(shù)據(jù)需要渲染 直接return if (res.result.length <= 0) { return $('.suggest-list').empty().hide() } var rows = [] // console.log(res.result) $.each(res.result, function (i, item) { // console.log(item[0]) rows.push(` <div class="suggest-item">${item[0]}</div> `) }) $('.suggest-list').empty().append(rows.join('')).show() // 1獲取用戶輸入的內(nèi)容 當(dāng)做鍵 var k = $('#ipt').val().trim() // 將數(shù)據(jù)作為值 進(jìn)行緩存 cacheObj[k] = res // console.log(cacheObj) }
3優(yōu)先從緩存中獲取搜索列表
$('#ipt').on('keyup', function () { // 1-3 清除timer clearTimeout(timer) // 1獲取用戶輸入的內(nèi)容 var keywords = $(this).val().trim() // 2 判斷用戶輸入的內(nèi)容是否為空 // 清空搜索列表 if (keywords.length <= 0) { return $('.suggest-list').empty().hide() } // console.log(keywords) // 先判斷緩存中是否有數(shù)據(jù) if (cacheObj[keywords]) { return renderSUggestList(cacheObj[keywords]) } // 1-2定義防抖 // 獲取搜索列表 timer = setTimeout(function () { getSuggestList(keywords) }, 800) })
節(jié)流【重點(diǎn)】
節(jié)流策略:可以減少一段時(shí)間內(nèi)事件的觸發(fā)頻率
場景:
鼠標(biāo)連續(xù)不斷的觸發(fā)某事件(點(diǎn)擊),只在單位時(shí)間內(nèi)觸發(fā)一次
懶加載時(shí)要監(jiān)聽計(jì)算滾動(dòng)條的位置,不必每次滑動(dòng)都觸發(fā),可以降低計(jì)算的頻率,而不必去浪費(fèi)CPU資源
節(jié)流閥為空,可以執(zhí)行下次操作;不為空,不能執(zhí)行下次操作
當(dāng)前操作執(zhí)行完,必須將節(jié)流閥重置為空,表示可以執(zhí)行下次操作了
每次執(zhí)行操作前,先判斷節(jié)流閥是否為空
$(function () { // 獲取圖片 var angel = $('#angel') // 定義一個(gè)timer節(jié)流閥 var timer = null $(document).on('mousemove', function (e) { //每次執(zhí)行操作前,先判斷節(jié)流閥是否為空 不為空 不能執(zhí)行(證明距離上次執(zhí)行不足16毫秒) if (timer) { return } timer = setTimeout(function () { console.log(e.pageX, e.pageY) angel.css('top', e.pageY + 'px').css('left', e.pageX + 'px') timer = null //設(shè)置了鼠標(biāo)跟隨效果后,清空節(jié)流閥 方便下次開啟定時(shí)器 }, 160) }) })
防抖和節(jié)流的區(qū)別
- 防抖:事件被頻繁觸發(fā),防抖能保證只有最后一次觸發(fā)生效,前面N多次的觸發(fā)都會(huì)被忽略
- 節(jié)流:事件被頻繁觸發(fā),節(jié)流能夠減少事件觸發(fā)的頻率,有選擇性的執(zhí)行一部分事件
以上就是JS前端同源策略和跨域及防抖節(jié)流詳解的詳細(xì)內(nèi)容,更多關(guān)于JS同源策略跨域防抖節(jié)流的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Skypack布局前端基建實(shí)現(xiàn)過程詳解
這篇文章主要為大家介紹了Skypack布局前端基建過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07前端算法leetcode109題解有序鏈表轉(zhuǎn)換二叉搜索樹
這篇文章主要為大家介紹了前端算法leetcode109題解有序鏈表轉(zhuǎn)換二叉搜索樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09JavaScript實(shí)現(xiàn)棧結(jié)構(gòu)詳細(xì)過程
這篇文章主要介紹了JavaScript實(shí)現(xiàn)棧結(jié)構(gòu)詳細(xì)過程,棧即stack它是一種受限的線性表,后進(jìn)先出LIFO,更多具體的內(nèi)容,需要的小伙伴參考下面文章的詳細(xì)內(nèi)容2021-12-12微信小程序 flex實(shí)現(xiàn)導(dǎo)航實(shí)例詳解
這篇文章主要介紹了微信小程序 flex實(shí)現(xiàn)導(dǎo)航實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04