1. readyState的值是一个整数而不是字符串,4表示complete。楼主看文档不仔细。2. 学会小段小段的写代码,学会为每个小段代码写测试。不要等到代码堆积起来之后才想调试。特别对于js这样的动态脚本语言,在没有调试器的情况下,是极难定位bug的。3. window.document.appendChild(aScript) ; 不是很好,script元素应被插入到合适的位置,而不是像弃婴一样到处append。script元素最好被立即附加。如下
<script type="text/ecmascript">
var scripts = document.getElementsByTagName('script');
var currentScript = scripts[scripts.length - 1];
currentScript.parentNode.appendChild(newScript);
</script>4. 模拟import/package机制,你的代码还很稚嫩。建议你使用一些开源的项目,例如JSAN、JSPKG等(请参考http://blog.staffonly.org/hax/view.php?id=1001)。我本人也开发了一个import机制的项目,在春节后会正式发布到sourceforge.net上。

解决方案 »

  1.   

    其他的我在看至于第一个readyState的值,对于document,iframe,script来说,readyState就是一个string
    Retrieves a value that indicates the current state of the object.SyntaxHTML N/A 
    Scripting [ sState = ] object.readyState Possible ValuessState String that receives one of the following values.uninitialized Object is not initialized with data. 
    loading Object is loading its data. 
    loaded Object has finished loading its data. 
    interactive User can interact with the object even though it is not fully loaded. 
    complete Object is completely initialized. 
     The property is read-only. The property has no default value.而对于OBJECT对象,他的值才是0-4
      

  2.   

    document.getElementsByTagName("head")[0].appendChild(newScript)同时, 这样新建的script对象一样要加上onreadystatechange事件来判断script是否加载完毕
      

  3.   

    请问一下,对于新建的script对象的onreadystatechange事件应该怎样写才好,我想了几天都没有个头绪另外,由于对于java的import包方法不是很感兴趣,所以我的using其实是类似于delphi的uses的实现。而hax(海曦) ( ) 提供的几个开源包似乎都喜欢于java的引入包,一时难以接受。但是看源码的话,核心代码也是用了createElement或者是document.write("<script>")这样的方法,有点搞不清为啥在网络浏览时会在js文件未完全导入时,就对document内容进行解析,有没有办法延时?本来有一个很丑陋的做法window.setInterval,但是希望得到更好的方法
      

  4.   

    我一直是这么动态导入脚本和样式表的,感觉还不错
    (注意:在write时"</script>"必须成两个以上的子串,不然会出错)//导入脚本
    function $importJS(path){
        document.write("<" + "script language=javascript src=\"" + path + "\"></" + "script>");
    }//导入样式表
    function $importCSS(path){
        document.write("<" + "link href=\"" + path + "\"rel=stylesheet type=text/css>");
    }
      

  5.   

    createElment其实和你的实现差不多的,只是一个是DOM的实现而已另外,我不知道网络上为什么老是说</script>必须分开来写,我自己试验过,昨天看到的几个开源的package loader基本上用document.write方法的都没有分开来写也没有问题。不知道是不是老版本的浏览器的问题
      

  6.   

    这个问题在我的一个JS框架中有遇到过.应该用HttpRequest来做,也就是AJAX来做.
    先用HttpRequest对象把JS文件读进来,再用eval去执行脚本中的代码
      

  7.   

    最好不要和html然到一块,建议专门有一个js文件,然后用link引入,这样的习惯以后这些问题自己就解决了,ok
      

  8.   

    楼上说的也是可以的,可是就算我把它独立成一个js文件,依然无法load完啊HttpRequest的话需要我的js文件都是utf-8编码的,呵呵,试试看吧
      

  9.   

    script不需要分开来写,分开来可能是为了绕过某些论坛的过滤器。显然在这边的用途里没有必要。使用document.write而不是使用dom的方法,据说是某些浏览器的dom方法有延时bug,但是我并没有试验出来。也许你碰到的就是?btw,楼主说说java的import和delphi的use的区别吧。
      

  10.   

    用dom方法载入肯定会有延时啊,要用oScript.onreadystatechange来捕捉是否已经加载完毕!
      

  11.   

    如果使用类似onreadystatechange这种异步的方式的话.
    那么在using之后的代码运行时,如果要使用调用的库,而脚本又还没有载入,就会出错的.
    所有必需使用一种同步的方式,就像我上面说的用HttpRequest.
      

  12.   

    不好意思,今天没上来to hax(海曦):
    1、不加defer,我的html就无法运行,因为主程序要在using的程序以后才可以启动,不然就没办法
    2、uses和import的区别其实就是delphi和java的区别,delphi是以文件为基础,不同dcu文件之间的引用就需要uses;而java以包为基础,不同包之间的调用才需要import。js其实和delphi类似,但是很多packager loader喜欢以java为蓝本实现。
    3、document.write("<script></script>")问题是我弄错了,对于用src include进来的js文件,直接写是没关系的,但是对于html里面内嵌的js脚步,这样写是错误的!但是也完全不必要用"<sc"+"ript>"这样的方式,可以用document.write("<\script><\/script>")来实现
      

  13.   

    to fason(咖啡人生) :
    dom载入是有延时,但是我如何来写script的onreadystatechange那?
    我载入的script不定,当前的script不见得就是最后的script,这个怎样才能判断?
      

  14.   

    to chon81(当我遇上你…) :
    HttpRequest应该也是用的XmlHttp来实现的吧?这样的确可以解决一部分问题但是你载入的js文件应该放在哪里?是不是说必须建一个namespace来放它?这个我还在看 hax(海曦)提到的几个源代码另外,这样子的话,包含中文的js文件就必须用utf-8编码,不然就无法读到中文,有没有什么其他办法?
      

  15.   

    这就要看你的import机制如何了,你去看看bindows或才JSVM先吧
      

  16.   

    to FallenAngel(堕落天使)
    >但是你载入的js文件应该放在哪里?
    这个用<script>应该也有这个问题吧.我的程序里面用了两种
    一种是跟JSVM一样,你可以参考它的,js文件是放在JSVM里.(以前我看JSVM时,是这样的,现在不知道了)
    还有一种是使用绝对路径或相对于当前文件的路径,这个的话js文件放在哪都可以调用到.
    但我的不像JAVA或C#里面的import和using机制,我是直接调用js文件路径.
    如果你想要像
    using("xxx") ;//使用xxx.js
    这样写的话,那就看看JSVM吧.>另外,这样子的话,包含中文的js文件就必须用utf-8编码,不然就无法读到中文,有没有什么其他办法?
    可能是我的工作原因吧.我工作上使用统一是utf-8所以,我没有认真想过这个问题呵呵,不好意思.
      

  17.   

    如果把js代码放在xml文件里就不会有编码问题.
    如:
    <?xml version="1.0" encoding="GB2312"?>
    <script>
    alert("你好!");
    </script>
    这样做就有点像bindows了.
      

  18.   

    很赞赏楼主的勤奋,我做的import机制虽然还没有发表,不过可以给楼主借鉴
    http://hax.zavax.com/svn/esant/trunk/src/important.es (个人机器,不一定一直开)春节后我会以LGPL方式发表。
    使用方式如下:网页中加入
    <script src="important.es" type="text/ecmascript"></script>
    <script src="my.es" type="text/ecmascript"></script>
    <script>$import (esx.oop);
    $import (net.sf.sarissa);....</script>其中my.es是集中的包定义处,代码类似:
    $package.register('esx.oop', 'oo.js');
    $package.register('esx.method', 'method.js');
    $package.register('esx.async.future', 'future.js');
    $package.register('net.sf.sarissa', 'sarissa/sarissa.js#Sarissa');
    $import方法:
    $import (packageIdentity)packageIdentity: 包的标识符。$package.register方法:
    $package.register(packageName, scriptLoader)packageName: 包名(字符串)
    scriptLoader: 脚本装载方式(函数)或者脚本的uri引用(字符串)
    当然,这是楼主所谓类似java的import机制。不过就我看到的多数语言(java,c#,python,ruby...)的package/module机制都是类似java的,即基于抽象命名的,而不是基于文件系统的。当然两者可以有对应(如java规定包结构和目录结构的对应)。delphi我没用过所以不了解。