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 相关文章推荐
javascript 的Document属性和方法集合
Jan 25 Javascript
Javascript学习笔记 delete运算符
Sep 13 Javascript
Highcharts 非常实用的Javascript统计图demo示例
Jul 03 Javascript
详解AngularJS中的表达式使用
Jun 16 Javascript
JavaScript实现网站访问次数统计代码
Aug 12 Javascript
TypeOf这些知识点你了解吗
Feb 21 Javascript
JS Array创建及concat()split()slice()的使用方法
Jun 03 Javascript
vue 实现复制内容到粘贴板clipboard的方法
Mar 17 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
May 08 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
Oct 20 Javascript
JS实现盒子拖拽效果
Feb 06 Javascript
VUE Elemen-ui之穿梭框使用方法详解
Jan 19 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 修改、增加xml结点属性的实现代码
2013/10/22 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
dojo随手记 gird组件引用
2011/02/24 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
python批量修改文件编码格式的方法
2018/05/31 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
详解python读取和输出到txt
2019/03/29 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
学生自我鉴定范文
2013/10/04 职场文书
销售自荐信
2013/10/22 职场文书
初中生三年学习生活的自我评价
2013/11/03 职场文书
公司离职证明标准范本
2014/10/05 职场文书
python 离散点图画法的实现
2022/04/01 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL