什么是跨域
概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。而跨域是指从一个域名的网页去请求另一个域名的资源。例如从www.baidu.com
页面请求www.bing.com
的资源就被视为跨域。而因为浏览器的同源策略,会对跨域请求进行限制于是就有了跨域问题的出现。同源,指的是协议、域名、端口号都必须完全相同跨域的处理
方法一:服务器代理
因为限制只存在于浏览器中,在其他环境下是不存在的,服务器中中自然也不存在,所以只需要在服务器做好请求代理,请求变成同源的自然就不存在问题了。方法二:jsonp
虽然浏览器有同源限制,但是有三个标签是不符合这种限制的<img>
的src(获取图片),<link>
的href(获取css),<script>
的src(获取javascript),这是由他们的自身特性所决定的。而jsonp,就是利用了script标签不限制同源的特点来实现的。
小例子:百度搜索框(边输入边提示)效果 ↓ ↓ ↓
布局
只需要一个ul
即可,其他全部通过代码动态添加<body> <input type="text" id="input" /> <ul id="list"></ul> </body>
js代码
function fn(data) { var list = document.getElementById('list'); var html = ''; if (data.s.length) { list.style.display = 'block'; for (var i = 0; i < data.s.length; i++) { html += '<li>' + data.s[i] + '</li>' } list.innerHTML = html; } } window.onload = function () { var input = document.getElementById('input'); var list = document.getElementById('list'); input.onkeyup = function () { //判断输入框不为空时创建script标签,并把请求的接口文件写入src if (this.value != '') { var script = document.createElement('script'); script.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=' + input.value + '&cb=fn'; document.body.appendChild(script) } else { list.style.display = 'none' } } }
效果↓ ↓ ↓
jsonp是一种常用的跨域方式,目前有很多前端的jsonp请求封装,它们通过通过动态创建script标签来实现,我们可以直接调用。jsonp方式兼容所有的浏览器,但是只支持get请求。方法三:XHR2(了解即可)
HTML5提供的XMLHttpRequest Level 2已经实现了跨域访问以及其他的一些新功能
这需要在远程服务器端添加如下代码header('Access-Control-Allow-Origin:*'); //*代表可访问的地址,可以设置指定域名 header('Access-Control-Allow-Methods:POST,GET');
这样在客户端使用常规的AJAX代码即可。
因为IE10以下版本的浏览器都不支持,在最近的几年可能不会大量的使用,或许以后会火起来吧
Ajax的跨域处理
最新推荐文章于 2024-08-12 12:09:40 发布