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动态加载三
Aug 22 Javascript
ie支持function.bind()方法实现代码
Dec 27 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
Nov 22 Javascript
jQuery搜索子元素的方法
Feb 10 Javascript
AngularJs动态加载模块和依赖注入详解
Jan 11 Javascript
jQuery.form插件的使用及跨域异步上传文件
Apr 27 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
Jun 07 Javascript
Javascript使用function创建类的两种方法(推荐)
Nov 19 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
Jan 08 Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
Mar 28 Javascript
javascript局部自定义鼠标右键菜单
Dec 08 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设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
简单的php文件上传(实例)
2013/10/27 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
js实现点赞效果
2020/03/16 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
linux下安装easy_install的方法
2013/02/10 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
现场施工员岗位职责
2014/03/10 职场文书
法学专业求职信
2014/07/15 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
情感电台广播稿
2015/08/18 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis