关于javascript模块加载的思索2
经几天思考,想到一个叫“文件与模块”的问题。我们的模块肯定写在一个JS文件中,这些模块又可以分为核心模块与外围模块。核心模块当然写在主文件中,它应该包含最重要的逻辑,加载器,列队,命名空间构造器等等。但如果一个文件只存在一个模块这也太浪费了,而且会导致请求法过多,因此出现多个模块“共生”于一个文件的情况。在主文件的那些非核心模块,我称之为内围模块。其他内围与外围没有什么区别,只是所在文件不同而已。不地为了方便起见,内围模块不要依赖外围模块!
但我们用script标签引用JS文件时,它就哗啦啦地执行里面的脚本,最主要的逻辑可以无所顾虑地得到解析。但对于内围模块,它们的逻辑是放到一个函数体中,控制流只能从它们上面掠过,触摸不了它里面的东西。这个模块名与回调函数与相关的配置将进入一个处理函数(下文称之为use),再放入一个处理列队。如果存在依赖,则检测依赖模块所在的文件有没有加载,没有就加载文件,如果文件已加载,则检测此模块已装配到框架的命名空间中,最后执行回调函数。
从上面分析可知,这里面的操作大体可分为几类:文件加载,模块装配与执行回调,它们只能依次执行。综观大多数类库框架,给出的解决方案就是这两种:动态script插入与Ajax回调解析。
动态script插入,就是生成一个script节点,设置其目标src,然后插入head节点中。之所以不用document.write,那是插入到body中,而且还有许多缺陷,具体参看我这篇文章。
Ajax回调解析,就是利用XMLHttp对象,将请求回来的responseText再全局解析。注意,是全局解析,要实现它就必须用到window.eval(标准浏览器)或window.execScript(IE),或者再搞一个script标签进行解析。可见这方法需要处理许多兼容问题,另搭上跨域问题……。
我的立场很明显了,使用第一种。但script标签关于回调的处理还是有许多问题。
var script = dom.genScriptNode();
script.src = url
dom.head().appendChild(script);
script.onload = script.onreadystatechange = function(){
if ((!this.readyState) || this.readyState == "loaded" || this.readyState == "complete" ){
if(!dom.done[name]){
alert("加载失败1")
dom.
相关文档:
javascript中event.keycode
keycode 8 = BackSpace BackSpace
keycode 9 = Tab Tab
keycode 12 = Clear
keycode 13 = Enter
keycode 16 = Shift_L
keycode 17 = Control_L
keycode 18 = Alt_L
keycode 19 = Pause
keycode 20 = Caps_Lock
keycode 27 = Escape Escape
keycode 32 = space space ......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; ......
这个随笔其实是为了感谢清风笑给的一个提示,不仅仅是告诉我怎么判断数组,更让我有了认真读一读 《javascript权威指南》的想法。
比较和拷贝其实是一回事,代码如下:
//
//Compare object function
//
function Compare(fobj,sobj)
{
var ftype = typ ......
calcu() ----函数实现两个数相乘
document.write(); ---打印
document.calc.元素名.value; --获得表单的值
document.表单名。表单元素名。value 为表单赋值
定义函数:
function 名字()
{
//javaScript预语句
}
onClick="函数名";  ......
<script language='javascript'>
function toggleAll(cb)
{
var val = cb.checked;
var frm = document.forms[0];
var len = frm.elements.length;
var i=0;
for( i=0 ; i<len ; i++)
&nb ......