1. <script type="text/javascript" src="./whenReady.js"></script>
  2. <script type="text/javascript">
  3. /**
  4. * 一:跨域请求
  5. *
  6. * 这个常见的JavaScript模块查询有href属性但没有title属性的所有<a>元素
  7. * 并给他们注册onmouseover事件处理程序
  8. * 这个事件处理程序使用XMLHttpRequest HEAD请求取得链接资源的详细信息
  9. * 然后把这些详细信息设置为链接的title属性
  10. * 这样他们将会在工具提示中显示
  11. */
  12.  
  13. whenReady(function(){
  14. //是否有机会使用跨域请求
  15. var supportCORS = (new XMLHttpRequest()).withCredentials !==undefined;
  16.  
  17. //遍历文档中的所有链接
  18. var links = document.getElementsByTagName('a');
  19. for(var i = 0 ; i < links.length ; i++){
  20. var link = links[i];
  21. if(!link.href)
  22. continue; //跳过没有超链接的锚点
  23. if(link.title)
  24. continue; //跳过已经有工具提示的链接
  25.  
  26. //如果这是一个跨域链接
  27. if(link.host !== location.host || link.protocol !== location.protocol){
  28. link.title = "站外链接"; //假设我们不能得到任何信息
  29. if(!supportCORS)
  30. continue; //如果没有CORS支持就退出
  31. //否则,我们能了解这个链接的更多信息
  32. //所以继续前进,注册事件处理程序,于是我们可以尝试
  33. }
  34.  
  35. //注册事件处理程序,当鼠标悬停下载链接详细信息
  36. if(link.addEventListener)
  37. link.addEventListener("mouseover",mouseoverHandler,false);
  38. else
  39. link.attachEvent("mouseover",mouseoverHandler);
  40. }
  41.  
  42. function mouseoverHandler(e){
  43. var link = e.target || e.srcElement; //<a>元素
  44. var url = link.href; //链接url
  45.  
  46. var req = new XMLHttpRequest(); //新请求
  47. req.open("HEAD",url); //仅仅询问头信息
  48. req.onreadystatechange = function(){ //事件处理程序
  49. if(req.readyState !== 4)
  50. return; //如果未完成,直接返回
  51. if(req.status ===200){ //如果成功
  52. var type = req.getResponseHeader("Content-Type"); //获取链接的详细情况
  53. var size = req.getResponseHeader("Content-Length");
  54. var data = req.getResponseHeader("Last-Modified");
  55.  
  56. //在工具提示中显示详细信息
  57. link.title = "类型:"+type+"\n"+"大小:"+size+"\n"+"时间:"+date;
  58. }else{
  59. //如果请求失败,且链接没有“站外链接”的工具提示
  60. //那么显示这个错误
  61. if(!link.title)
  62. link.title = "Couldn't fetch details:\n"+req.status+" "+req.statusText;
  63. }
  64. };
  65. req.send(null);
  66.  
  67. //移除处理程序,仅想一次获取这些头信息
  68. if(link.removeEventListener)
  69. link.removeEventListener("mouseover",mouseoverHandler,handler);
  70. else
  71. link.detachEvent("onmouseover",mouseoverHandler);
  72. }
  73. });
  74.  
  75. /**
  76. * 二:借助<script>发送http请求:JSONP
  77. *根据指定的url发送一个JSONP请求
  78. *然后把解析得到的响应数据传递给回调函数
  79. *在URL添加一个名为jsonp的查询参数,用于指定请求的回调函数的名称
  80. */
  81. function getJSONP(url,callback){
  82. //为本次请求创建一个唯一的回调函数名称
  83. var cbnum = "cb"+getJSONP.counter+++; //每次自增计数器
  84. var cbname = "getJSONP."+cbnum; //作为JSONP函数的属性
  85.  
  86. //将回调函数名称一以表单编码的形式添加到URL的查询部分中
  87. //使用jsonp作为参数名,一些支持JSONP的服务
  88. //可能使用其他的参数名,比如:callback
  89. if(url.indexOf("?") === -1 ) //url没有查询部分
  90. url+="?jsonp="+cbname; //作为查询部分添加参数
  91. else //否则
  92. url += "&jsonp"+cbname; //作为新的参数添加它
  93.  
  94. //创建script元素用于发送请求
  95. var script = document.createElement("script");
  96.  
  97. //定义将被脚本执行的回调函数
  98. getJSONP[cbnum] = function(response){
  99. try{
  100. callback(response); //处理响应数据
  101. }
  102. finally{ //即使回调函数或响应抛出错误
  103. delete getJSONP[cbnum]; //删除给函数
  104. script.parentNode.removeChild(script); //移除script元素
  105. }
  106. };
  107. //立即出发http请求
  108. script.src = url; //设置脚本的url
  109. document.body.appendChild(script); //把它添加都文档中
  110. }
  111. getJSONP.counter = 0; //用于创建唯一回调函数名称的计数器
  112. </script>

  

