Habitat Framework

专注于Java EE企业级开发
posts - 13, comments - 81, trackbacks - 0, articles - 5
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

使用AJAX不可以跨域一直是一个麻烦的问题,
最近做AJAX框架时发现一种方法,不仅可以跨域,而且相比XHR可以省去很多解析XML的步骤,
后来居然发现GoogleMap的API就在用,非常惊喜,赶快分享一下

test.html
<html>
<title>Dynamic Script Object</title>
<head/>
<body>
 <div id="jsArea">
  <script id="js" src=testa.js></script>
 </div>
 <br>
 <input type="button" value="test" onclick="testSrc()">
</body>
</html>
<script>
//author:Kerwin.Weng
//mail:hunteva@163.com
 function testSrc(){
  var jsObj = document.getElementById("js");
  var body = jsObj.parentNode;
  body.removeChild(jsObj);
  jsObj = null;
  var newJS=document.createElement("script");
  newJS.id = "js";
  newJS.src = "testb.js";
  body.appendChild(newJS);
  jsArea.innerHTML="Asynchronous"
 }
 var jsArea = document.getElementById("jsArea");
</script>

testa.js
document.write("This is A");

testb.js
setTimeout(function(){jsArea.innerHTML="This is B,now imagine i'm a servlet";},100)

测试结果表明可以在不刷新页面的情况下更新jsArea中的内容,如果我们把testb.js换成一个servlet会怎么样
那不是可以在serverside直接写数据或function给client用了吗,完全不需要XHR来中转,省去了不少麻烦,而且还可以实现跨域访问

但是有两点要注意,testb.js用document.write没有作用,如果不用setTimeout,会直接让我的IE7和IE6crush,具体原因不明,有牛人知道请告诉我
目前在FF2.0.0.4/Opera9.2/IE7/IE6下测试通过.

由于找了好久都不知道这种方式的官方名称,并且很明显这不Asynchronous JavaScript and XML,这里连XML和XmlHttp的影子都没有,
所以为了称呼方便我暂时叫它DSSO(DynamicSwitchScriptObject),当然这不是我发明的,Google不知道用了多久了,如果你知道准确的名字请麻烦告知我

现在我们比较下AJAX和DSSO的特点:
AJAX DSSO
跨域访问 不支持 支持
异步操作 支持 支持(body.appendChild后不需要等到完成才会继续,当然完整的异步访问需要另外的pattern来支持)
数据载体 XML或JSON或TEXT 可以直接由server写成Javascript
操作复杂性 需要解析XML或JSON 可以直接使用

目前暂时想到这么多可以比的,期待大家的讨论

评论

# re: AJAX还有另一条路,不用XHR也可以无刷新从serverside拿数据更新页面,还可以克服XHR不能跨域问题[未登录]  回复  更多评论   

2008-12-29 16:27 by Jelly
你测试过它可以跨域么????????

# re: AJAX还有另一条路,不用XHR也可以无刷新从serverside拿数据更新页面,还可以克服XHR不能跨域问题[未登录]  回复  更多评论   

2008-12-29 20:00 by Kerwin Weng
当然试过,貌似Gmail和Google Reader就用这样的方式在做嘛

# re: AJAX还有另一条路,不用XHR也可以无刷新从serverside拿数据更新页面,还可以克服XHR不能跨域问题[未登录]  回复  更多评论   

2008-12-30 10:14 by Jelly
跨域这个问题的关键并不在于ajax或xhr,而是浏览器对于javascript的安全考虑不允许跨域,不允许不同域名之间js互相调用。
我用firebug看到的结果是,gmail依然用的xhr去定时更新数据,至于跨子域调用js是有办法解决的。
你给的例子和跨域没有任何关系,我很难相信你试过用在一个域名下去get或post另一个域名的请求。

# re: AJAX还有另一条路,不用XHR也可以无刷新从serverside拿数据更新页面,还可以克服XHR不能跨域问题[未登录]  回复  更多评论   

2008-12-30 12:05 by Kerwin Weng
上面的例子是把test.html放在www.aaa.com下,把创建script的src改成一个http://www.bbb.com/testb.js,也就是说动态引入另一个域的script,难道我们不可以在一个域的页面引用另一个域的js?难道引入的JS无法访问引入它的页面的对象?
而且我又重做了一次测试,结果还是证明可以跨域,而且Google Maps API也是这样在操作,所以我只能说你不信就不信吧.

没有post或get,具体怎么提交数据已经说得很清楚了

# re: AJAX还有另一条路,不用XHR也可以无刷新从serverside拿数据更新页面,还可以克服XHR不能跨域问题  回复  更多评论   

2008-12-31 05:27 by Ajaxer
这种方法可以跨域的,原理是通过动态修改script 标签的src属性实现的,这个属性是没有跨域问题的。MapABC API的一个工具类就是这么做的。不能使用document.write的原因是用write输出的代码会与page加载的代码冲突,而且不同的浏览器对write的代码和页面加载的代码执行的顺序是不一样的,所以尽量使用DOM的操作方式。

# re: AJAX还有另一条路,不用XHR也可以无刷新从serverside拿数据更新页面,还可以克服XHR不能跨域问题[未登录]  回复  更多评论   

2008-12-31 12:21 by Kerwin Weng
的确document.write不是一种好的方式,测试原理的时候我是图简单省事,但是其他任何环境下都推荐使用Dom

# re: AJAX还有另一条路,不用XHR也可以无刷新从serverside拿数据更新页面,还可以克服XHR不能跨域问题  回复  更多评论   

2013-07-12 21:22 by hypol
你这不就类似jQuery的jsonp么。。

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问