今天无意间打开了一个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同步请求。不过这样也就失去了部分动态装载的意义了。
总之,我非常讨厌这种完全阻塞现象,认为这个严重影响用户体验。
可能也有些主观因素把,希望听听大家的看法。
分享到:
相关推荐
在Unity引擎中,脚本执行顺序是一个至关重要的概念,特别是在涉及多个游戏对象(GameObject)交互时。Unity5.3版本虽然较旧,但其脚本执行的原理在后续版本中依然适用,只是部分细节可能有所优化。理解并掌握这一...
自动下一集脚本js插件是由作者唐Reagen分享的一个浏览器扩展插件。本脚本应用到应用到 superchutou.com,可以自动下一个视频。需要的朋友们,赶紧来下载吧! 什么是脚本? 脚本是批处理文件的延伸,是一种纯文本...
然而,当从一个版本的Unity升级到另一个版本时,可能会遇到各种问题,其中包括UI脚本丢失的问题。这个问题主要发生在从Unity 2019版本降级到Unity 2018时,因为不同版本的Unity对脚本引用和资源管理有其特定的规则。...
今天,我分享一个一键批量替换文件名的bat脚本给大家,因为我自己有这样的需求,所有从新写了一个bat脚本,顺便分享给大家,上期我们分享了批量改名,但是我在实际中遇到了这样的问题,有一些文件我是要去改它的...
在本例中,“石器时代脚本+强大的挂声望脚本+自动5人组队”可能是一个集成多种功能的脚本包。该脚本包的核心功能之一是挂机声望,即无需玩家持续操作,脚本可以自动完成积累声望值的任务,而声望值通常与玩家角色在...
"装备制作脚本.js"是一个JavaScript文件,它是游戏中的一个关键组成部分。JavaScript是一种广泛使用的编程语言,尤其在Web开发中,但也可以用于游戏开发,尤其是在客户端的逻辑控制上。在这个特定的上下文中,装备...
author:ListenWind ...c 语言模式脚本解析器,脚本执行不是其目的。...希望对学习脚本的人有所帮助。 今天测试循环 发现效率实在令人郁闷。先不管了(感觉递归引起的) 代码照样没释放内存,存在内存泄露问题。
在处理大量数据时,WinCC脚本提供了GetTagMulti()函数来一次性读取多个变量,而SetTagMultiWait()函数则用于等待并设置多个变量。这些函数对于数据采集、记录和分析等任务特别有用。 7. 脚本的触发机制 脚本通常与...
* 数据迁移:当我们需要将数据从一个数据库迁移到另一个数据库时,生成INSERT SQL脚本可以帮助我们快速地将数据迁移到目标数据库中。 * 数据备份:生成INSERT SQL脚本可以作为数据备份的一种方式,以便在数据丢失或...
最后,"采矿脚本(T语言版)"表明这是针对TC语言的一个版本,可能与其他编程语言编写的脚本在语法和实现上有所不同,需要有TC语言基础的玩家才能理解和修改。如果你是EVE Online的玩家并且对提高采矿效率有兴趣,深入...
MT4平台快速下单32个脚本源码是一个实用的资源,它不仅能够帮助交易者提高交易效率,还能够通过自动化减少人为错误,支持交易者实施更加复杂和精细的交易策略。对于希望在金融交易领域中不断提升的个人来说,这些...
标题中提到的“大佬提供了一个新版fan脚本”,说明有某个经验丰富的专家或者高级用户,制作了一个新的版本的风扇控制脚本。这里所指的“fan脚本”,很可能是用于计算机硬件风扇转速控制的脚本。风扇转速控制对于...
ODbgScript相对OllyScript最大的升级是你拥有了一个脚本的调试运行窗口,你能很好的控制脚本和观察脚本的运行状态,在ODbgScript的调试窗口中,你可以单步执行你的脚本,可以手工执行脚本命令,可以在你的脚本上下断点,...
3. **管道操作**:`|`符号用于连接多个命令,让前一个命令的输出成为后一个命令的输入,实现数据的流程控制。 4. **命令替换**:反引号(``)或`$( )`用于命令替换,它们会先执行括号内的命令,然后将结果替换为文本...
书中首先介绍了Shell脚本的基础概念,包括脚本的基本结构,如何编写一个简单的Shell脚本来完成特定任务。例如,书中提到的第一个实例是清除/var/log下的日志文件。这个脚本使用了常见的Linux命令,如cd、cat等,并...
组策略编辑器是一个管理工具,允许管理员针对Windows系统进行各种配置。在Windows Server中,通过运行gpedit.msc命令可以打开组策略编辑器,从而修改组策略。组策略编辑器中的用户配置>Windows设置部分,可以找到...
在大麦网抢票脚本案例中,"DamaiHelper-main"可能是一个主程序文件,它包含了实现脚本功能的核心代码。这个文件可能包括了对大麦网接口的调用,网页数据的抓取,以及模拟点击、填写表单等操作。开发者通常会使用编程...
c 语言模式脚本解析器,脚本执行不是其... 支持单行、多行注释 测试字符串类型 希望对学习脚本的人有所帮助。 今天测试循环 发现效率实在令人郁闷。先不管了(感觉递归引起的) 代码照样没释放内存,存在内存泄露问题。
本文将详细介绍一个简单的Bash脚本示例,该脚本主要用于设置ROS(Robot Operating System)环境、构建ROS包,并运行一个简单的ROS节点。对于机器人开发者来说,理解和掌握如何编写这样的脚本来自动化ROS开发流程是...
总之,GCC链接脚本是构建可执行文件过程中不可或缺的一部分,它允许开发者精细地控制程序内存布局,以适应各种复杂的系统环境和性能需求。通过深入理解和熟练运用链接脚本,可以更好地优化程序性能,解决特定平台上...