关于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的做法。
嘛,基本上就是这样,是一个世界难题……不要问我要代码,认为没有必要搞这么复杂的同志们现在都被迫干这事呢,世事难料啊!
相关文档:
事实上IE已经为我们内嵌了WebBrowser控件,已经能够很好的支持我们常用的打印功能了。通过该控件的功能调用,用户可以将当前的Html页面输出到打印机上,用户只需要将要打印的数据组织成Html页面,然后调用WebBrowser的打印功能就可以很好的实现所见即所得的打印功能。不过这种打印存在的缺点就是打印精度不够,如果需要精确 ......
function getCookies(name)
{
var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
if(arr != null) return unescape(arr[2]); return '';
}
function setCookie(name, value, expires,
function getCookies(name)
{
var a ......
声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
实现iframe内部页面直接调用该iframe所属父窗口自定义函数的方法。
比如有A窗口,A内有个IFRAME. B,B里面的装载的是C页面,这时C要直接调用A里面的一个自定义函数ExpandPage();
那么只要在C页面中写如下J ......
<script language="javascript">
function closeOpen(Panel) {
var test = document.getElementById('Panel');
if (test.style.display == "none") {
&nb ......