今天无意间打开了一个CSDN上的个人blog,发现窗口无法拖动,Firefox的标签页也无法切换。
查看代码:
<script type="text/javascript">Include("Csdn.Blog.UserOnline");</script>
<script type="text/javascript">Include("Csdn.Blog.ShowmeDataDeal");</script>
看到Include函数,马上可以想到,它很可能使用了动态包含脚本的设计。
//http://blog.csdn.net/scripts/jsframework.js
window.Include=function(namespace, path)
{
.....
};
S.load=function(namespace, path)
{
......
}
仔细阅读这两个函数代码,发现它是通过XMLHttpRequest对象同步装载脚本资源的(对IE,它采用userdata缓存优化)。而这必将导致一种完全阻塞问题(这种问题我在仍外一篇blog上描述过:
http://jindw.iteye.com/blog/66702)。
说到阻塞问题,我想大家可能会以为只是一种下载延迟,其实不然。
下载延迟不是完全阻塞,浏览器依然可以响应用户事件。而同步XHR请求阻塞是一种完全的阻塞。
浏览器在脚本运行与事件响应共用同一个线程(我的猜测)。任何脚本尚在运行时(包括被同步XHR请求阻塞的时间),浏览器将无法响应任何用户事件(无法拖放窗口、切换标签、重画页面等等,
就像程序死了一样)。与普通的下载延迟造成的阻塞,感觉明显不同。
我对这个问题可以说深有体会,起初,在构建JSI1的项目站点时。因为网站放在sourceforge上,访问数度不是一般的慢,几个简单的例子,浏览器就要完全阻塞好几妙钟。正是厌恶这种完全阻塞的现象,我才开发了JSI2。
事实上,现在的一堆堆js框架中,采用XHR同步装载资源的有不少,JSVM、dojo、a9engine、hax的pies;其中JSVM,dojo都提供打包工具,将可能装载的脚本打包到启动文件中,所以也可以避免XHR同步请求。不过这样也就失去了部分动态装载的意义了。
总之,我非常讨厌这种完全阻塞现象,认为这个严重影响用户体验。
可能也有些主观因素把,希望听听大家的看法。
分享到:
相关推荐
自动下一集脚本js插件是由作者唐Reagen分享的一个浏览器扩展插件。本脚本应用到应用到 superchutou.com,可以自动下一个视频。需要的朋友们,赶紧来下载吧! 什么是脚本? 脚本是批处理文件的延伸,是一种纯文本...
今天,我分享一个一键批量替换文件名的bat脚本给大家,因为我自己有这样的需求,所有从新写了一个bat脚本,顺便分享给大家,上期我们分享了批量改名,但是我在实际中遇到了这样的问题,有一些文件我是要去改它的...
author:ListenWind ...c 语言模式脚本解析器,脚本执行不是其目的。...希望对学习脚本的人有所帮助。 今天测试循环 发现效率实在令人郁闷。先不管了(感觉递归引起的) 代码照样没释放内存,存在内存泄露问题。
实现一个脚本引擎 实现一个脚本引擎 实现一个脚本引擎
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来...
ODbgScript相对OllyScript最大的升级是你拥有了一个脚本的调试运行窗口,你能很好的控制脚本和观察脚本的运行状态,在ODbgScript的调试窗口中,你可以单步执行你的脚本,可以手工执行脚本命令,可以在你的脚本上下断点,...
c 语言模式脚本解析器,脚本执行不是其... 支持单行、多行注释 测试字符串类型 希望对学习脚本的人有所帮助。 今天测试循环 发现效率实在令人郁闷。先不管了(感觉递归引起的) 代码照样没释放内存,存在内存泄露问题。
千山导航搜索框脚本js插件是由作者duke分享的一个浏览器扩展插件。通过本脚本,为千山导航添加一个搜索框,支持谷歌搜索。 什么是脚本? 脚本是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本...
此BAT脚本可以帮助开发人员将某文件夹下所有SQL脚本按文件名依次在指定数据库中批量执行。并且生成日志文件,可查看执行过的所有脚本名称和错误信息...2) 3个SQL脚本实例(其中一个为脚本含有错误) 3) 说明文档(英文版)
一个用lua写的游戏脚本实例,是word格式的,值得一看,通过这个例子你可以了解到游戏中的脚本是怎么写的
创建特殊的脚本输出 以装载另一个文本响应 无响应 处理表单的脚本 表单格式和表单脚本 GET 和 POST URL 编码 问题 CGI 变量 解码程序 uncgi cgi-lib.pl 解码文件上传的输入 自己做 非解剖的头部脚本...
Unity3D脚本:如何调用更改其他脚本中的变量 Posted on 2013年02月24日 by U3d / Unity3D脚本/插件/被围观 274 次 在
它是基于一个新的开放的面向对象体系,可实现高度的扩展性,还建立了一个由第三方开发者和系统集成者可以提供自定义杂志、广告设计、目录、零售商设计工作室和报纸出版方案的核心。可支持插件功能。
SHELL脚本练习 写一个脚本,利用循环计算10的阶乘
InstallShield教程+脚本API教程+经验,物有所值啊。
分享一个linux基线检查脚本,基线核查脚本。 解决人工做极限核查太麻烦,枯燥等问题。 提高工作效率,提高工作质量。 下面简单介绍一下基线,基线扫描的内容。最后就是重磅大戏,自动化脚本,相信大家都喜欢用脚本...
用于zabbix微信报警的一个python2.7的脚本,通过该脚本zabbix能把报警信息发送到微信企业号,微信企业号改版后,接口有所调整,这个是适用于改版后微信接口的脚本。这个是本人自用的脚本,所以里面的corpid和agt_inf...
css-巴哈姆特深色主題脚本js插件是由作者廖文宏分享的一个浏览器扩展插件。此脚本已经有内含文字颜色反转,如果原本有安装反转文字颜色的脚本,记的先把旧的删除。 什么是脚本? 脚本是批处理文件的延伸,是一种纯...