通信是在面试中,作为考验各位知识面广度的重要方式;当然它也可以问的很细:从基本原理到代码实现;再到兼容性的问题。
参考文档: 前端跨越通信的几种方式
Ajax的实现:
请一定要考虑到兼容性问题;
状态码请自行百度咯:
1 var ajax = function(param) { 2 // 兼容性问题 3 var xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 4 // 获取参数 5 var type = param.type.toUpperCase(); 6 var url = param.url; 7 if (!url) { 8 return 9 } 10 var data = param.data, 11 dataArr = []; 12 // 拼接请求字段 13 for (var k in data) { 14 dataArr.push(k + '=' + data[k]); 15 } 16 if (type == 'GET') { 17 url = url + '?' + dataArr.join('&'); 18 xhr.open(type, url); 19 xhr.send(); 20 } else { 21 xhr.open(type, url); 22 xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 23 xhr.send(dataArr.join('&')); 24 } 25 // 请求成功的监听 26 xhr.onload = function() { 27 // 对http状态码的验证 28 // 不要忽视了304,其含义代表资源重定向,即利用本地缓存; 如果其他的请求情况 可能还需要添加其他的请求状态码(如请求数据量较大的媒体资源,使用206) 29 if (xhr.status === 200 || xhr.status === 304) { 30 var res; 31 if (opt.success && opt.success instanceof Function) { 32 res = xhr.responseText; 33 if (typeof res === 'string') { 34 res = JSON.parse(res); 35 opt.success.call(xhr, res); 36 } 37 } 38 } else { 39 if (opt.error && opt.error instanceof Function) { 40 opt.error.call(xhr, res); 41 } 42 } 43 } 44 }
jsonp 的跨越通信:
jsonp本质上就是利用HTML元素中script标签的异步加载来实现的
通过加载script标签的方式去发送一个请求,然后返回一个js块,这个块中有:回调函数名 和 代码
例如: 有着这样的一个script标签:
<script src="http://www.baidu.com?data=name&callbcak=jsonp" charset="utf-8">
那么就会返回:
<script>
jsonp({
data:{}
....
})
</script>
代码实现:
1 function jsonp(url, data = {}, callback = "callback") { 2 data.callback = callback; 3 url = url.replace(/?$/g, ''); 4 var params = []; 5 // 拼接请求字段 6 for (const k in data) { 7 params.push(k + '=' + data[k]); 8 } 9 params.join('&'); 10 // 创建script标签 11 var script = document.createElement('script'); 12 script.src = url + '?' + params.join('&'); 13 document.body.appendChild(script); 14 // 创建Promise对象进行处理 15 return new Promise((resolve, reject) => { 16 window[callback] = (data) => { 17 try { 18 resolve(data) 19 } catch (e) { 20 reject(e) 21 } finally { 22 // 最后一定要移除元素 23 script.parentNode.removeChild('script'); 24 } 25 } 26 }) 27 }