本文主要和大家分享JS如何實現瀏覽器通信,主要以程式碼形式,希望能幫助大家。
同源策略限制了從同一個來源載入的文件或腳本如何與來自另一個來源的資源互動。這是一個用於隔離潛在惡意檔案的重要安全機制。 (三相同:協定http/https,網域名稱和連接埠)
Cookie/LocalStorage和IndexDB無法讀取
DOM無法取得
Ajax請求不能發送發送
#URL | ##原因||
---|---|---|
失敗 | #不同協定( https與http ) | |
失敗 | #不同連接埠( 81和80) | |
失敗 | 不同網域( news和store ) |
##<pre class="brush:php;toolbar:false;">var xht = XMLHttpRequest ? new XMLHttpRequest():new window.ActiveXObject(&#39;Microsoft.XMLHTTP&#39;);var data = opt.data,
url = opt.url,
type=opt.type.toUpperCase(),
dataArr=[];for(var k in data){
dataArr.push(k+&#39;=&#39;+data[k]);
}if(type === &#39;GET&#39;){
url = url + &#39;?&#39; + dataArr.join("&");
xhr.open(type, url.replace(/\?s/g,&#39;&#39;), true);
xhr.send();
}if(type === &#39;POST&#39;){
xhr.open(type, url, true);
xhr.setRequestHeader(&#39;Content-type&#39;,&#39;application/x-www-form-urlencoded&#39;);
xhr.send(dataArr.join(&#39;&&#39;));
}
xhr.onload = function(){
if(xhr.status === 200 || xhr.status === 304){ //媒体资源需要206
var res; if(opt.success && opt.success instanceof Function){
res = xhr.responseText; if(typeof res === &#39;string&#39;){
res = JSON.parse(res);
opt.success.call(xhr, res);
}
}
}else{ if(opt.error && opt.error instanceof Function){
opt.error.call(xhr, res);
}
}
}</pre> 跨域通訊的幾種方式
|
|
說明 | |
JSONP | 動態建立 |
callback=handleResponse | 函數,在頁面中,傳回的JSON作為參數傳入回呼函數中,我們透過回呼函數來操作資料。function handleResponse(response){// 對response資料進行操作碼} |
##Hash | Hash是url位址中#號之後的內容,其值改變不會觸發頁面刷新,search是url問號後面的,一旦改變會觸發刷新 |
// 利用Hash,场景是当前页面A通过iframe或者frame嵌入了跨域页面B//A中伪代码如下:var B = document.getElelementByTagName('iframe'); B.src = B.src + '#' + 'data';// B中伪代码window.onhashchange = function(){ var data = window.location.hash; }###postMessage###
// 窗口A(http://A.com)向跨域的窗口B(http://B.com)发送信息window.postMessage(data, "http://B.com");()//在窗口监听window.addEventListener('message', function(event){ console.log(event.origin)//http://A.com console.log(event.source)//引用A window console.log(event.data) //数据}, false)###WebSocket###
var ws = new WebSocket('wss://a.com'); //ws 类似http为非加密,wss类似https为加密 ws.onopen = function(){}//打开链接 ws.onmessage = function(){}//收到消息 ws.onclose = function(){}//关闭连接###CORS###
//使用 fetch 的构造函数请求数据后,返回一个 Promise 对象,处理即可。 //Fetch 常见坑 //Fetch 请求默认是不带 cookie 的,需要设置 fetch(url, {credentials: 'include'}) //服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。 fetch("/some/url", { method:'get '}).then(function(response){ }).catch(function(err){ })
以上是JS如何實現瀏覽器通信的詳細內容。更多資訊請關注PHP中文網其他相關文章!