JavaScript跨域请求和jsonp请求实例
<script type="text/javascript" src="./whenReady.js"></script>
<script type="text/javascript">
/**
* 一:跨域请求
*
* 这个常见的JavaScript模块查询有href属性但没有title属性的所有<a>元素
* 并给他们注册onmouseover事件处理程序
* 这个事件处理程序使用XMLHttpRequest HEAD请求取得链接资源的详细信息
* 然后把这些详细信息设置为链接的title属性
* 这样他们将会在工具提示中显示
*/ whenReady(function(){
//是否有机会使用跨域请求
var supportCORS = (new XMLHttpRequest()).withCredentials !==undefined; //遍历文档中的所有链接
var links = document.getElementsByTagName('a');
for(var i = 0 ; i < links.length ; i++){
var link = links[i];
if(!link.href)
continue; //跳过没有超链接的锚点
if(link.title)
continue; //跳过已经有工具提示的链接 //如果这是一个跨域链接
if(link.host !== location.host || link.protocol !== location.protocol){
link.title = "站外链接"; //假设我们不能得到任何信息
if(!supportCORS)
continue; //如果没有CORS支持就退出
//否则,我们能了解这个链接的更多信息
//所以继续前进,注册事件处理程序,于是我们可以尝试
} //注册事件处理程序,当鼠标悬停下载链接详细信息
if(link.addEventListener)
link.addEventListener("mouseover",mouseoverHandler,false);
else
link.attachEvent("mouseover",mouseoverHandler);
} function mouseoverHandler(e){
var link = e.target || e.srcElement; //<a>元素
var url = link.href; //链接url var req = new XMLHttpRequest(); //新请求
req.open("HEAD",url); //仅仅询问头信息
req.onreadystatechange = function(){ //事件处理程序
if(req.readyState !== 4)
return; //如果未完成,直接返回
if(req.status ===200){ //如果成功
var type = req.getResponseHeader("Content-Type"); //获取链接的详细情况
var size = req.getResponseHeader("Content-Length");
var data = req.getResponseHeader("Last-Modified"); //在工具提示中显示详细信息
link.title = "类型:"+type+"\n"+"大小:"+size+"\n"+"时间:"+date;
}else{
//如果请求失败,且链接没有“站外链接”的工具提示
//那么显示这个错误
if(!link.title)
link.title = "Couldn't fetch details:\n"+req.status+" "+req.statusText;
}
};
req.send(null); //移除处理程序,仅想一次获取这些头信息
if(link.removeEventListener)
link.removeEventListener("mouseover",mouseoverHandler,handler);
else
link.detachEvent("onmouseover",mouseoverHandler);
}
}); /**
* 二:借助<script>发送http请求:JSONP
*根据指定的url发送一个JSONP请求
*然后把解析得到的响应数据传递给回调函数
*在URL添加一个名为jsonp的查询参数,用于指定请求的回调函数的名称
*/
function getJSONP(url,callback){
//为本次请求创建一个唯一的回调函数名称
var cbnum = "cb"+getJSONP.counter+++; //每次自增计数器
var cbname = "getJSONP."+cbnum; //作为JSONP函数的属性 //将回调函数名称一以表单编码的形式添加到URL的查询部分中
//使用jsonp作为参数名,一些支持JSONP的服务
//可能使用其他的参数名,比如:callback
if(url.indexOf("?") === -1 ) //url没有查询部分
url+="?jsonp="+cbname; //作为查询部分添加参数
else //否则
url += "&jsonp"+cbname; //作为新的参数添加它 //创建script元素用于发送请求
var script = document.createElement("script"); //定义将被脚本执行的回调函数
getJSONP[cbnum] = function(response){
try{
callback(response); //处理响应数据
}
finally{ //即使回调函数或响应抛出错误
delete getJSONP[cbnum]; //删除给函数
script.parentNode.removeChild(script); //移除script元素
}
};
//立即出发http请求
script.src = url; //设置脚本的url
document.body.appendChild(script); //把它添加都文档中
}
getJSONP.counter = 0; //用于创建唯一回调函数名称的计数器
</script>
JavaScript跨域请求和jsonp请求实例的更多相关文章
- XHR的跨域请求和JSONP详解
首先:什么是跨域? Cross Domain Request:从一个资源请求另一个资源,二者所在的请求地址不同,域名不同.端口号不同.请求协议不同. 它是由浏览器的同源策略造成的,是浏览器对JavaS ...
- JavaScript跨域调用、JSONP、CORS与ASP.NET Web API[共8篇]
[第1篇] 同源策略与JSONP 浏览器是访问Internet的工具,也是客户端应用的宿主,它为客户端应用提供一个寄宿和运行的环境.而这里所说的应用,基本是指在浏览器中执行的客户端JavaScript ...
- JavaScript 跨域:谈谈跨域之 JSONP
在 Web 开发中,后台开发人员应该会通常遇到这个问题:跨域,而使用 JSONP 就是其中解决办法之一,当然,还有其它解决方法,比如:window.name.window.postMessage.CO ...
- thinkphp,javascript跨域请求解决方案
javascript跨域请求解决方案 前言 对于很多前端或者做混合开发的同学,我们难免会遇到跨域发起请求业务,比如A站点向B站点请求数据等等.由于最近要做一个站点集群的项目,所以具体业务要求很多个站点 ...
- jQuery(三) javascript跨域问题(JSONP解决)
加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...
- JSONP跨域的script标签请求为什么不受同源策略的限制?
在复习跨域的时候,复习到了JSONP跨域,大家都知道JSONP跨域是通过动态创建script标签,然后通过其src属性进行跨域请求的,前端需要一个数据处理的回调函数,而服务端需要配合执行回调函数,放入 ...
- javascript 跨域问题 jsonp
转载:http://www.cnblogs.com/choon/p/5393682.html demo 用动态创建<script></script>节点的方式实现了跨域HTTP ...
- 说一说javascript跨域和jsonp
同源策略 在浏览器的安全策略中“同源策略”非常如雷贯耳,说的是协议.域名.端口相同则视为同源,域名也可换成IP地址,不同源的页面脚本不能获取对方的数据. 要是想使用XMLHttpRequest或者常规 ...
- JavaScript 跨域漫游
前言: 最近在公司做了几个项目都涉及到了iframe,也就是在这些iframe多次嵌套的项目中,我发现之前对iframe的认识还是比较不足的,所以就静下心来,好好整理总结了iframe的相关知识:&l ...
随机推荐
- SpringMVC实现账号只能在一处登陆
一.问题引导 在Web开发中,实现一个账号只能在一处登陆有两种形式:1.当某个账号在某处登陆后,如果再在其他处登陆,将前一个账号挤掉:2.当某个账号登陆后,此账号在其他设备登陆提示已经登陆,无法登陆. ...
- 关于饿了么在浏览器标签页失去焦点时网页Title改变的实现方法
说在前面:必须是基于支持H5的浏览器才可以 这个 API 本身非常简单,由以下三部分组成. document.hidden:表示页面是否隐藏的布尔值.页面隐藏包括 页面在后台标签页中 或者 浏览器最小 ...
- spring和hibernate的整合
阅读目录 一.概述 二.整合步骤 1.大致步骤 2.具体分析 一.概述 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory 2.让H ...
- 以太坊的crypto模块--以太坊源码学习
以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp2 ...
- python语言精粹《一》
第一章 静态语言:需要声明类型.变量不能改变类型! 动态语言:(也称脚本语言)主要的应用场景都是很短的应用程序(脚本),比如给静态语言编写的程序进行数据预处理.这样的程序通常也统称胶水代码. pyth ...
- .NET MVC页面生命周期及传统ASP.NET页面周期
目前我主要使用.Net MVC框架进行网页创建,数据库是MSSQL Server.所以,我就用.NET MVC框架的web页面周期来说明页面的生命周期,但是我觉着其他MVC框架也是大同小异的. 本文主 ...
- java(3) if结构
一.基本if结构 1.流程图 1)输入输出 2)判断和分支 3) 流程线 1.1 简单的if条件判断 if(表达式){ //表达式为true,执行{}中的代码 } 示例1:如 ...
- 关于Dubbo分布式服务
这篇文章写的详细,可参考 http://shiyanjun.cn/archives/1075.html
- asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010
using Microsoft.Office.Interop.Excel;//转换为excel时,需要引用此命名空间 using ET;//转换为wps时,需要引用此命名空间using KSO;//转 ...
- vue组件大集合 component
vue组件分为全局组件.局部组件和父子组件,其中局部组件只能在el定义的范围内使用, 全局组件可以在随意地方使用,父子组件之间的传值问题等. Vue.extend 创建一个组件构造器 template ...