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 相关文章推荐
如何做到打开一个页面,过几分钟自动转到另一页面
Apr 20 Javascript
jquery实现文字由下到上循环滚动的实例代码
Aug 09 Javascript
javascript获得网页窗口实际大小的示例代码
Sep 21 Javascript
javascript获取URL参数与参数值的示例代码
Dec 20 Javascript
JQuery中使用.each()遍历元素学习笔记
Nov 08 Javascript
理解javascript中的原型和原型链
Jul 30 Javascript
JS+CSS实现精美的二级导航效果代码
Sep 17 Javascript
基于jQuery倒计时插件实现团购秒杀效果
May 13 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
Aug 28 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 Javascript
vue-cli4使用全局less文件中的变量配置操作
Oct 21 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迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
Python 使用多属性来进行排序
2019/09/01 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
大学同学会活动方案
2014/08/20 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
新闻稿格式范文
2015/07/18 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python