当心异步刷新后的脚本文件加载
来源:互联网 发布:邓肯所有季后赛数据 编辑:程序博客网 时间:2024/06/08 03:19
重现问题
我们现在编写一个示例来重现一个异步刷信的问题。
首先,我们建立一个名为“ScriptHandler.ashx”的Generic Handler,它的作用是模拟一个脚本文件。可以看出,加载这么一个脚本文件是一个很耗时的操作。www.aiwvr.com
ScriptHandler.ashx<%@ WebHandler Language="" Class="ScriptHandler" %>
using System;
using System.Web;
public class ScriptHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/javascript";
System.Threading.Thread.Sleep(3000);
context.Response.Write("Sys.Application.notifyScriptLoaded();");
}
// ...
}
然后我们创建一个简单的页面,放置一个UpdatePanel和两个按钮。 Page
<asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate>
<%= DateTime.Now %><br />
<asp:Button ID="Button1" runat="server" Text="Load Script File"
OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="Partial Rendering"
OnClick="Button2_Click" />
</ContentTemplate>
</asp:UpdatePanel>
下面的代码是响应按钮Click事件的实现。当我们点击“Load Script File”按钮时,ScriptHandler.ashx会被作为脚本文件添加到页面上。而“Partial Rendering”则会发起一个需要等待很长时间的异步刷新。aiwvr.com
Event Handlerprotected void Button1_Click(object sender, EventArgs e)
{
ScriptManager.RegisterClientScriptInclude(this.Page, this.GetType(), "key",
"ScriptHandler.ashx?m=" + new Random(DateTime.Now.Millisecond).Next());
}
protected void Button2_Click(object sender, EventArgs e)
{
Thread.Sleep(5000);
}
您可以点击这里这个重现问题的示例并将它部署在您的机器上,您也可以点击这里察看这个页面。请一步一步跟着我来浏览这个页面,我会示范一下这个问题。
打开页面,我们可以看到时间和两个按钮。
点击“Load Script File” 按钮,并等待时间更新。
在时间更新后,点击“Partial Rendering” 按钮。
一般来说,最后一步之后大约5秒多钟,时间将会被跟新。但是现在您会发现,直到您重新点击某个按钮之后时间才会更新。事实上最后一步的任何操作,例如脚本加载,Hidden Field的注册都失败了,客户端生命周期的事件也不会触发。
原因何在?
在我分析客户端异步刷新的机制之前,我想简单的解释一些Script语言和DOM操作的基本特性。使用Script来操作页面中的DOM是AJAX技术的基础。有人说,JavaScript编程是没有多线程的,因此我们能够认为它始终线程。我同意这一点。JavaScript的编程模型的确没有多线程的机制,它是线程的——从理论上来说的确是这样。
但是,使用JavaScript进行编程还是会遇到同步问题,因为有些操作是异步得,尤其是在我们作一些DOM操作时。在AJAX编程中最著名的异步操作自然就是XMLHttpRequest对象的send方法。当我们调用了send方法之后,下面的代码并不会被阻塞,而是会继续执行下去。我们还会遇到别的异步操作。例如,开发人员经常会发现,他们无法在页面中动态创建了图片(- 当心异步刷新后的脚本文件加载
- 异步的脚本加载
- iOS 异步加载刷新
- 异步刷新加载
- 刷新加载+异步线程
- UpdatePanel中内容异步加载后,调用JS脚本方法
- JavaScript学习--Item26 异步的脚本加载
- 加载文件javascript 文件的同步加载与异步加载
- Node脚本变化后的自动加载
- Android ListView 异步加载刷新(更多)的思路
- 异步加载界面pjax 刷新界面里的部分内容
- Asp.net-UpdatePanel异步刷新后JS失效的解决方法
- 如何调试异步加载的js文件
- 如何调试异步加载的js文件
- 如何调试异步加载的js文件
- 你不知道的JavaScript--Item26 异步的脚本加载
- loadScript异步加载脚本函数
- 关于异步加载script脚本
- [Hadoop源码解读](一)MapReduce篇之InputFormat
- 堆和栈的区别
- 认知小动物的脚印[图]
- 赶集动画实现
- codeigniter源代码分析之框架目录结构
- 当心异步刷新后的脚本文件加载
- Ecstore跨app访问lib下类与方法
- System.getProperty("user.dir")
- 如何查找&删除ORACLE中死锁进程
- UI初级--视图层级管理
- 使用ASP.NET AJAX启用客户端缓存
- linux 安装Oracle-xe
- Cocos2d-x 3.0 红孩儿私家必修:第二章cpp-empty-test:还是那个HelloWorld!
- 关于bit操作,你知道多少?