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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
JS维吉尼亚密码算法实现代码
Nov 09 Javascript
JS版的date函数(和PHP的date函数一样)
May 12 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
JavaScript实现将UPC转换成ISBN的方法
May 26 Javascript
node.js路径处理方法以及绝对路径详解
Mar 04 Javascript
bootstrapValidator表单验证插件学习
Dec 30 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
vue element项目引入icon图标的方法
Jun 06 Javascript
js实现盒子滚动动画效果
Aug 09 Javascript
在vue中使用image-webpack-loader实例
Nov 12 Javascript
详解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学习笔记之二 php入门知识
2011/01/12 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
跟老齐学Python之集合(set)
2014/09/24 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
django ORM之values和annotate使用详解
2020/05/19 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
工作自我评价分享
2013/12/01 职场文书
毕业生的求职信范文分享
2013/12/04 职场文书
团拜会主持词
2015/07/04 职场文书
给领导敬酒词
2015/08/12 职场文书
合作合同协议书
2016/03/21 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
Python 语言实现六大查找算法
2021/06/30 Python