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 相关文章推荐
JS解密入门之凭直觉解
Jun 25 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
Dec 19 Javascript
轻轻松松学JS调试(不下载任何工具)
Apr 14 Javascript
Javascript合并表格中具有相同内容单元格示例
Aug 11 Javascript
jquery固定底网站底部菜单效果
Aug 13 Javascript
jquery获取选中的文本和值的方法
Jul 08 Javascript
javascript实现分栏显示小技巧附图
Oct 13 Javascript
jQuery对象初始化的传参方式
Feb 26 Javascript
Angular.JS学习之依赖注入$injector详析
Oct 20 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
AngularJS 控制器 controller的详解
Oct 17 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
Aug 22 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中使用Oracle数据库(4)
2006/10/09 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP反射API示例分享
2016/10/08 PHP
php 多文件上传的实现实例
2016/10/23 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
js 设置选中行的样式的实现代码
2010/05/24 Javascript
JS定时器实例
2013/04/17 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
敏捷开发的主要原则都有哪些
2015/04/26 面试题
酒店led欢迎词
2014/01/09 职场文书
学校标语大全
2014/06/19 职场文书
mysql数据库隔离级别详解
2022/06/16 MySQL