AJAX的阻塞及跨域名解析
AJAX请求的阻塞现象与跨域解决方案
我们先来一下AJAX请求的阻塞情况。使用以下的代码连续发起三个请求:
```javascript
function simpleRequest() {
var request = new XMLHttpRequest();
request.open("POST", "Script.ashx");
request.send(null);
}
function threeRequests() {
simpleRequest();
simpleRequest();
simpleRequest();
}
```
当执行threeRequests函数时,会连续发出三个到同一域名的请求。通过统计图表,我们可以观察到每个请求需要花费1.5秒的时间。显然,第三个请求必须等到第一个请求完成后才能开始,总共需要3秒多钟。我们的目标就是改善这种情况。
在传统的跨域名异步请求解决方案中,AJAX的安全性限制似乎是一个无法逾越的障碍。除非在本地硬盘打开网页,或在IE中启用跨域名传输数据的设置,否则向其他域名发起AJAX请求会被禁止。这种限制对于子域名和同一域名的不同端口也同样严格。我们不能向这些资源发出AJAX请求。
表面上看,这个限制似乎无法打破。幸运的是,我们还有iframe这个救星!虽然iframe不在标准之列,但由于其实用性,就连FireFox也不得不支持它(类似的还有innerHTML)。网上已经有一些通过iframe实现跨域名异步请求的做法,但实现复杂且功能有限。在IE和FireFox中,URL的长度大约只能支持2000个字符左右,这对于普通需求可能已足够,但如果需要传递大量数据,这就远远不足了。与我们即将提出的解决方案相比,它的优势可能仅在于能跨任意域名进行异步请求,而我们的方案则能突破子域名的限制。
我们先搭建一个作为iframe里的Proxy的静态页面,暂且称之为SubDomainProxy.html。此页面设计简洁,主要包含了HTML的基础结构和一段JavaScript脚本。这段脚本的主要功能在于设置域名并定义了一个发送请求的函数。
随后,我们进入主页面,即位于test.域名下的Default.html。这个页面同样基于HTML,但在其中嵌入了丰富的JavaScript代码。我们设置了页面的域名为"test.",然后定义了三个函数:simpleRequest、crossSubDomainRequest以及threeRequests。
当点击页面上的按钮时,会触发threeRequests函数。这个函数会连续调用两次simpleRequest函数,然后调用crossSubDomainRequest函数。其中,simpleRequest函数会向同一域名下的资源发送请求,而crossSubDomainRequest函数则通过之前创建的iframe中的Proxy,向子域名下的资源发送请求。这意味着,当执行threeRequests方法时,将会向两个不同域名下的资源发出请求。
这种解决方案虽然只能突破子域名,但其优雅的设计已经足够应对许多场景。我们无需强求任意域名之间的异步通讯,因为在实际应用中,子域名的突破已经能满足大部分需求。更何况,我们的解决方案是通过创建一个隐藏的iframe来实现跨子域名的请求,这种方式在IE和FireFox等浏览器中都能顺利发送AJAX请求。
在接下来的文章中,我们将为ASP.NET AJAX客户端开发一个名为CrossSubDomainRequestExecutor的工具。这个工具能够自动判断请求是否涉及跨子域名的操作,并据此选择适当的AJAX请求方式。这样一来,客户端的异步通讯层对开发人员来说将完全透明,这无疑会提升开发效率和用户体验。
值得注意的是,这种方式的实现有一些前提条件。例如,创建XMLHttpRequest对象、调用open方法和send方法都必须在iframe中的页面内执行。向子域名请求的路径需要遵循特定的格式,如
Windows Live Contacts Gadget所运用的Channel技术,为我们提供了一种优雅的解决跨域名异步请求问题的方式。这种技术,如同一座桥梁,连接了不同域名间的数据交流障碍。如果将其封装为组件,无疑会为开发者带来极大的便利。这种技术的潜力令人期待,相信微软也在考虑将其进一步开发推广。虽然Channel技术引人瞩目,但与我们当前面临的问题并不完全吻合。我深知,对于每一项新技术,都需要我们深入理解和,才能真正发掘其潜力。而我认为自己尚未完全掌握这项技术,因此在此不做过多解读。
作者赵劼通过这篇文章向我们介绍了这一前沿技术,让我们感受到了技术的魅力与力量。而在文章的最后部分,我们看到了一个特殊的指令:cambrian.render('body')。虽然不知道具体的上下文环境以及它的作用,但我们可以猜测这可能是一种用于页面渲染的命令或者函数。在当前的Web开发环境中,页面的渲染效果对于用户体验至关重要,因此这样的函数或者命令也显得非常关键。
这篇文章深入解读了微软在解决跨域名数据传递方面的技术尝试,展示了技术的力量与魅力。对于我们这些热爱技术、追求创新的人来说,这无疑是一次视觉与思维的盛宴。期待未来能有更多类似的技术出现,推动Web开发技术的进步。也期待有更多的技术爱好者,共同、研究这些新技术,为我们的互联网世界带来更多的可能性。
编程语言
- AJAX的阻塞及跨域名解析
- php实现模拟登陆方正教务系统抓取课表
- Jquery实现简单的轮播效果(代码管用)
- 整理Javascript数组学习笔记
- 利用Vue v-model实现一个自定义的表单组件
- Node.js编写CLI的实例详解
- php基于GD库画五星红旗的方法
- vue2.0 element-ui中el-select选择器无法显示选中的内容
- Bootstrap作品展示站点实战项目2
- easyui-combobox 实现简单的自动补全功能示例
- SQL Server数据库中的存储过程介绍
- layui导航栏实现代码
- jQuery Validate验证框架经典大全
- php简单的留言板与回复功能具体实现
- 解决使用良精企业建站7.0未注册问题
- JavaScript编写点击查看大图的页面半透明遮罩层效