易截截图软件、单文件、免安装、纯绿色、仅160KB

关于javascript模块加载的思索

最近一直为此头痛,姑且把我能想到的东西都写出来吧。由于不是简单把页面上手写的script转为javascript添加,我们需要考虑的东西主要有两个:加载的顺序,加载前后脚本的运作。
先说第一个,假如我们已有一加载机制了,要加载一个新模块,当然新模块是在另一个JS文件中。这时,我们可以描述为:
loader ---> a.js
这个加载过程可能会出些意外,如服务器忙碌等问题,暂时无法为我们生成JS文件,我们就需要再次请求,但也可能永远请求不上,因为那是死链,后台的人傻了脑袋,改了地址也不通知声,我们需要一个截止期限。这时,我们可以描述为:
loader ---> a.js ---> a.js ---> .....----> timeout
如果那个模块要依赖于其他模块呢,那么我就必须在加载它之前加载其他模块了。这时,我们可以描述为:
loader ---> b.js ---> a.js ---> .....----> timeout
但记录这些依赖关系的信息肯定在a.js上,而不在loader上,通过a.js我们才能得知b.js,换言之要遵循最少知识原则(Law of Demeter)。
这个问题的解决,MochiKit兴许能给我们一些灵感吧。
另一个问题是javascript是单线程的,而加载需要一个时间,并且通常是异步的。当我们执行加载函数后,可能JS引擎会继续执行下面需要新模块支援的代码片断,由于这时新模块还没有加载完毕,当要用到新模块的属性方法就会报错。解决方法有二,强制上面的loader活动的时间与加载时间一样长,换言之,创造一个阻塞的环境。这容易实现,可参照dojo。不过如果加载的模块过多,难免会造成body标签内一片空白。另一个方法是使用回调函数,那么就要求我们把接着下来的代码八卸大块,每个代码片断都是相对独立,所有逻辑都是写在一个函数体中。看上去非常不优雅,但也别无他法,这是YUI的做法。
嘛,基本上就是这样,是一个世界难题……不要问我要代码,认为没有必要搞这么复杂的同志们现在都被迫干这事呢,世事难料啊!


相关文档:

如何用JavaScript打印Web页面

事实上IE已经为我们内嵌了WebBrowser控件,已经能够很好的支持我们常用的打印功能了。通过该控件的功能调用,用户可以将当前的Html页面输出到打印机上,用户只需要将要打印的数据组织成Html页面,然后调用WebBrowser的打印功能就可以很好的实现所见即所得的打印功能。不过这种打印存在的缺点就是打印精度不够,如果需要精确 ......

Javascript中的Array的Remove

Javascript中的Array对象没有Remove方法,在网上找到了一函数
function
 RemoveArray(array,attachId
)
{
    
for
(
var
 i
=
0
,n
=
0
;i
<
array.length;i
++
)
    
{
        
if
(array[i] ......

JavaScript与DropDownList

大家都知道,.NET中一些Web服务器控件解析并编译,最终被渲染的时候,其实是转化成了普通的html控件,比如<asp:LinkButton>控件就被渲染成了<a>锚点控件,这里要讲的DropDownList控件也一样,被渲染成了普通的select控件,在如下的asp.net页面中定义了一个web服务器控件DropDownList和一个普通的select控件(主 ......

Client Side JavaScript Validation

Struts Validator Framework provides an easy-to-use mechanism for performing client-side validation. It's very useful to validate some fields on the client-side before sending the data to the server for processing. By this way we can ensure that the data send to the server is valid. Performing valida ......

JavaScript 判断上传文件类型

function
 Check_FileType(str)
{
 
var
 pos 
=
 str.lastIndexOf(
"
.
"
);
 
var
 lastname 
=
 str.substring(pos,str.length)  //此处文件后缀名也可用数组方式获得str.split(".")
 
if
 (lastname.toLowe ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号