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 相关文章推荐
dojo 之基础篇
Mar 24 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 Javascript
js中设置元素class的三种方法小结
Aug 28 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
jquery easyui combobox模糊过滤(示例代码)
Nov 30 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
基于jquery实现简单的手风琴特效
Nov 24 Javascript
获取input标签的所有属性的方法
Jun 28 Javascript
通过实例学习React中事件节流防抖
Jun 17 Javascript
vue实现select下拉显示隐藏功能
Sep 30 Javascript
Vue 实现简易多行滚动&quot;弹幕&quot;效果
Jan 02 Javascript
React-vscode使用jsx语法的问题及解决方法
Jun 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 安全过滤函数代码
2011/05/07 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
2016/10/29 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
Angularjs 基础入门
2014/12/26 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
Python break语句详解
2014/03/11 Python
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
python Django批量导入不重复数据
2016/03/25 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
Python 多线程Threading初学教程
2017/08/22 Python
Python文件和流(实例讲解)
2017/09/12 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
一句话工作感言
2014/03/01 职场文书
承诺书怎么写
2014/03/26 职场文书
企业安全标语
2014/06/07 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
2014年档案室工作总结
2014/12/01 职场文书
运动会通讯稿200字
2015/07/20 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
JavaScript canvas实现流星特效
2021/05/20 Javascript