也来为自己的博客加个花,兼AJAX跨域的一点疑问。

     最近看了园子里许多朋友的博客,觉得他们都做得很好,写的也很好。学习了。
也看了Justin Young的一篇随笔JavaScript,咱也OO一把很不错,受了启发,有点想法,
也打算加一个类似本月最新随笔的东东,顺便也练练javascript。

 在这里取得是本人博客的RSS,然后取出本月的随笔作为最新随笔,
地址为 http://www.cnblogs.com/junyistar/rss
1程序里先构造XMLHTTPRequest
构造XMLHTTPRequest

2接着发送请求并处理返回(callserver函数),updatePage函数返回更新。
callserver函数
在CallServer里面遇到了有一个让我头疼的问题,关于javascript跨域的问题,
本来程序只请求了一个URL,为http://www.cnblogs.com/junyistar/rss
以www.cnblogs.com域名进来的访问我的网址没有问题,新随笔能正确显示。
如图
本月随笔

但是我本人经常以junyistar.cnblogs.com的域名进来,浏览器就会判断成是不同的域名,
IE就会报没有权限的错误。
问题就在于junyistar.cnblogs.com与www.cnblogs.com的父域相同,但浏览器里可能出于安全考虑会认为是两个域
并且不容许跨域访问。
首先想到固定域名的方法,即在head区域加上
<script language="JavaScript">
<!--
document.domain = "cnblogs.com"; //指定 document 所属的域
-->
</script>
实验结果:失败~
上网查到原因:只有把上面的声明加入到需要进行数据交换的所有文件中才会有效,只在一个域的文件中加入上面的声明是不起作用的。所以我单方面加这个是不起作用的。pass。

转而上网又查了常用的跨站访问的方法,常用的有3种:
1在同一域的服务器端建立一个代理,浏览器向该代理网址发送请求,
然后该代理向其他域的网址发请求,在获取回复后,或作处理或按原样发回到浏览器 。  
2使用按需(On-Demand) Javascript 脚本。在页面内动态生成新的<script>,将其src属性指向别的网站的网址,
这个网址返回的内容必须是合法的Javascript脚本,常用的是JSON消息。   
3使用IFRAME。在页面内嵌或动态生成指向别的网站的IFRAME,
然后这2个网页间可以通过改变对方的anchor hash fragment来传输消息。

感觉前两个都需要服务器端做返回页面的操作,然后转而以我的理解用第三种操作,
就是在页面里嵌入一个指向我自己rss的iframe
如下:<iframe src="http://www.cnblogs.com/junyistar/rss" width="0" height="0" name="junyistar" id="junyistar"/>
这样应该不会有跨域的问题了,然后试图用dom操作取得iframe里的内容
window.frames[0].document.body.innerHTML allgetElementsById("feedTitle");
结果在firefox下调试的时候,又告诉我没有操作的权限,可是监视的时候又可以看到iframe里的内容。
如图:

实验结果:失败~
原因:未知。(小弟才疏学浅,等待园子里的朋友指点

最后采取了这中方案,绕过跨域问题
在程序里加判断
        var domain = "www.cnblogs.com";
        if(window.location.host != domain)
        {
            url = "http://junyistar.cnblogs.com/rss";
        }
        else
        {
            url = "http://www.cnblogs.com/junyistar/rss.xml";
        }

留下的疑问:
在没有操作服务器端权限的情况下,脚本真的能做的跨域么?

3最后是updatepage函数,里面是些常用的dom操作,返回数组
myArticle是个对象数组,里面存的是我这一个月的最新随笔。
updatepage函数,返回存好的随笔
在这里借鉴了JustinYoung的对象函数,小改了一下加以实现,原理差不多,
也算练练oo吧,本人也老避而远之的呵呵,要写的不好的地方还希望多多指正,以后还得多向园子里的前辈们学习。
构造函数+prototype

5其他是一些共有的变量和函数我声明在头部
公共变量

6最后用addLoadEvent函数加载启动事件。
这个函数是我在dom scripting书上学到的,它为将在页面加载完毕时执行的函数创建一个队列。
如果再加载函数只需写这样一句
addLoadEvent(firstFunction);
addLoadEvent(secondFunction);
这个函数在代码变得复杂的时候就显出他的作用来了,
无论打算在页面加载完毕时执行多少个函数,都只要多写一条语句就可以搞定了。
addLoadEvent

总结:
1关于脚本跨域。
留有一点遗憾,现有的水平还没能解决这个问题。
其实还有一种情况就是输入http://cnblogs.com/junyistar访问时IE又认为是不同的域了,这时脚本又会报错了。
这种情况我没有处理,因为一般只有手动输入的情况才回发生。
也留有一点疑问:在没有操作服务器端权限的情况下,脚本真的能做的跨域么?
2关于OO。
构造函数+prototype的组合,
就我自己目前用的,觉得这是一种很好的写javascript类的方法。
看过mootools的class类,那里的面向对象类写得真是精彩,用的也方便。也有很多不懂的地方,持续学习之。。。
3关于本例子。
呵呵其实也是受启发随便写来给自己的博客加个花。
RSS只是个形式,你可以调用任何你想的到的东东放在上面。
在上面代码里面涵盖了我的一些理解,望园子里的高人们不要见笑啊,欢迎板砖之。
4脚本我都放在下面的图片连接里了,又兴趣的朋友可以自己下来看看。欢迎指正。

requestarticles.js
global.js(addLoadEvent函数)
posted @ 2008-01-18 23:54  早班火车  阅读(2963)  评论(20编辑  收藏  举报