摘要:把數(shù)據(jù)包裹在一個客戶端聲明的本地的回調(diào)函數(shù)中,這樣可以動態(tài)加載一個跨域服務(wù)器數(shù)據(jù)。在本地聲明這個動態(tài)中的回調(diào)函數(shù)名稱,并且定義該函數(shù),然后通過參數(shù)傳遞到服務(wù)器。
為什么要跨域
我們都知道在瀏覽器地址欄輸入地址的時候可以隨便訪問一個頁面,但是如果你在ajax請求中發(fā)出一個xhr請求那么因為瀏覽器安全策略只有同源的服務(wù)器才能處理。這就是同源策略 要求協(xié)議/域名/端口三者完全一致才能訪問
例如以下的代碼例子,我們需要獲取服務(wù)器上README.md里面的數(shù)據(jù)
{ status:"sucess", data:{ city:["南京","北京"] } }
本地js代碼如下
如果地址欄是下面這樣
那么我們是可以訪問到這個數(shù)據(jù)文件的
如果我在另外一個不同源域名下執(zhí)行同樣的代碼例如下面這個地址
那么就會出現(xiàn)下面的錯誤
這個錯誤的意思說白了就是服務(wù)器禁止不同源的頁面進(jìn)行ajax請求數(shù)據(jù)。
非要獲取這個數(shù)據(jù)我們應(yīng)該怎么做我們注意到有的網(wǎng)站會提供cdn服務(wù)我們可以從不同的服務(wù)器添加下面的代碼
這就為我們跨域獲取數(shù)據(jù)提供了可能
var path = require("path") var express = require("express") const app = express() app.use(express.static(path.join(__dirname, "jsonp"))) console.log("> Starting dev server...") app.get("/detail", (req, res) => { let cb = req.query.cb ? req.query.cb : null // console.log("succuess") let readStream = fs.createReadStream(`README.md`) let data = "" readStream.on("data", chunk => { data += chunk }) readStream.on("end", () => { // console.log(data) res.send(`${cb}(${data})`) }) }) var server = app.listen(8888) console.log("server is running at port 8888")
1.基本原理我們可以動態(tài)生成script標(biāo)簽,把請求的url添加到script標(biāo)簽的src屬性上。把數(shù)據(jù)包裹在一個客戶端聲明的本地的回調(diào)函數(shù)中,這樣可以動態(tài)加載一個跨域服務(wù)器數(shù)據(jù)。
function jsonp(obj) { let scriptDOM = document.createElement("script") scriptDOM.setAttribute("src", `${obj.url}?cb=${obj.cb}`) window["callback"] = obj.success document.querySelector("body").appendChild(scriptDOM) scriptDOM.onload = function() { window["callback"] = null this.parentNode.removeChild(this) } scriptDOM.onerror = e => { console.log("jsonp error!", e) } } jsonp({ url: "http://localhost:8888/detail", cb: "callback", success: data => { if (data) { console.log("jsonp data", data) } } })
2.在本地聲明這個動態(tài)script中的回調(diào)函數(shù)名稱,并且定義該函數(shù),然后通過url參數(shù)傳遞到服務(wù)器。服務(wù)器把數(shù)據(jù)包裹成這個函數(shù)的參數(shù)傳遞回來,跨域就實現(xiàn)了。
為什么要這么做?以前我也很困惑。你獲取到的數(shù)據(jù)有可能是個json也有可能是個純文本,而script標(biāo)簽內(nèi)的內(nèi)容只能是合法的js語句,如果你沒有用回調(diào)函數(shù)包裹,直接從服務(wù)器傳遞回來原生數(shù)據(jù)。有可能是一段惡意代碼,或者是非法的js字符,那么瀏覽器就會報錯或者產(chǎn)生不可預(yù)料的顯示結(jié)果。并且你事先不知道瀏覽器傳遞過來的代碼跟你寫的有沒有沖突,是不是完全耦合。只有在本地定義一個函數(shù)傳遞到服務(wù)器,這樣服務(wù)器用該函數(shù)包裹代碼后傳遞回來才能跟我們的本地js代碼緊密配合。這樣服務(wù)器傳遞回來執(zhí)行的代碼就是我們自己定義的函數(shù)(數(shù)據(jù)存在函數(shù)的參數(shù)里),可以很好跟我們自己的代碼配合。這樣頗有Vue Angular子組件向父組件傳遞數(shù)據(jù)的思想
這樣不同域名下的數(shù)據(jù)我們拿到了結(jié)果如下
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82767.html
摘要:更新了個版本,最新正式版是語言的下一代標(biāo)準(zhǔn),早已在年月正式發(fā)布?;静恢С忠苿佣藶g覽器對的支持情況版起便可以支持的新特性。比較通用的工具方案有,,,等。 1、ECMAScript是什么? 和 JavaScript 有著怎樣的關(guān)系? 1996 年 11 月,Netscape 創(chuàng)造了javascript并將其提交給了標(biāo)準(zhǔn)化組織 ECMA,次年,ECMA 發(fā)布 262 號標(biāo)準(zhǔn)文件(ECMA-...
摘要:協(xié)程的歷史說來話長,要從生成器開始講起。我們可以使用把數(shù)據(jù)發(fā)送給協(xié)程函數(shù)??梢钥吹剑诘诖谓邮胀陻?shù)據(jù)之后,會產(chǎn)生結(jié)束的異常,因為程序流程結(jié)束了,這是正常現(xiàn)象。在這個階段,協(xié)程本質(zhì)上還是由生成器構(gòu)成的。所以,協(xié)程的介紹到這里就結(jié)束啦。 在上一篇對python并發(fā)編程的理解 中,我簡單提到了協(xié)程的概念,有一個錯誤需要指出的是,asyncio不全是對協(xié)程的實現(xiàn),只是用到了協(xié)程。 協(xié)程的歷史說...
摘要:借著產(chǎn)品層面的功能和視覺升級,我們用對它進(jìn)行了一次技術(shù)重構(gòu)。前端優(yōu)化是一個讓人技術(shù)提升的,希望你也能從這里學(xué)到一些東西。年最流行的前端鏈接我們每周會給多名前端開發(fā)者發(fā)送新聞郵件。 面試 -- 網(wǎng)絡(luò) HTTP 現(xiàn)在面試門檻越來越高,很多開發(fā)者對于網(wǎng)絡(luò)知識這塊了解的不是很多,遇到這些面試題會手足無措。本篇文章知識主要集中在 HTTP 這塊。文中知識來自 《圖解 HTTP》與維基百科,若有錯...
摘要:通過監(jiān)視資源的變化,并根據(jù)的信息生成記錄寫入到中。是唯一保留的容器,依然提供健康檢查。操作會獲取最新的全量資源與本地狀態(tài)進(jìn)行比較來產(chǎn)生通知,可以避免網(wǎng)絡(luò)原因?qū)е碌膩G失通知的情況。最后一個參數(shù)用來設(shè)置處理事件的回調(diào)。 上一期我們以1.2版本為背景,介紹了K8S的服務(wù)發(fā)現(xiàn)和kube-dns插件的相關(guān)內(nèi)容。有了上一期內(nèi)容作為基礎(chǔ),這期了解最新版本的kube-dns就會容易很多。 本文主要對比...
摘要:前言我是,如果你還不認(rèn)識我,不妨先看看技術(shù)的前世今生一平靜的生活已經(jīng)有一段日子了。傳送門技術(shù)的前世今生一技術(shù)的前世今生三 前言:我是JavaScript,如果你還不認(rèn)識我,不妨先看看《Web技術(shù)的前世今生(一)》 平靜的生活已經(jīng)有一段日子了。 這一天,HTML大哥面露不悅地走過來問我: Js,你是打算和我們分家嗎? 大哥,您這說的哪里話,我什么地方做的不對么?我一臉茫然地回答道。 哼,...
閱讀 1211·2021-11-24 11:16
閱讀 3440·2021-11-15 11:38
閱讀 1952·2021-10-20 13:47
閱讀 559·2021-09-29 09:35
閱讀 2208·2021-09-22 15:17
閱讀 1028·2021-09-07 09:59
閱讀 3395·2019-08-30 13:21
閱讀 2919·2019-08-30 12:47