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 相关文章推荐
script标签属性type与language使用选择
Dec 02 Javascript
jQuery获取和设置表单元素的方法
Feb 14 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
学习JavaScript设计模式之策略模式
Jan 12 Javascript
详解JS正则replace的使用方法
Mar 06 Javascript
分享JS数组求和与求最大值的方法
Aug 11 Javascript
如何提高javascript加载速度
Dec 26 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
Feb 05 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
Sep 20 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检测数组长度函数sizeof与count用法
2014/11/17 PHP
php导入模块文件分享
2015/03/17 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
Javascript 对象的解释
2008/11/24 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
python通过文件头判断文件类型
2015/10/30 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
python pycharm的安装及其使用
2019/10/11 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
html5弹跳球示例代码
2013/07/23 HTML / CSS
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
英文版银行求职信
2013/10/09 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
小学教师个人总结
2015/02/05 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
个人道歉信大全
2019/04/11 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers