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 相关文章推荐
Prototype使用指南之selector.js
Jan 10 Javascript
Javascript 键盘事件的组合使用实现代码
May 04 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
jquery ajax post提交数据乱码
Nov 05 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
Aug 25 Javascript
js注入 黑客之路必备!
Sep 14 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
Oct 27 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
Dec 08 Javascript
vue实现微信二次分享以及自定义分享的示例
Mar 20 Javascript
layui table 列宽百分比显示的实现方法
Sep 28 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统计文章排行示例
2014/03/04 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
EasyUI中的tree用法介绍
2011/11/01 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
Python 私有函数的实例详解
2017/09/11 Python
django中related_name的用法说明
2020/05/20 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
造型师求职自荐信
2013/09/27 职场文书
自荐信如何制作?
2014/02/21 职场文书
领导班子对照检查材料
2014/09/22 职场文书
高中教师个人总结
2015/02/10 职场文书
借款民事起诉状范文
2015/05/19 职场文书
小学运动会加油稿
2015/07/22 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS