這裏有一份簡潔的前端知識體系等待你查收,看看吧,會有驚喜哦~若是以爲不錯,懇求star哈~javascript
一個域下的文檔或腳本試圖去請求另外一個域下的資源前端
// 完整版
function ajax(opt) {
if(!opt.url) return;
var xhr = XMLHttpRequest
? new XMLHttpRequest()
: new ActiveXObject('Microsoft.XMLHTTP');
var data = opt.data,
url = opt.url,
type = opt.type.toUpperCase(),
dataArr = [];
for (var k in data) {
dataArr.push(k + '=' + data[k]);
}
if (type === 'GET') {
url = url + '?' + dataArr.join('&');
xhr.open(type, url.replace(/\?$/g, ''), true);
xhr.send();
}
if (type === 'POST') {
xhr.open(type, url, true);
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send(dataArr.join('&'));
}
xhr.onload = function () {
if (xhr.status === 200 || xhr.status === 304) {
var res;
if (opt.success && opt.success instanceof Function) {
res = xhr.responseText;
if (typeof res ==== 'string') {
res = JSON.parse(res);
opt.success.call(xhr, res);
}
}
} else {
if (opt.error && opt.error instanceof Function) {
opt.error.call(xhr, res);
}
}
};
}
// 簡易版,只考慮GET方式
var xhr = new XMLHttpRequest();
var url = '/test';
xhr.open('GET', url, true);
/**
* 監聽服務端跟客戶端通訊的過程和進度
*/
xhr.onreadystatechange = function () {
/**
* 每當 readyState 改變時,就會觸發 onreadystatechange 事件。
* 4: 請求已完成,且響應已就緒
*/
if (xhr.readyState === 4) {
// 200 成功
if (xhr.status === 200) {
console.log(xhr);
} else {
console.log('error');
}
}
}
xhr.send();//發起客戶端請求
複製代碼
// 客戶端實現:
<script>
var script = document.createElement('script');
script.type = 'text/javascript';
// 傳參並指定回調執行函數爲onBack
script.src = 'http://www.domain2.com:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);
// 回調執行函數
function onBack(res) {
alert(JSON.stringify(res));
}
</script>
// 服務端(返回時即執行全局函數)
onBack({"status": true, "user": "admin"})
複製代碼
場景:當前頁面 A 經過iframe或frame嵌入了跨域的頁面 Bjava
// 在A中僞代碼以下:
var B = document.getElementsByTagName('iframe');
B.src = B.src + '#' + 'data';
// 在B中的僞代碼以下:
window.onhashchange = function () {
var data = window.location.hash;
};
複製代碼
HTML5引入跨文檔通訊API,這個API爲window對象新增了一個window.postMessage方法,容許跨窗口通訊,不論這兩個窗口是否同源git
// 例如,窗口A(http:A.com)向跨域的窗口B(http:B.com)發送信息
var popup = window.open('http://B.com', 'title');
popup.postMessage('Hello World!', 'http://B.com');
// 在窗口B中監聽
window.addEventListener('message', function (event) {
console.log(event.origin); // 消息發向的網址
console.log(event.source); // 發送消息的窗口
console.log(event.data); // 消息內容
}, false);
複製代碼
var ws = new WebSocket('wss://echo.websocket.org');
ws.onopen = function (evt) {
console.log('Connection open ...');
ws.send('Hello WebSockets!');
};
ws.onmessage = function (evt) {
console.log('Received Message: ', evt.data);
ws.close();
};
ws.onclose = function (evt) {
console.log('Connection closed.');
};
複製代碼
fetch('/some/url/', {
method: 'get',
}).then(function (response) {
}).catch(function (err) {
// 出錯了,等價於 then 的第二個參數,但這樣更好用更直觀
});
複製代碼