這篇文章帶給大家的內容是關於跨域的解決方式總結(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
同源政策:協定、網域名稱、連接埠皆相同。
非同源限制:
cookie、localStorage、indexDB無法讀取。
DOM無法取得。
AJAX請求無法傳送。
解決方式:
一、JSONP
#原則:透過動態加入一個<script>元素,向伺服器請求JSON資料。伺服器接收請求返回指定具名回呼函數。 </script>
eg:
function addScript(src) { var script = document.createElement('script'); script.setAttribute("type", "text/javscript"); script.src = src; document.body.appendChild(script); } window.onload = function() { addScript("https://segmentfault.com/data?callback=getData"); } function getData(data) { console.log(data) }
注意:
1、查詢的Url中callback需要指定回呼函數的名字。
2、<script>在瀏覽器作為程式碼運行,定義的getData函數會被立即呼叫。 <br/>3、傳回的JSON參數作為javascript對象,不是字串,不需要進行JSON轉換。 <br/>4、jquery函式庫的 $.getJSON()也可以實作。 </script>
$.getJSON("https://segmentfault.com/data?callback=?", function(data) { console.log(data) })
缺陷:是GET方式獲取,不支援 POST。
二、window.postMessage
window.postMessage 無論是否同源都允許跨視窗通訊。 postMessage 參數一是傳遞內容,參數二是協定網域連接埠或(*表示不限制網域名稱)
页面一:"https://www.segmentfault.com/page1.html" //传递页面 <script> window.onload = function () { if (typeof window.postMessage === undefined) { alert("浏览器不支持postMessage!"); } else { window.open.postMessage({data: "Hello World"}, "https://www.example.com/page2.html"); } } </script>
页面二:"https://www.example.com/page2.html" //接收页面 <script> window.addEventListener('message', function(e) { console.log(e.data); },false); </script>
事件接收window.addEventListener('message', function(){});中的message事件物件event有三個屬性:
1、event.source:傳送訊息的視窗
2、event.origin: 訊息發送的網址
3、event.data: 訊息內容
<script> //引用父窗口发送信息给下一个窗口 window.addEventListener('message', receiveMessage); function receiveMessage(event) { event.source.postMessage('Nice to see you!', '*'); } </script>
<script> //过滤不是发给本窗口的信息 window.addEventListener('message', receiveMessage); function receiveMessage(event) { if (event.origin !== 'http://www.segmentfault.com/page1.html') return; if (event.data === 'Hello World') { event.source.postMessage('Hello', event.origin); } else { console.log(event.data); } } </script>
三、iframe
iframe載入頁面和src裡面的目標域是同一個網域,是能夠發起ajax請求(父子視窗)。 //前提是同源,不同來源就不會發起ajax請求。
不同視窗同源之間是可以取得window對象,但不能取得window物件的屬性與方法。 //不同來源會報錯
1、document.domain iframe(同源可用-- 跨子域)
document.domain屬性:一級網域相同,二級網域不同可以實現window對象取得。
页面一:"https://segmentfault.com/page1.html" <script> window.onload = function() { document.domain = "https://segmentfault.com/"; //设置domain window.getData = function() { //ajax请求 } } </script>
页面二:"https://segmentfault.com/page2.html" <iframe></iframe> <script> //动态创建iframe最佳,获取完数据销毁。 //document.domain设置成自身或更高一级的父域,主域必须相同。 document.domain = "https://segmentfault.com/" //设置domain function test() { var win = document.getElementById("iframe").contentWindow; win.getData("https://segmentfault.com/json_domain.php", function() {}) } </script>
缺陷:主網域得一致。
2、window.name iframe(非同源可用)
window.name屬性:在一個視窗的生命週期內,無論是否同源,同一個視窗的載入頁面window.name屬性是共享的,每個頁面都可以操作。
页面一:"https://segmentfault.com/page1.html" <script> window.name = "this is data!" </script>
页面二:"https://segmentfault.com/page2.html" <iframe></iframe> <script> //动态创建iframe最佳,获取完数据销毁。 //获取window.name function test() { var winName = document.getElementById("iframe").contentWindow.name; winName.src = "https://segmentfault.com/data.html"; //最后需要将iframe的src设置成当前域的一个页面地址 } </script>
缺陷:相容性不好
3、location.hash iframe(非同源可用)
##片段標識符:片段標識符是指url#號後面的部分。只是改變片段標識符頁面不刷新。
页面一:"https://www.segmentfault.com/page1.html" <script> function startRequest(){ var ifr = document.createElement('iframe'); ifr.style.display = 'none'; ifr.src = 'https://www.example.com/page2.html#messgae'; document.body.appendChild(ifr); } function checkHash() { var data = location.hash ? location.hash.substring(1) : ''; } setInterval(checkHash, 2000); </script>
页面二:"https://www.example.com/page2.html#messgae" <script> function callBack(){ try { parent.location.hash = 'somedata'; } catch (e) { // ie、chrome的安全机制无法修改parent.location.hash, // 所以要利用一个中间的example域下的代理iframe var ifrproxy = document.createElement('iframe'); ifrproxy.style.display = 'none'; ifrproxy.src = 'https:/www.segmentfault.com/page3html#somedata'; // 注意该文件在"segmentfault.com"域下 document.body.appendChild(ifrproxy); } } </script>
页面三:"ttps:/www.segmentfault.com/page3html#somedata" <script> //因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值 parent.parent.location.hash = self.location.hash.substring(1); </script>缺點:資料暴露在url,長度也有限制。
四、WebSocket
WebSocket:瀏覽器透過JavaScript 向伺服器發出建立WebSocket 連線的請求,連線建立以後,客戶端和伺服器端就可以透過TCP 連接直接交換資料。 設定WebSocket請求頭訊息,伺服器支援就可以進行。Origin: http://example.com //根据域名是否在白名单内来判断是否可以通信缺點:
實現成本高。
五、CORS
cors是跨域資源分享。現CORS通訊的關鍵是伺服器。只要伺服器實作了CORS接口,就可以跨源通訊。 缺點:伺服器配置,佔用主網域頻寬。
這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的JavaScript影片教學專欄!
以上是JavaScript跨域的解決方式總結(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能