JavaScript跨域请求和jsonp请求实例的更多相关文章

  1. XHR的跨域请求和JSONP详解

    首先:什么是跨域? Cross Domain Request:从一个资源请求另一个资源,二者所在的请求地址不同,域名不同.端口号不同.请求协议不同. 它是由浏览器的同源策略造成的,是浏览器对JavaS ...

  2. JavaScript跨域调用、JSONP、CORS与ASP.NET Web API[共8篇]

    [第1篇] 同源策略与JSONP 浏览器是访问Internet的工具,也是客户端应用的宿主,它为客户端应用提供一个寄宿和运行的环境.而这里所说的应用,基本是指在浏览器中执行的客户端JavaScript ...

  3. JavaScript 跨域:谈谈跨域之 JSONP

    在 Web 开发中,后台开发人员应该会通常遇到这个问题:跨域,而使用 JSONP 就是其中解决办法之一,当然,还有其它解决方法,比如:window.name.window.postMessage.CO ...

  4. thinkphp,javascript跨域请求解决方案

    javascript跨域请求解决方案 前言 对于很多前端或者做混合开发的同学,我们难免会遇到跨域发起请求业务,比如A站点向B站点请求数据等等.由于最近要做一个站点集群的项目,所以具体业务要求很多个站点 ...

  5. jQuery(三) javascript跨域问题(JSONP解决)

    加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...

  6. JSONP跨域的script标签请求为什么不受同源策略的限制?

    在复习跨域的时候,复习到了JSONP跨域,大家都知道JSONP跨域是通过动态创建script标签,然后通过其src属性进行跨域请求的,前端需要一个数据处理的回调函数,而服务端需要配合执行回调函数,放入 ...

  7. javascript 跨域问题 jsonp

    转载:http://www.cnblogs.com/choon/p/5393682.html demo 用动态创建<script></script>节点的方式实现了跨域HTTP ...

  8. 说一说javascript跨域和jsonp

    同源策略 在浏览器的安全策略中“同源策略”非常如雷贯耳,说的是协议.域名.端口相同则视为同源,域名也可换成IP地址,不同源的页面脚本不能获取对方的数据. 要是想使用XMLHttpRequest或者常规 ...

  9. JavaScript 跨域漫游

    前言: 最近在公司做了几个项目都涉及到了iframe,也就是在这些iframe多次嵌套的项目中,我发现之前对iframe的认识还是比较不足的,所以就静下心来,好好整理总结了iframe的相关知识:&l ...

随机推荐

  1. More 3D Graphics (rgl) for Classification with Local Logistic Regression and Kernel Density Estimates (from The Elements of Statistical Learning)(转)

    This post builds on a previous post, but can be read and understood independently. As part of my cou ...

  2. Spring Boot 学习(3)

    文 by / 林本托 Tips 做一个终身学习的人. Tips 代码路径:https://github.com/iqcz/Springbootdemo/tree/master/code01/ch3 W ...

  3. 点评阿里JAVA手册之异常日志(异常处理 日志规约 )

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...

  4. JavaScript设计模式_03_代理模式

    代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子.但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处.在我看来,代理模式最 ...

  5. 关于JQuery获取宽度和高度在chrome和IE下的不同

    之前写了一个关于滚动条的东西,可是在写的时候发现JQuery在获取宽度和高度时在不同浏览器中是不一样的,下面发一下代码给给位看官先展示一下: $(function(){ $("#main&q ...

  6. Hybrid App开发之jQuery基础

    前言: 前面学习了JavaScript/Html/Css的基础知识,今天学习一下常用js框架jQuery的使用进行快速的开发. JQuery的基本功能: 方位和操作DOM元素 控制页面样式 对页面事件 ...

  7. js实现整数转化为小数

    toFixed 方法 返回一个字符串,代表一个以定点表示法表示的数字. number .toFixed(i) 参数 bumber 必选项.一个 Number 对象. i 可选项.小数点 后的数字位数. ...

  8. 简单介绍phpcms以及phpcms如何安装?

    一.先大体介绍一下phpcms,及存放位置 1.将phpcms放在www目录下的phpcms,并解压 其中,readme 没什么用,重要的是install_package; 2.打开install_p ...

  9. ClassLoader机制:一个类何时会被虚拟机初始化?

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 大家都知道Java程序被编译器编译成字节码文件保存在硬盘里,Java虚拟机在执行代码时首先要把编译后的字节码文件从硬盘加载到内存中,然后才 ...

  10. scrapy代理的设置

    scrapy代理的设置 在我的上一篇文章介绍了scrapy下载器中间件的使用,这里的scrapyIP的代理就是用这个原理实现的,重写了下载器中间件的process_request(self,reque ...