注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

类AJAX应用,JAVASCRIPT跨域访问  

2010-05-14 09:04:00|  分类: js |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://blog.chinaunix.net/u/25176/showart_437066.html

我这里有一个类似AJAX应用,关键技术是在<script>标签的src属性的应用。

请大家看以下HTML代码

<HTML>  <HEAD>  <title>异步json例子</title>  <SCRIPT LANGUAGE="JavaScript">  function test(){      var s = document.createElement("SCRIPT");      s.id="cgi_emotion_list";       document.getElementsByTagName("HEAD")[0].appendChild(s);      s.src="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";     // test=function(){};   }  function visitCountCallBack(data){      document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("cgi_emotion_list"));       for(var i in data){          var e =document.getElementById(i);          if(e) e.innerHTML=data[i];      }  }  </SCRIPT>  </HEAD>  <BODY>  <button onclick="test()">test</button><BR>  历史访问人数:<span id="visitcount" style="color:#6600CC">点击test按钮获取数据</span><BR>  今天访问人数:<span id="dayvisit" style="color:#CC6633">点击test按钮获取数据</span><BR>  阳光指数:<span id="sun" style="color:red">点击test按钮获取数据</span><BR>  
爱心指数:<span id="love" style="color:violet">点击test按钮获取数据</span><BR>  雨露指数:<span id="rain" style="color:blue">点击test按钮获取数据</span><BR>  营养指数:<span id="nutri" style="color:green">点击test按钮获取数据</span><BR>  花匠级别:<span id="gardener" style="color:#996633">点击test按钮获取数据</span>  </BODY>  </HTML>
 
大家可以把上面的代码拷贝到本地用IE或FIREFOX打开.点击按钮。
发现不刷新页面,实现了动态的效果,而且返回的数据是跨域得到了,大家知道JAVASCRIPT是不能跨域访问的,很奇妙吧。。。。
仔细研究代码发现了其中的奇妙之处
这段代码:
    var s = document.createElement("SCRIPT");      s.id="cgi_emotion_list";       document.getElementsByTagName("HEAD")[0].appendChild(s);      s.src="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";  
浏览器通过DOM解析得到了SCRIPT元素,然后添加了ID和SRC属性。
我这里是W3C规范中对SCRIPT元素SRC属性的官方解释:

The element allows authors to include dynamic script in their documents.

When the src attribute is set, the element refers to an external file. The value of the attribute must be a URI (or IRI).

If the attribute is not set, then the script is given by the contents of the element.

解释为:

如果定义了SCRIPT标签的SRC属性,SCRIPT标签涉及到一个外部文件,属性值必须是一个URL。

也就是说SCRIPT将从此URL引用文件的内容。

大家在浏览器中访问此连接:http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456

这个类似JAVA的SERVLET的URL返回以下数据:

visitCountCallBack
({"visitcount":65188579,
  "dayvisit":8658,
  "spacemark":0,
  "markchange":0,
  "sun":1680,
  "love":478,
  "rain":1680,
  "nutri":1450,
  "level":5,
  "gardener":1});

这个字符串是一个JAVASCRIPT函数,输入是一个JSON字符串。这个数据返回的同时调用了上面的另一个JAVASCRIPT函数:

function visitCountCallBack(data){ document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("cgi_emotion_list")); for(var i in data){ var e =document.getElementById(i); if(e) e.innerHTML=data[i]; } }

函数中用innerHTML吧返回的JSON数据填充到BODY中,实现了不刷新页面得到数据的异步的效果。

 

还有一个关键的问题:

http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456

是QQ空间的一个URL(uin是QQ号码,大家可以输入自己的QQ号码试试),JAVASCRIPT调用了其他域的数据。

 

这样的方式得到数据比较简单,也能跨域访问数据,比较适合一些简单的,小的无刷新的效果。

 

本人有些担心的是,如果哪天浏览器一更新,拒绝这种访问方式,可能这样得到数据就变得不可用了,

建议大家谨慎使用这种方法!!!

 发表于: 2007-12-06,修改于: 2008-09-02 20:03 已浏览4019次,有评论4条 推荐 投诉

  网友评论
  本站网友 时间:2008-03-08 10:42:51 IP地址:222.68.42.★
不错。我今天早晨突然想到这种方法,然后就上网找了一下。果然已经有人实现了。呵呵,真是英雄所见略同啊。
另外,我猜用image对象也是可以做到的。

  本站网友 时间:2008-03-08 10:50:40 IP地址:222.68.42.★
但是上面的方法局限性很大,要求url的返回结果必须是一个合法的js。这就要求我们必须控制双方的站点。

  liugao_0614 时间:2008-03-09 09:57:47 IP地址:222.129.29.★
刚刚才发现,QQ站点已经把这个接口给封闭了,正如楼上网友所说,必须提供SRC的站点保持接口不变,我觉得,其实这样的方法比较适合于一个企业各个应用系统之间的跨域访问。。

  本站网友 时间:2010-01-16 11:25:57 IP地址:211.101.132.★
我粘贴到浏览器。。实现不了效果..

Blog作者的回复:
现在腾讯已经关闭了http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456这个接口,所以得不到数据

  评论这张
 
阅读(408)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017