跳转到内容
新建笔记

Ajax

AJAX不是JavaScript的规范,Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。

// 默认情况下,JavaScript在发送AJAX请求时,URL的域名必须和当前页面完全一致。
async function get(url) {
let resp = await fetch(url);
let result = await resp.text();
return result;
}
// 发送异步请求:
get('./content.html').then(data => {
let textarea = document.getElementById('fetch-response-text');
textarea.value = data;
});

那是不是用JavaScript无法请求外域(就是其他网站)的URL了呢?方法还是有的,大概有这么几种:

  • 通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash,并且跟Flash交互。不过Flash用起来麻烦,而且现在用得也越来越少了。

  • 通过在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器:

    '/proxy?url=https://www.sina.com.cn'
  • JSONP,它有个限制,只能用GET请求,并且要求返回JavaScript。这种方式跨域实际上是利用了浏览器允许跨域引用JavaScript资源

    <html>
    <head>
    <script src="http://example.com/abc.js"></script>
    ...
    </head>
    <body>
    ...
    </body>
    </html>
    // JSONP通常以函数调用的形式返回,例如,返回JavaScript内容如下:
    foo('data');
  • CORS,CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。

    Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查Access-Control-Allow-Origin是否包含本域,如果是,则此次跨域请求成功,如果不是,则请求失败,JavaScript将无法获取到响应的任何数据。

    image-20240811011354104

    假设本域是my.com,外域是sina.com,只要响应头Access-Control-Allow-Origin为http://my.com,或者是*,本次请求就可以成功。