前端通信的方式

通信是在面试中,作为考验各位知识面广度的重要方式;当然它也可以问的很细:从基本原理到代码实现;再到兼容性的问题。 

 参考文档: 前端跨越通信的几种方式

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 }
原文地址:https://www.cnblogs.com/xuhua123/p/11502545.html