js实现跨域的几种方法汇总(图片ping、JSONP和CORS)


Posted in Javascript onOctober 25, 2015

跨域

虽然有同源策略的存在,但是在js中跨域也依然很常见,有document.domain、window.name、图片ping、jsonp、CORS,在这里简单总结下图片ping、jsonp和CORS备忘。

图片ping

图片可以从任何URL中加载,所以将img的src设置成其他域的URL,即可以实现简单的跨域,可以使用onload和onerror事件来确定是否接受到了响应。

var img=new Image();
img.src='https://3water.com';
img.onerror=function(){
 alert('error');
}
img.onload=function(){
 alert('success');
}

这里新建了一个img对象,给出的url是博客地址,这里是个error事件,所以弹出error;如果将URL改为一张图片http://images.3water.com//710118/o_MacBook%20Air.png,就会弹出onload加载信息success,从而实现了简单的跨域。

使用图片ping跨域只能发送get请求,并且不能访问响应的文本,只能监听是否响应而已,可以用来追踪广告点击。

jsonp

jsonp是带有回调函数callback的json,原名json with padding,翻译是填充式json,参数式json。

因为script的src可以跨域,所以在发送的URL后添加一个callback参数传递给服务器,然后服务器返回的数据会作为callback的参数,因为这个callback是我们自己来实现的,所以可以对接受到的json数据进行处理。

简单代码如下:

<script type="text/javascript">
function call(data){
 alert(data.city);
}
</script>
<script type="text/javascript" src='http://freegeoip.net/json/?callback=call'></script>

这里,我们把脚本的src设置为http://freegeoip.net/json/?callback=call,这是一个获取用户ip地址的api(有兴趣的可以点击这里查看),然后将callback作为一个参数拼接在URL后,返回的json数据就会作为callback的参数,在这里callback我们定义为call函数,即返回的json数据就会作为call的参数传进去,这个call函数仅仅弹出用户的城市city。笔者这里的输出结果是河北。其他ip信息可以查看官网,上面有详细的列表,比如country_name,time_zone等。

CORS(跨资源共享)

CORS是跨资源共享,cross site resourse sharing,它和ajax其实是大体相同的,对于ie实例化的是xdr对象,XDomainRequest,我们能访问的也只有responseText,触发的事件有load和error,写法和xhr大体相同,也需要open和send。

对于ff,chrome等其他浏览器实例化的是xhr,在这里myvin仅仅拿xhr来演示下,如果要实现跨浏览器,可以配合xdr实现兼容。

xhr如下:

var xhr=new XMLHttpRequest();   
var url="https://3water.com";
xhr.open('GET', url); 
xhr.send(null);

这里使用的url是https://3water.com,和ajax唯一的区别就是url使用的是跨域的绝对地址,在ajax中使用的本页面内的相对地址或绝对地址。

看一下控制台,这里用的是ff40.0.3,显示信息如下:

已阻止跨源请求:同源策略禁止读取位于 https://3water.com 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。

所以用CORS实现跨域还有一步要做,就是在服务器端设置Access-Control-Allow-Origin。

Javascript 相关文章推荐
用 JSON 处理缓存
Apr 27 Javascript
ExtJS 2.0实用简明教程 之ExtJS版的Hello
Apr 29 Javascript
javascript学习笔记(三) String 字符串类型介绍
Jun 19 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
JS判断字符串包含的方法
May 05 Javascript
JavaScript jquery及AJAX小结
Jan 24 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
May 18 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
Sep 05 Javascript
浅谈基于Vue.js的移动组件库cube-ui
Dec 20 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
Jul 15 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
Sep 02 Javascript
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
详解JavaScript编程中的数组结构
Oct 24 #Javascript
向JavaScript的数组中添加元素的方法小结
Oct 24 #Javascript
jQuery实现鼠标经过事件的延时处理效果
Aug 20 #Javascript
使用jquery动态加载Js文件和Css文件
Oct 24 #Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 #Javascript
使用javaScript动态加载Js文件和Css文件
Oct 24 #Javascript
js判断日期时间有效性的方法
Oct 24 #Javascript
You might like
PHP代码审核的详细介绍
2013/06/13 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
jquery对表单操作2
2011/04/06 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
上海微创软件面试题
2012/06/14 面试题
无传销社区工作方案
2014/05/13 职场文书
工作求职信
2014/07/04 职场文书
2014年科协工作总结
2014/12/09 职场文书
入党现实表现材料
2014/12/23 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
Win11快速关闭所有广告推荐
2022/04/19 数码科技