<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JSI Side</title>
    <description>JSI Side 是JSI项目的一个外围项目，目地是基于JSI开发一些实用类库和页面组件。</description>
    <link>http://JSI.group.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>发布一个JSI Example Project</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/188433" style="color:red;">http://JSI.group.javaeye.com/group/blog/188433</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          部署到Tomcat中，打开script目录，可以显示你当前script目录下全部托管脚本的API试图。<br /><br /><strong>导出功能介绍：</strong><br /><ol><li>导出成jsidoc文档 （单个文件）</li><li>合并脚本（可以选择不同的隔离级别）</li></ol>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/188433#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 14:58:57 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/188433</link>
        <guid>http://JSI.group.javaeye.com/group/blog/188433</guid>
      </item>
          <item>
        <title>JSI Side 代码风格与规范</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/188191" style="color:red;">http://JSI.group.javaeye.com/group/blog/188191</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>准备编写JSI的外围元素，先整理一下编码风格和一些约定，欢迎大家讨论。</p>
<h2>基本风格</h2>
<p>
&nbsp;&nbsp;&nbsp; * <strong>基本参照Java代码风格。</strong>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 驼峰式命名（单词无连接字符，单词首字母大写，其余小写）；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 类的首字母大写(eg:MyClass)；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 变量名，方法名，成员名首字母小写(eg:name,value,targetObject)；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. 单例对象遵循类的命名方式(eg:GlobalController)；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. 常量全部大写，下划线分割单词(eg:APPLICATION_ID)；<br />
<br />
&nbsp;&nbsp;&nbsp; 参考：http://java.sun.com/docs/codeconv/ <br />
<br />
&nbsp;&nbsp;&nbsp; * <strong>变量所用单词尽量不用缩写。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 缩写的单词容易造成语意的不明，不易阅读，而且容易造成争议。</p>
<h2>
编码约定</h2>
<p>
<br />
&nbsp;&nbsp;<strong>&nbsp; * 不要随意扩展原始对象。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 自Prototype
起，扩展原始对象似乎成了一个时髦的东西，大家都喜欢用。我承认他的便捷，但是请不要滥用，尽量做到有标准可循（比如为IE5扩展
Array.prototype.push），原始对象就这么几个，万一那天碰到两个人写的代码，行为不一致，那麻烦就大了。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 不要扩展Object.prototype。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 这个地雷貌似已经被头大牛踩到，但是你不要踩，谁踩到他，你就和他割席断交吧。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 不要盯上对象的constructor属性。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; constructor属性是非常不可靠的，很容易也经常被改写，而且经常被改写到Object对象[MyClass.prototype = {...}]，能后你以为是你的构造器，动之，能后天下大乱。 <br />
<strong><br />
&nbsp;&nbsp;&nbsp; * 不要写那些中看不中用的集合。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 不要模仿Java 集合API，去写什么 HashMap，ArrayList。JavaScript不相信这些，这个世界简单才是硬道理。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 在结构中始终使用区块。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 莫偷懒，省略区块（即{ }）会引发不经意的错误和麻烦。即使只有一句，也老老实实写上： <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 单例模式直接使用对象申明。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 我们不需要那个不中用的构造函数, 不如直接来个对象申明，直接定义属性。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 变量名就是最好的文档。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 不要担心变量名称的长度,他们只是一个符号，符号的意义在于表明变量的意义，而大小的事就交给压缩工具吧。比如，可以使用thisPackage，targetPackage；而不要用pkg1，pkg2。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 表达式中赋值需要明确注释。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 直接在表达式中赋值可以使代码紧凑，但会降低程序可读性，应尽量避免，但是对于一些关键元素,可以采用（压缩/优化考虑），但必须明确注释。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 目录名以&quot;/&quot;结尾。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; JSI内核中，有一些地方需要记录目录地址。这里我们统一以&ldquo;/&rdquo;结尾。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 不要使用原始类型的对象量。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 原始对象有些诡异的地方，如。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String(&quot;test&quot;) != new String(&quot;test&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(new Boolean(false)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&quot;执行到&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&quot;未被执行&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; 对外接口可以考虑兼容，但是内部元素，不考虑，内部也不要使用这些对象。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 杜绝变量悬空现象<br />
</strong>
<br />
&nbsp;&nbsp;&nbsp; 不要出现:<br />
<br />
&nbsp;&nbsp;&nbsp; if (!window.Element){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var Element = new Object();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; 改成：</p>
<p>
&nbsp;&nbsp;&nbsp; var Element = window.Element || new Object();</p>
<p><br />
&nbsp;&nbsp;&nbsp; 这段代码来自大名鼎鼎的Prototype，这里没错，但是如果被拷贝到某个函数内，问题就大了，有此类问题的脚本，放在JSI中装载，也会存在问题。 </p>
<h2><br />
一些诡异的技巧</h2>
<p>
<br />
<strong>
&nbsp;&nbsp;&nbsp; * {}就是Map</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 哪简单对象当map是个非常方便的地方，缺点是key都被转化成string。但是大多数情况下还是够用的，简单就好，没必要复杂化。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * []用作LinkedHashMap</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 使用数组保存键的顺序，对象存储键的值，基本可以等价于LinkedHashMap结构。缺点是有上，同时，length不能为键。 <br />
<strong><br />
&nbsp;&nbsp;&nbsp; * 使用constructor == String代替typeof</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 上面说到constructor不可靠，是的，但是constructor用来代替typeof，一般来说更可靠了。还可以同时做好对象类型和值类型的兼容。 <br />
<strong><br />
&nbsp;&nbsp;&nbsp; * 巧用与或。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fn){</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fn();</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fn&amp;&amp;fn();</p>
<h2><br />
慎用动态元素</h2>
<p>
<br />
<strong>
&nbsp;&nbsp;&nbsp; * eval</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; eval的性能问题到不是主要的，主要理由依然是他的动态性，容易给程序带来不稳定因素。 <br />
<strong><br />
&nbsp;&nbsp;&nbsp; * with</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 少用with，主要不是他的性能问题，其实with的性能问题并不太明显，但是他容易给程序带来不稳定因素。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * execScript</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 类似eval，ie上通行，不同之处在于他是一个上下文无关的eval，传入的脚本直接在全局上下文执行。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * document.write</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 当打印一段脚本标签时，近似等价与execScript <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * new Function</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 不仅是动态元素，他同时还有一个上下文短路问题。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * 少用属性。</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp;
属性虽然是面向对象的常用元素，但JavaScript?属性的动态性太强，不便自动优化处理；同时属性的使用，将产生更多不稳定的状态，虽然貌似易于阅
读，却增加了程序的复杂性。实际编码中应该谨慎。常量性质的私有属性不要出现，能用变量的地方也不要随意升级为属性。 <br />
<br />
<strong>
&nbsp;&nbsp;&nbsp; * window.xyz</strong>
<br />
<br />
&nbsp;&nbsp;&nbsp; 有些人习惯用这个来申明全局变量，或者干脆不申明， 那么，改掉你的坏习惯。</p>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/188191#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 22:07:09 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/188191</link>
        <guid>http://JSI.group.javaeye.com/group/blog/188191</guid>
      </item>
          <item>
        <title>2008年我可以做一些什么</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/164607" style="color:red;">http://JSI.group.javaeye.com/group/blog/164607</a>&nbsp;
          发表时间: 2008年02月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1。寻找值得合作的人。<br />2。完成<a href="http://hi.baidu.com/jindw/blog/item/3af1f5ddd8ba15eb77c63810.html" target="_blank">JSI IDE</a>的计划。<br />3。初步完成前端模板编译系统。<br />4。建立JSI开发社区，推广JSI的开发模式。<br />5。关心一下技术之外的事情...<br /><br />本来就是个没有计划的人，现在就想到这些了，再想到再补充
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/164607#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Feb 2008 18:42:39 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/164607</link>
        <guid>http://JSI.group.javaeye.com/group/blog/164607</guid>
      </item>
          <item>
        <title>JSI的延迟装载和异步装载过程的一些原理解释</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/162280" style="color:red;">http://JSI.group.javaeye.com/group/blog/162280</a>&nbsp;
          发表时间: 2008年02月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          出自该贴的回复:<br />http://www.javaeye.com/topic/161609<br /><br />JSI的延迟装载和异步装载过程非常相似.<br /><br />他们的实现是这样的:<br />1.计算出全部未装载的依赖,并将依赖加入缓存.<br />2.执行同步装载.<br /><br />其实所有的三种装载方式,原理都是一样的,只不过非同步装载在真正装载前有个预处理.<br />而异步装载和延迟装载的区别也就在于预处理过程中如何缓存脚本.<br />异步装载就是直接xhr异步读取js文件,加入JSI的脚本缓存.<br />而延迟模式就略显麻烦了,如hax所言,他是通过打印一段引用脚本,脚本文件的内容就是用闭包封起来的源代码.<br /><pre name="code" class="java">
$JSI.addCacheScript("mypkg","hello.js",function(){eval(this.varText)/**
 * helllo world 函数
 */
function hello(){
    alert("hello world")
}
})
</pre><br />而这段脚本的生成,我们可以在脚本打包时自动生成.<br />如果在调试期间,我们不希望每次修改都去运行任务,我们可以用一个jsp代理或者一个servlet过滤器去做相关的文本处理,同时还可以确保转换后的脚本与源文件行数完全对应,这就是JSI对于调试友好实现的基本原理.<br /><br />其中:eval(this.varText)这句时jsi里面比较关键的一点,他除了申明依赖之外,还构造了一个钩子函数.<br />能后外界就可以控制装载单元的内容了.如:注入装载后依赖.
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/162280#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Feb 2008 17:13:12 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/162280</link>
        <guid>http://JSI.group.javaeye.com/group/blog/162280</guid>
      </item>
          <item>
        <title>动态装载脚本的调试问题</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/161951" style="color:red;">http://JSI.group.javaeye.com/group/blog/161951</a>&nbsp;
          发表时间: 2008年02月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postbody clearfix"> 
      
      <p>一个论坛回复,粘贴过来.</p><p>&nbsp;</p><p>&nbsp;</p><blockquote><p>关于调试问题，同类动态装载脚本的实现都有类似问题。</p><p>这个问题在JSI中有一些解决办法，先给大家截个图。</p><p>&nbsp;</p><p>这时<a href="http://www.javaeye.com/topic/152188">JSI2.1</a>在firebug上做脚本调试时的截图，我们可以轻松定位到没个源文件，可以在其中设置断点，一旦有错误，可以准确定位到准确行数。</p><p>PS:<a href="http://www.javaeye.com/topic/152188">JSI2.1 </a>以基本开发完成，将择日发布</p><p>&nbsp;</p><p>&nbsp;<img src="http://www.javaeye.com/topics/download/ac3e773f-5e17-3eb5-8a2c-9ef057a4e9a0" alt="" /></p></blockquote>
    </div>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/161951#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 12 Feb 2008 16:13:19 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/161951</link>
        <guid>http://JSI.group.javaeye.com/group/blog/161951</guid>
      </item>
          <item>
        <title>JSI的导入指令参数顺序调整意见征询</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/161609" style="color:red;">http://JSI.group.javaeye.com/group/blog/161609</a>&nbsp;
          发表时间: 2008年02月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h4>改动</h4><blockquote><p>&nbsp;
2.0方式：<br />
</p><div style="border-style: dotted dotted dotted solid; border-color: #8394b2; border-width: 1px 1px 1px 4px; padding: 3px; background: #fafcfe none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$import(path,callbackOrLazyLoad,<strong><span style="color: #ff0000">target</span></strong>)</div><br /><br />
调整成(将<span style="color: #ff0000"><strong>target</strong></span>参数提前)<br /><div style="border-style: dotted dotted dotted solid; border-color: #8394b2; border-width: 1px 1px 1px 4px; padding: 3px; background: #fafcfe none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">/** <br />&nbsp;* @param &lt;string&gt; path (package:Object|package.Object|package.*| scriptPath) <br />&nbsp;* @param &lt; Object&gt; target
可选参数，指定导入容器。<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当该参数为有效对象时(instanceof Object &amp;&amp; not instanceof Function)，导入的元素将赋值成其属性；<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当该参数未指定时
(arguments.length==1)， target为全局变量容器,这种情况等价于直接声明的全局变量。 <br />&nbsp;* @param &lt;boolean|Function&gt; col callbackOrLazyLoad 可选参数,默认为null。<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果其值为函数，表示异步导入模式；<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果其值为真，表示延迟同步导入模式，否则为即时同步导入（默认如此）。 <br />&nbsp;*/  <br />
$import(path,<span style="color: #ff0000"><strong>target</strong></span>,col)</div><br /></blockquote>




<br />
<strong><br /></strong><h4>
理由：</h4><blockquote>
延迟装载和异步装载并不常用。<br />
而target紧跟path似乎更合逻辑。<br /></blockquote><p>&nbsp;</p><h4>
不妥之处：</h4><blockquote>
对于target的处理：<br />
以前的办法：当制定null时，是不会将导入的对象拉出来的，只有没有指定target的时候，才会使用global(window)对象（arguments.length&lt;=2）。<br />
而现在，一但指定了callbackOrLazyLoad，target就必须指定了，这个时候，如何去处理还没想好。<br /></blockquote><p>&nbsp;</p><h4>
JSI开发现状：</h4><blockquote>
<a href="http://xidea.cvs.sourceforge.net/xidea/JSI2/web/source/boot-core.js?view=markup" target="_blank">http://xidea.cvs.sourceforge.net/xidea/JSI2/web/source/boot-core.js?view=markup</a><br />
目前主要的发展方向是开发环境支持、简化内核。 <br />
一切向易用、简单、性能方向考虑；避免过渡设计。<br />
2.0版，启动文件压缩后近<strong>30k</strong><br /><br />
2.1彻底清理了一些不常用的功能，同时，将一些非必要的功能，作为可选项。<br />
最小版本压缩后不到<strong>5k</strong>（未启用文本压缩）。</blockquote><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/161609#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 07 Feb 2008 17:20:18 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/161609</link>
        <guid>http://JSI.group.javaeye.com/group/blog/161609</guid>
      </item>
          <item>
        <title>JSI2.1计划</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/152188" style="color:red;">http://JSI.group.javaeye.com/group/blog/152188</a>&nbsp;
          发表时间: 2008年01月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先回顾历史：<br />
JSI1（2006-2007）是个简单的框架，只有脚本级别的依赖管理，只有阻塞同步装载模式。<br />
<br />
JSI2 （2007-2008）是个庞然大物，同步装载，异步装载，延迟装载，装饰引擎。。。。。<br />
网撒的太宽，而且学习曲线也非常陡峭。<br />
<br />
JSI2.1 新的2008，JSI2也打算做点改进。<br />
时至今日， JSI已经有两年多的历史了，自己也在大大小小的项目中有了不少实践，普遍的反映是。内核庞大。依赖管理复杂，难以掌握。<br />
<br />
确实，JSI的依赖管理非常复杂，而且内核源码的组织也不够完美。装饰引擎，异步装载，等等，全部混合在一起，别说他人，我自己看着也头晕。当时的借口：压缩优化。得了，为了压缩损失代码的可读性，实在是有点笨。改吧：<br />
初步决定的重构点如下。<br />
<br />
<strong>1。新的定位</strong><br />
以前都吧JSI定位成运行时的脚本管理，经过一年多的实践，发现，让他作为开发期的脚本管理更有价值。因其无侵入的特征，开发结束后，导出脚本就是。光脚的不怕穿鞋的，没有装载器的束缚，跑的更快。<br />
<br />
<strong>2。去除js.*.*包，内核不包括任何托管脚本。</strong><br />
JSI2中有些包是内核用到的，比如异步装载就需要队列管理（js.util.TaskQueue）。<br />
还有，总想写一些大家能公用的基础包，实事证明，没那个必要，保留框架的简单最重要，这次重构的目标之一就是吧引导文件控制在10k以内（补充一下第一
条，我虽然吧JSI做成开发期的脚本管理框架，运行时同样支持，10k的附加引导文件，轻微的装载开销，我想还是能被大多数用户接受的）。<br />
<br />
<strong>3。把装饰引擎和异步装载延迟装载从内核中剥离。</strong><br />
JSI的一个重要目标是无侵入，当时这个已经给依赖管理变得复杂了，而我们还吧这一堆东西困在一起，导致一个core.js就达到了2000行的代码，实在有点过。重新规划。<br />
<table border="0" cellspacing="0" cellpadding="0">
	<tbody>
		<tr>
			<td>
			<p>
			boot-core.js
			</p>
			</td>
			<td>简单内核</td>
		</tr>
		<tr bgcolor="#f8f8f8">
			<td>
			<p>
			boot-lazy.js
			</p>
			</td>
			<td>
			<p>
			扩展简单内核中的import函数，令其支持异步和延迟两种装载模式
			</p>
			</td>
		</tr>
		<tr>
			<td>
			<p>
			boot-decorator.js
			</p>
			</td>
			<td>
			<p>
			装饰引擎支持。
			</p>
			</td>
		</tr>
	</tbody>
</table>
<br />
后两个脚本是可选的，如opoa中，我们理当吧全部脚本打包在一起，这时，就完全没有异步装载和延迟装载的必要。而装饰引擎更是没必要强行推销。<br />
<br />
<strong>4。删除CSS导入功能，删除内置日志功能。</strong><br />
JSI的内核已经够庞大了，这些不常用的功能就不要给我添乱了^_^<br />
<br />
<strong>5。重构脚本定义函数</strong><br />
原来用于脚本管理的函数有:<br />
<pre name="code" class="js">
this.addScript(file,objects)
this.addObjectDependence(object,
dependenceObject,
isBeforeLoadDependence);
this.addScriptDependence(script, dependenceScript, isBeforeLoadDependence);
this.addObjectScriptDependence(object, dependenceScript, isBeforeLoadDependence);
this.addScriptObjectDependence(script, dependenceObject, isBeforeLoadDependence);
</pre>
&nbsp;<br />
<br />
好复杂啊，重构成:<br />
<pre name="code" class="js">
this.addScript(file,objects,beforeLoadDependences,afterLoadDependences)
this.addDependence(object,
dependenceObject,
isBeforeLoadDependence);
</pre>
<p>
&nbsp;<br />
<br />
重构理由：<br />
把添加脚本和添加依赖放在一起，更加简单方便了。不过，这样我们只能添加整个脚本的依赖，如果要添加单个对象的装载后依赖（很少见），还是的借助addDependence函数。<br />
四个添加脚本依赖函数，没必要吧？到底是脚本依赖还是对象依赖完全可以自动探测，何必给用户添加麻烦。<br />
<br />
<strong>6。脚本定义时*模式的支持（调试模式）。</strong><br />
很多人都认为JSI的包定义语法有些复杂，比如我们定义一个脚本，还需要指出我脚本里面的元素名称，那些东西我都在源文件里var function什么的都申明了啊！！<br />
确实，如果你只是想吧你在源文件中申明的东西全部暴露出来，我们一直都没有一个简单有效的办法，现在，我们将引入*模式。<br />
包定义实例：
</p>
<p>
&nbsp;
</p>
<div style="border-style: dotted dotted dotted solid; border-color: #8394b2; border-width: 1px 1px 1px 4px; padding: 3px; background: #fafcfe none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
this.addScript('youscript.js','*')
</div>
关于实现，这确实是个大问题，我们需要用脚本分析你的js文件，找出你定义的全部变量、函数。是个较大的开销。所以，我们只能在调试模式下支持该功能，产品发布时，可以在脚本编译时计算出准确的变量名称数据。<br />
<br />
<strong>7。异步装载和延迟装载的优化。</strong><br />
首先，我决定取消包的非即时装载功能，理由，包定义文件本来就很小，没必要。而且一旦放开了这一枷锁，实现将简单很多很多。<br />
<br />
<strong>8。调试支持附加功能<br />
</strong>调试支持涉及到很多的内容。<br />
1。IE7原生XHR不支持本地文件访问。这样一来无法本地调试，所以，我们还要为IE7做特殊处理。<br />
2。延迟装载的调试时最友好的，应为它不是用eval装载的脚本，可以很方便的找到出错位置。但是，这需要编译支持的，我们不能修改后马上见效。这样，我们就可以借助非ie浏览器支持的data协议，脚本内编译预装载脚本。<br />
。。。。<br />
这些东西，开发期的东西，写的大一点，多一点，升值性能低一点，无所谓。上线时踢出了照常运行^_^<br />
<br />
<br />
<br />
<strong><br />
此外，我还打算支持一些其他装载模式。</strong><br />
比如，我们可以吧JSI以最简单的方式工作，如，不需要装载单元的隔离。<br />
不需要依赖管理<br />
这样虽然有点退化的感觉，不过也是一种普及JSI的办法，JSI的思想有点超前了，曲高和寡，不如做点简单的东西，让大众也能接受东西。<br />
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/152188#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jan 2008 21:13:59 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/152188</link>
        <guid>http://JSI.group.javaeye.com/group/blog/152188</guid>
      </item>
          <item>
        <title>JSI2 新功能预告：类库导出支持、Ext集成</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/100387" style="color:red;">http://JSI.group.javaeye.com/group/blog/100387</a>&nbsp;
          发表时间: 2007年07月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>* 类库导出支持（完全脱离JSI环境）</strong><br />  从JSI托管类库中，选择文件/对象集，导出为单一脚本文件，完全脱离JSI装载环境。<br />  也就是说，届时JSI不仅可以作为一个运行时的脚本管理框架，也可以当作一个部署时的脚本定制、打包工具。<br /><br />  我是看Ext的定制工具后产生这个想法的，JSI的依赖定义API完全可以用作一个通用的脚本定制、打包工具的依赖描述语言。<br /><br /><strong>* Ext集成（延期。。） </strong><br />  集成Ext，一方面可以弥补JSI组件的缺乏。另一方面可以优化Ext的装载延迟。<br />  ext目前大小为：462,031字节，JSI2Alpha版的内核为35,140字节，不到Ext的十分之一（文件大小均在文本压缩之前记数）。集成Ext后，用户可以使用JSI导入函数，按需导入那些页面上<strong>直接</strong>使用到的元素。<br /><br />  一些细节的想法：<br />  初步决定使用jquery为其基础类库（prototype不必担心，JSI可以隔离脚本冲突，不会影响到prototype用户）。<br />  装载单元划分的两种想法：<br />  1.按照 <a href="http://extjs.com/download/build" target="_blank">http://extjs.com/download/build</a> 中描述的定制模块划分（可能做些文件合并，避免零碎文件的装载开销）<br />  2.按照Ext内部包划分（Ext 下载包的packages目录下好像已经做了文件合并） <br /><strong><br /><span style="color: blue">我个人还没用过Ext，非常希望有Ext用户合作。</span></strong><br /><br /><span style="color: red"><strong>补充一下最新进展：</strong><br /><ul><li>类库导出正在开发，最迟春节前期发布。</li><li>Ext集成延期，估计短期内不会有进展。</li></ul><br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/100387#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jul 2007 12:25:26 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/100387</link>
        <guid>http://JSI.group.javaeye.com/group/blog/100387</guid>
      </item>
          <item>
        <title>JSI2性能测试报告</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/93118" style="color:red;">http://JSI.group.javaeye.com/group/blog/93118</a>&nbsp;
          发表时间: 2007年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>装载效率测试</strong><br />测试页面见：test/load-eff-test.html<br /><br />为了测试结果更显客观，我选择了第三方类库的装载测试：<br />'com.yahoo.yui.*',<br />'net.conio.prototype.*',<br />'net.fckeditor.*',<br />'org.jquery.*',<br />'us.aculo.script.*'<br />共22个脚本文件（对于JSI来说还有诺干包定义文件）。<br /><br /><pre name="code" class="java">FF2:
标记导入时间（原始方式）:469,469,1047,484,484,437,469,484
同步导入时间:469,453,484,437,469,453
延迟导入时间:921,765,891,906,953,906,922
异步导入时间:859,1093,1141,1031,1641,1125,1078,1093,1157,1141

IE7:
标记导入时间:343,297,297,344,328,328
同步导入时间:281,250,235,235,234,234,250,265
延迟导入时间:922,422,406,391,391,391,407,391
异步导入时间:625,672,672,703,703,672,703,704,688</pre><br /><br /><br /><strong>运行时间测试</strong><br />测试脚本管理后对新能的影响,影响因素有：全局变量和局部变量的查找时间差异，eval的脚本和script标记直接插入的脚本的可能差异。（这个测试不具有普遍性，这里我主要是测试了一下浏览器对局部变量的访问速度【JSI里面访问变量都是装载单元内的局部变量】，所以故意测试了大量局部变量访问的操作）<br />测试页面见：test/runtime-eff-test.html<br /><pre name="code" class="java">FF2：
jsiTime:		845,	927,	598,	687,	764,
scriptTime:		1432,	950,	1305,	1278,	1219,
evalTime:		1644,	1373,	1322,	1186,	1360,
execTime:		0
dscriptTime:	1432,	950,	1305,	1278,	1219,	

IE7:
jsiTime:	295,	205,	157,	315,	156,	142,	375,	328,	172,	172,	
scriptTime:	172,	172,	189,	140,	251,	187,	217,	203,	172,	234,	
evalTime:	236,	249,	139,	172,	281,	171,	172,	108,	436,	359,	
execTime:	219,	234,	314,	157,	220,	266,	204,	234,	187,	95,	
dscriptTime:	187,	265,	294,	326,	187,	328,	 141,	221,	127,	249,	 </pre><br /><br /><br />上面的基数太小，随机误差太大，调整原始数据从新测试一遍jsiTime和scriptTime<br /><pre name="code" class="java">jsiTime:	576,	658,	688,	703,	611,	608,		
scriptTime:	706,	608,	562,	547,	655,	657,	</pre><br /><br /><br /><strong><br />总结：</strong><br />JSI的装载性能表现不错，完全不必计较。<br />托管代码的运行性能也没有太大区别，不过，因为。JSI托管脚本使用的变量基本都是装载单元内的局部变量（本地声明变量，或者外部依赖的引用或值拷贝），所以，对于FF这类局部变量比全局变量访问速度快不少的解释引擎，JSI托管脚本可以达到更好的运行效率。<br /><br /><span style="color: red">有个奇怪的问题，JSI在装载类库时，与传统模式相比，肯定增加了些额外的运算，但是，貌似JSI的同步装载模式下，装载脚本的耗时比传统模式还少（IE 表现明显）？为何？</span><br />欢迎大家对这奇怪的现象提出自己的猜想，我稍后贴出我对此问题的看法^_^
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/93118#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Jun 2007 12:49:33 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/93118</link>
        <guid>http://JSI.group.javaeye.com/group/blog/93118</guid>
      </item>
          <item>
        <title>JSI2Alpha及JSA1beta 发布：</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/93108" style="color:red;">http://JSI.group.javaeye.com/group/blog/93108</a>&nbsp;
          发表时间: 2007年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JSI2Alpha及JSA1beta 发布：<br /><br /><div class="quote_title">引用</div><div class="quote_div">JSI简介：<br /><br />JSI 是一个 开放的、无侵入的 脚本库管理框架，内核不提供任何具体功能，有一些功能子项目，如网页装饰引擎。<br /><br /><br />JSI2性能测试报告：<a href="http://jindw.javaeye.com/blog/93118" target="_blank">http://jindw.javaeye.com/blog/93118</a><br /><br />更多信息请查看：<a href="http://www.xidea.org/project/jsi/" target="_blank">http://www.xidea.org/project/jsi/</a><br /><br />JSA简介：<br />JSA最初是做JSI编译处理的一个小工具，现在也可以用来混淆、压缩脚本。支持swing和ant task两种工作方式。<br />可以通过webstart启动：<a href="http://www.xidea.org/webstart/JSA.jnlp" target="_blank">启动JSA（允许访问文件系统）</a>，<a href="http://www.xidea.org/webstart/JSA2.jnlp" target="_blank">沙箱内运行（功能受限）</a></div><br /><br /><br />这次发布的JSI2Alpha相对于以前的预览版本，做了一次全面的重构；同时对API做了些简化。<br /><br /><a href="http://www.xidea.org/project/jsi/scripts/org/xidea/jsdoc/index.html" target="_blank">目前JSI2的公开API有：</a><br /><br /><br /><pre name="code" class="java">/* 导入函数 */
$import(&lt;string>path,&lt;boolean|Function>callbackOrLazyLoad[可选参数],&lt;Object>target[可选参数])

/* 日志设置相关 */
$JSI.setDefaultLogLevel(level)
$JSI.setLogLevel(pathPattern,level)

/* 装饰引擎相关函数 */
$JSI.addDecoratorProvider(pkg,alias…) //添加装饰包.
$JSI.decorate ( ) //准备执行装饰器任务,一般在配置文件（config.js）中调用. 

/* 用于包定义的Package成员函数，在__package__.js中调用（this指向当前package对象） */
this.addScript(scriptPath,objectNames)//添加脚本及其声明的对象（函数、方法名）. 
this.add*Dependence(thisPath,targetPath,beforeLoad)//添加脚本依赖.
this.setImplementation(realPackage)//设置具体实现包(当前包只是其别名，并无任何内容)。
</pre><br /><br /><strong>我们会尽量将JSI做成与具体功能无关（专著于脚本管理）。</strong><br /><br />对于js.*.*这个类库，做了些精简。<br />只保留下列元素：<br /><pre name="code" class="java">#js.html //保留这个包，因为这些实在太常用了。
   * BrowserInfo
   * EventUtil
   * StyleUtil

#js.util//保留这个包主要因为异步装载用到这些类库
   * LoadTask
   * Request
   * ScriptLoadTask
   * TaskQueue</pre><br /><br /><br />发布文件说明：<br />自该版本启，source目录将不再打包。<br />但是在scripts目录下新增boot-with-source.js文件，该文件中包含全部源代码的数据。<br />里面编码的源代码可以通过我们的<a href="http://www.xidea.org/project/jsi/scripts/org/xidea/jsdoc/index.html" target="_blank">文档工具</a>查看。让大家习惯一下这个工具的使用：）<br /><br />JSA1beta：增加了对JSI2的编译支持，同时对于普通脚本的压缩，也增加了一些功能：<br />  1. ant task 增加多文件分组合并。<br />  2. swing ui 修正文件编码的bug。<br /><br /><br /><br /><br />下载：<br />javaeye group:  <a href="http://jsi.group.javaeye.com/shares" target="_blank">http://jsi.group.javaeye.com/shares</a><br />sourceforge:    &lt;系统最近好像有问题，我的文件一直没能上传成功> 。。。。。
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/93108#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Jun 2007 12:15:51 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/93108</link>
        <guid>http://JSI.group.javaeye.com/group/blog/93108</guid>
      </item>
          <item>
        <title>JavaScript模板引擎测试，让我空欢喜一场：（</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/88173" style="color:red;">http://JSI.group.javaeye.com/group/blog/88173</a>&nbsp;
          发表时间: 2007年06月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          测试了一下trimpath模板引擎和一个我以前编写xml模板引擎，显示测试结果，耗时比 ：828/16。<br /><br />太让我振奋了。原想，如果效率太低我就放弃这个项目，貌似结果：这个流行的js模板引擎，和我没做优化的xml模板引擎还有这么大的差距？？？<br /><br />仔细检查一下，晕倒，测试模板数据搞错了：（<br /><br />纠正过来，测试数据显示，trimpath比xml模板引擎要快好几倍：（<br /><br />而且，如果模板内使用的循环次数越多，差距越大：（<br /><br />比较扫兴的结果。<br />决定吧这个东西从jsi系统api中删除。<br /><br />不过，感觉，虽然有这点差距，xml模板引擎还是可以作为一个备用选择。<br />基于js标记库，类el表达式，对于熟悉jsp2.0，jstl的程序员来说，还是比较易懂，扩展也相对简单（trimpath没怎么研究，或许是错的）。<br /><br />下载测试：<br />（XML Template是从jsi中拉出来的，部分测试中没有用到的依赖没有包括进去）
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/88173#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 08 Jun 2007 16:18:40 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/88173</link>
        <guid>http://JSI.group.javaeye.com/group/blog/88173</guid>
      </item>
          <item>
        <title>JSI2 API重构进展</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/87625" style="color:red;">http://JSI.group.javaeye.com/group/blog/87625</a>&nbsp;
          发表时间: 2007年06月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">为了jsi2 alpha的尽快发布，我对jsi 的系统api重构了一下，删除了一些不够成熟或者没有必要的api（将他们拖到org.xidea.* 命名空间下）。</div><br /><br />更新（2007－6－9）<br />#js.html //保留这个包，因为这些实在太常用了，<br />* BrowserInfo<br />//保留Decorator是因为装饰器初始化，还是受到点特别关照<br />* Decorator<br />* EventUtil<br />* StyleUtil<br /><br />#js.util//保留这个包主要因为异步装载用到这些类库<br />* LoadTask<br />* Request<br />* ScriptLoadTask<br />* TaskQueue <br /><br /><br />链接：<br /><a href="http://www.javaeye.com/topic/87329" target="_blank"> JSI API之BrowserInfo、EventUtil讨论  </a><br /><br /><strong><span style="color: blue">欢迎大家提出自己的看法：）</span></strong>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/87625#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 07 Jun 2007 11:28:01 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/87625</link>
        <guid>http://JSI.group.javaeye.com/group/blog/87625</guid>
      </item>
          <item>
        <title>JSI API之BrowserInfo、EventUtil讨论</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/87329" style="color:red;">http://JSI.group.javaeye.com/group/blog/87329</a>&nbsp;
          发表时间: 2007年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">JSI 自身提供一些常用API，数量极少，尽量以一种正式的风格提供，尽量回避争议。<br />有些是启动文件用到的，如任务队列支持，还有如装饰引擎直接用到的，如BrowserInfo、EventUtil、StyleUtil等。<br />对于启动文件中未直接用到的，如果风格的争议太大，都将剔除出去。</div><br /><br /><span style="font-size: 18pt"><strong>BrowserInfo对象：</strong></span><br /><pre name="code" class="java">/**
 * BrowserInfo 对象，用于判断浏览器的相关信息，如浏览器类型、quirks模式、客户端语言（简体中文？英语..未实现）、操作系统（未实现）等等。
 * @public
 */
var BrowserInfo = {
  isIE : falseChecker,
  isOpera : falseChecker,
  isGecko : falseChecker,
  isNetscape : falseChecker,
  isMozilla : falseChecker,
  isFirefox : falseChecker,
  isKhtml : falseChecker,
  isSafari : falseChecker,
  isKonqueror : falseChecker,
  isQuirks : function(){…}
};</pre><br />其中最常用的要数 is&lt;浏览器类别>（最小版本号码,最大版本号）。<br />此外，我还将BrowserInfo的函数拷贝到navigator对象上，这个有无必要呢？<br /><pre name="code" class="java">//@Deprecated ???
for(var n in BrowserInfo){
  window.navigator[n] = BrowserInfo[n];
}</pre><br /><br /><strong>不同之处：</strong><br />现在在浏览器判断上面，一般是用常量表示，比如isIE之类的，JSI的BrowserInfo使用函数，以便提供更强大更灵活的功能。<br /><span style="font-size: 18pt"><br /><strong>EventUtil</strong></span><br />EventType 对象的成员函数有：<br /><br /><pre name="code" class="java">addListener(el, type, fn, cap)
removeListener(el, type, fn, cap)

add&lt;Eventtype>Listener(element, listener, captrue)
如addLoadListener，addMousedownListener，addMouseoutListener 	
remove&lt;Eventtype>Listener(element, listener, captrue)
createEvent(type, canBubble, cancelable)
dispatchEvent(el, even)</pre><br />其中: <span style="color: red"><strong>&lt;Eventtype></strong></span>代表一种事件类型。<br />W3C事件类型有：<br /><pre name="code" class="java">var events = ['click','mousedown','mouseup','mouseover','mousemove','mouseout','load','unload','abort','error','select','change','submit','reset','focus','blur','resize','scroll'].
             concat(['DOMFocusIn','DOMFocusOut','DOMActivate']);</pre><br /><br />此外，还添加了一种事件类型：DOMLoad。就是mozilla的DOMContentLoaded事件，在Dom树构造完成但图片资源等可能未完成时触发。<br />对于这种事件类型， element,  captrue参数都将忽略。暂时只有添加函数，没有删除函数（有删除的必要吗？）。<br /><strong><br />不同之处：</strong><br />这个事件处理函数集与其他常见方式的却别有：<br />1.  this支持。IE的attach方法添加的函数，运行时this指向window对象，JSI吧这点给纠正过来，与w3c的addEventListener行为一致。<br />2.  事件类型直接体现在函数名中，这样有利于书写上的错误及早发现。<br />3.  事件格式化，将事件的访问方式格式化为W3C的方式。<br />4.  自动清理，这也不算不同吧，现在大多数JS库都提供这个功能，就是在离开页面时清理全部注册事件。但是这对一些单页程序是无效的（OPOA，本人也比较讨厌这种模式，呵呵），以后是否可以提供一个purgeElement函数，用于清理指定元素及其子元素的事件呢？<br /><br /><strong><br />程序下载</strong><br /><br />这个API也可以脱离JSI使用，只是，在编写的时候，因为有了JSI的保护，我使用了不少内部变量，为避免可能的冲突，做了如下处理。<br /><pre name="code" class="java">var BrowserInfo = function(){
  //#include(browser-info.js)....
  return BrowserInfo;
}

var EventUtil = function(){
  //#include(event-util.js)....
  return EventUtil;
}</pre><br /><br /><strong><br /><span style="color: blue">非常希望大家积极发表自己的看法，该修改就修改，如果争议太大，那么我将吧这些从系统API中移除。</span></strong>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/87329#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Jun 2007 11:07:02 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/87329</link>
        <guid>http://JSI.group.javaeye.com/group/blog/87329</guid>
      </item>
          <item>
        <title>javascript 性能测试系列：循环反转的效果</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/85034" style="color:red;">http://JSI.group.javaeye.com/group/blog/85034</a>&nbsp;
          发表时间: 2007年05月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          循环反转示例:<br /><pre name="code" class="java">
  for(var i = 0;i&lt;data.length;i++){
    //.
  }
  //倒转后代码
  for(var i = data.length-1;i>=0;i--){
    //.
  }</pre><br /><br />这类优化的作用是明显的,但是具体有多大作用呢?<br /><br />用一个长度为100 000 的数组测试一下:<br />515/313<br />500/313<br />516/312<br />516/328<br />516/328<br /><br />可见,循环反转后,只需要原来3/5的时间.<br />但是,这种东西到底有多大价值?FF上200次循环仅需要1毫秒的时间.所以,个人认为,只要循环的内容不是太长,使用不算非常频繁,那么没有太大必要.<br />加入循环的长度需要通过函数取得,且不变,那么,反转的效率还是可观的,在IE上,函数调用消耗是普通操作的十多倍.<br /><br />测试代码:<br /><pre name="code" class="java">var incTime = 0;
var decTime = 0;
var inc = 0;
var data = new Array(10*10000);
//while(inc++&lt;50)
{
  var t1 = new Date();
  for(var i = 0;i&lt;data.length;i++){
  }
  var t2 = new Date();
  for(var i = data.length-1;i>=0;i--){
  }
  var t3 = new Date();
  incTime+=(t2-t1);
  decTime+=(t3-t2);
}

prompt("incTime/decTime",incTime +'/'+decTime)</pre>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/85034#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 31 May 2007 12:29:22 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/85034</link>
        <guid>http://JSI.group.javaeye.com/group/blog/85034</guid>
      </item>
          <item>
        <title>javascript 性能测试系列：正则表达式</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/84732" style="color:red;">http://JSI.group.javaeye.com/group/blog/84732</a>&nbsp;
          发表时间: 2007年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在<a href="http://www.xidea.org/project/jsi/">JSI</a>的实现中,有这样一种需求,将有自带命名空间的脚本元素名数组转换成没有命名空间的变量名数组.<br />
比如 :<br />
['YAHOO.util.XXXX,YAHOO.util.YYYY,YAHOO.event.XX'] -&gt;['YAHOO']<br />
<br />
以前一直是较长的一段处理代码,今天突发奇想,这个用正则表达式处理效果如何?<br />
<br />
于是,就这种处理,分别测试了正则表达式和javascript代码的效率.<br />
<br />
测试数据如下(regTime /codeTime):<br />
620/4536<br />
729/4068<br />
719/4250<br />
645/4152<br />
655/4642<br />
<br />
FF和IE结果差不多,上面是FF2的数据<br />
<br />
<strong>总结:<br />
经常看见很多地方对正则表达式的效率的怀疑,但是这个问题放在javascript里面,好像情况又不同了. 适当使用正则式,反而可以大大提高效率.<br />
在javascript这类\较慢的解释型语言里面,少即快,能用原生代码就不要自己写.<br />
<br />
</strong>测试代码:
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;data&nbsp;=&nbsp;[];&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0;i&lt;20;i++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;data[i]&nbsp;=&nbsp;<span class="string">&quot;NS&quot;</span><span>+i/10+</span><span class="string">'.'</span><span>+i&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.write(&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="comment">//(data&nbsp;==&nbsp;data.sort())&nbsp;+&quot;/&quot;+</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;data&nbsp;+<span class="string">&quot;&lt;hr&gt;&quot;</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;regTime&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;codeTime&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;inc&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;reg&nbsp;=&nbsp;/(\b[\$\w]+)[\$\w\.]*(,\1\b[\$\w\.]*)*/g;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;regResult,codeResult;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">while</span><span>(inc++&lt;100){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;i=0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">while</span><span>(i++&lt;100){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;regResult&nbsp;=&nbsp;data.join(',').replace(reg,'$1').split(',');&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">while</span><span>(i++&lt;200){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;codeResult&nbsp;=&nbsp;[];&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;flagMap&nbsp;=&nbsp;{};&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;j=data.length-1;j&gt;=0;j--){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;data[j];&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;key.substr(0,key.indexOf(<span class="string">'.'</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!flagMap[key]){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codeResult[codeResult.length]&nbsp;=&nbsp;(key);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//codeResult.push(key);</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flagMap[key]&nbsp;=&nbsp;<span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t3&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;regTime&nbsp;+=(t2-t1);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;codeTime+=(t3-t2);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>document.write(&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="string">&quot;regResult:&quot;</span><span>+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;regResult)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.write(&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="string">&quot;&lt;hr&gt;codeResult:&quot;</span><span>+&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;codeResult)&nbsp;&nbsp;</span></li>
    <li class=""><span>prompt(<span class="string">&quot;regTime&nbsp;/codeTime&quot;</span><span>,regTime&nbsp;&nbsp;+'/'+codeTime)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
<br />
注:<br />
这段正则代码是不严谨的,当数组中有多个命名空间,且顺序打乱时,不能剔除全部重复变量.不过JSI中对这个结果尚可接受.<br />
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/84732#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 May 2007 13:18:05 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/84732</link>
        <guid>http://JSI.group.javaeye.com/group/blog/84732</guid>
      </item>
          <item>
        <title>javascript 性能测试系列：函数调用</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/84528" style="color:red;">http://JSI.group.javaeye.com/group/blog/84528</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一直都认为，javascript的函数调用是一个相对耗时的操作。<br />
开始<a href_cetemp="http://www.blogjava.net/jindw/admin/www.xidea.org/project/jsi" href="http://www.blogjava.net/jindw/admin/www.xidea.org/project/jsi">JSI</a>的优化，这些问题现在必须认真考虑了，测试一把：<br />
<br />
一个简单的＋＋操作，直接操作和函数内操作（注，函数参数对原始类型是值传递，所以这不会影响被传入的变量，这里测试里面，两类操作的行为是不一样的）<br />
<br />
FF2测试结果（callTime/opTime）：<br />
2871/2582<br />
2919/2675<br />
2734/2704<br />
2953/2516<br />
3732/3346<br />
<br />
IE7测试结果：<br />
3140/376<br />
3173/327<br />
3238/247<br />
3265/235<br />
3217/299<br />
<br />
<span style="font-weight: bold;">通过测试可见，函数调用的消耗基本可以忽略。每次调用时间仅为：</span><br style="font-weight: bold;" />
<span style="font-weight: bold;">3000/(200*1000*5) ==0.3毫秒 ，这个时间还包含函数内部的＋＋操作<br />
<br />
从示例可见，FF的函数调用消耗基本可以府略，IE虽然相当于十倍＋＋类简单操作，但依然不足以重视。<br />
</span><br />
奇怪的是，第一次碰见ie的运行效率高于ff的情况。<br />
<br />
测试代码<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;callTime&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;opTime&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;inc&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;plus(z){z++};&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">while</span><span>(inc++&lt;200){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;i=0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;x&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">while</span><span>(i++&lt;1000){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;plus(x);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;plus(x);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;plus(x);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;plus(x);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;plus(x);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">while</span><span>(i++&lt;2000){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;x++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;x++;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;x++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;x++;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;x++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t3&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;callTime+=(t2-t1);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;opTime+=(t3-t2);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>prompt(<span class="string">&quot;callTime/opTime&quot;</span><span>,callTime&nbsp;+'/'+opTime)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/84528#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 May 2007 18:06:28 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/84528</link>
        <guid>http://JSI.group.javaeye.com/group/blog/84528</guid>
      </item>
          <item>
        <title>javascript 性能测试系列：for in 循环效率的疑惑</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/83593" style="color:red;">http://JSI.group.javaeye.com/group/blog/83593</a>&nbsp;
          发表时间: 2007年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天无意中看到一个网友blog上关于这个循环效率的问题，说要尽量避免使用。<br />
有点害怕，我在<a href="http://www.xidea.org/project/jsi/" href_cetemp="http://www.xidea.org/project/jsi/">JSI</a>中可是用了不少，呵呵。<br />
测试一下，负担终于可以放下来了：<br />
<br />
测试对象：<br />
一个对象模拟map，测试for in 循环<br />
两个数组，测试for(;;)循环<br />
<br />
连续4次运行时间比。<br />
957/1278；955/1357；1014/1282；968/1392<br />
<br />
<br />
<strong><span style="font-weight: bold;">明显，要实现类似map的功能，还是for in 快点。</span></strong><br />
<br />
上面的数据是ff2上的结果，ie7上也差不多，差距更小一点。<br />
<br />
测试代码：<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;C(i){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;i&lt;62?&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;String.fromCharCode(i+=&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&lt;26?65&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:i&lt;52?71<span class="comment">//97-26</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:-4<span class="comment">//48-26-26</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:i&lt;63?'_'&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:i&lt;64?'$'&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:C(i&gt;&gt;6)+C(i&amp;63)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;map&nbsp;=&nbsp;{};&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;arr1&nbsp;=&nbsp;[];&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;arr2&nbsp;=&nbsp;[];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0;i&lt;1000;i++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;c&nbsp;=&nbsp;C(i);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;map[c]&nbsp;=&nbsp;i;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;arr1.push(c);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;arr2.push(i);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;mapTime&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;arrTime&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;inc&nbsp;=&nbsp;0&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">while</span><span>(inc++&lt;500){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;n&nbsp;</span><span class="keyword">in</span><span>&nbsp;map){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;map[n];&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;j&nbsp;=&nbsp;0;j&lt;1000;j++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=arr1[j];&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=arr2[j];&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;t3&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;mapTime+=(t2-t1);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;arrTime+=(t3-t2);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>prompt(<span class="string">&quot;mapTime/arrTime&quot;</span><span>,mapTime&nbsp;+'/'+arrTime)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/83593#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 May 2007 17:55:03 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/83593</link>
        <guid>http://JSI.group.javaeye.com/group/blog/83593</guid>
      </item>
          <item>
        <title>决定对JSI的依赖管理部分做一些简化</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/81537" style="color:red;">http://JSI.group.javaeye.com/group/blog/81537</a>&nbsp;
          发表时间: 2007年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以前JSI的依赖管理设置时，依赖元素可以用* 、含有*的匹配模式、数组和单个元素。<br />
<br />
感觉这样处理难度增加了很多，决定吧匹配模式去掉，只支持 *、数组和单个元素<br />
含有*的匹配模式可以用精确的数组代替。<br />
<br />
原来的做法太复杂了，改简单一点，提高效率，便于优化。
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/81537#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 May 2007 13:17:01 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/81537</link>
        <guid>http://JSI.group.javaeye.com/group/blog/81537</guid>
      </item>
          <item>
        <title>关于JSI日志输出的想法</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/80959" style="color:red;">http://JSI.group.javaeye.com/group/blog/80959</a>&nbsp;
          发表时间: 2007年05月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JSI 日志是JSI内核中唯一的一个具体功能。<br />
<br />
在2.0preview 中，默认是输出倒错误控制台的。<br />
实现方式<br />
setTimeout(function(){<br />
throw new Error(错误信息)<br />
},0)<br />
<br />
但是这样貌似有个异步代码错误插入的问题（当有程序异步调用时，setTimeout抛出的错误可能会导致异步代码中抛出异常，就像错误发生在异步代码中一样）。<br />
<br />
所以这个问题必须解决了。<br />
<br />
<br />
原先的想法是模仿<a rel="nofollow" title="http://www.timdown.co.uk/log4javascript" class="external text" href="http://www.timdown.co.uk/log4javascript">log4javascript</a>。 那样，在日志窗口，可以实现很多复杂功能。<br />
但是，因为日志系统时内核的部分，不想做的太复杂。打消了这个念头。<br />
不过，可以实现这个功能，在托管类库中，用户需要，可以通过$JSI.setConsole(new OtherConsole())方式使用。<br />
<br />
后来又想模仿 <a rel="nofollow" title="http://log4js.berlios.de/" class="external text" href="http://log4js.berlios.de/">Log4js</a> 。不过最后还是打消了，浏览器依赖太严重。也有点复杂，同上作为可选方案还行。<br />
<br />
<br />
算了，不去模仿别人了，还是以自己的方式吧。<br />
<br />
暂时想法如下：<br />
使用<strong> confirm</strong>函数，以前的版本曾经使用过alert输出，但是很多alert比较烦人。这次我用confirm，我可以在没个输出后询问，下次同样等级的日志还要不要输出。<br />
不要，那么下次就不用再受打扰了。<br />
<br />
<strong><br />
这是</strong><strong>现在</strong><strong>我的想法，欢迎大家讨论建议</strong>。
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/80959#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 May 2007 20:09:22 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/80959</link>
        <guid>http://JSI.group.javaeye.com/group/blog/80959</guid>
      </item>
          <item>
        <title>关于半透明遮罩的优化（关机效果）</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/80905" style="color:red;">http://JSI.group.javaeye.com/group/blog/80905</a>&nbsp;
          发表时间: 2007年05月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在搞JSI 的重构，少来冒泡了。<br />
发一个中午的刚用到的小技巧：<br />
<br />
在关机效果实现上，现在一般根据浏览器特征分别使用 虑镜/样式/图片 去模拟。<br />
<br />
其中Opera是不支持网页透明的，只能用png的alpha透明模拟。<br />
所以，我们需要一张特别的小图片。一个象素，alpha透明。<br />
<br />
但是这个单象素图片的出现，感觉有点怪怪的，而且当网速很慢的时候，装载这个小图片还会延迟，效果不好。<br />
<br />
不过，Opera的另外一个特性，可以避免这个问题：data:协议的支持。<br />
<br />
对于这种小图片，完全可以编码到样式里面<br />
<br />
<br />
<div class="code_title">css 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol start="1" class="dp-css">
    <li class="alt"><span><span class="keyword">background-image</span><span>:</span><span class="string">url</span><span>(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mM4ffp0AwAHqALiYeNxSgAAAABJRU5ErkJggg==)   </span></span></li>
</ol>
</div>
<br />
<br />
好了，如此一来，关机效果的实现，就没有图片这个累赘了。<br />
<br />
<br />
<h2>图片的生成：</h2>
图片的生成，浪费我一个中午的时间：（<br />
开始本想找个软件做掉，最后没发现一个如意的，干脆，自己看看api，自己写了一下：<br />
代码如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol start="1" class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) </span><span class="keyword">throws</span><span> IOException {  </span></span></li>
    <li class=""><span>    BufferedImage image = <span class="keyword">new</span><span> BufferedImage(</span><span class="number">1</span><span>, </span><span class="number">1</span><span>,  </span></span></li>
    <li class="alt"><span>            BufferedImage.TYPE_INT_ARGB);  </span></li>
    <li class=""><span>    Graphics2D g2d = image.createGraphics();  </span></li>
    <li class="alt"><strong><span>    <span class="comment">// RGBA #cccccc80</span><span>  </span></span></strong></li>
    <li class=""><strong><span>    g2d.setColor(<span class="keyword">new</span><span> Color(</span><span class="number">0xcc</span><span>, </span><span class="number">0xcc</span><span>, </span><span class="number">0xcc</span><span>, </span><span class="number">0x80</span><span>));  </span></span></strong></li>
    <li class="alt"><span>    g2d.fillRect(<span class="number">0</span><span>, </span><span class="number">0</span><span>, </span><span class="number">1</span><span>, </span><span class="number">1</span><span>);  </span></span></li>
    <li class=""><span>    g2d.dispose();  </span></li>
    <li class="alt"><span>    IIOImage iioImage = <span class="keyword">new</span><span> IIOImage(image, </span><span class="keyword">null</span><span>, </span><span class="keyword">null</span><span>);  </span></span></li>
    <li class=""><span>    ImageTypeSpecifier type = ImageTypeSpecifier  </span></li>
    <li class="alt"><span>            .createFromRenderedImage(image);  </span></li>
    <li class=""><span>    ImageWriter writer = (ImageWriter) ImageIO.getImageWriters(type, <span class="string">&quot;png&quot;</span><span>)  </span></span></li>
    <li class="alt"><span>            .next();  </span></li>
    <li class=""><span>    ByteArrayOutputStream out = <span class="keyword">new</span><span> ByteArrayOutputStream();  </span></span></li>
    <li class="alt"><span>    writer.setOutput(ImageIO.createImageOutputStream(out));  </span></li>
    <li class=""><span>    writer.write(<span class="keyword">null</span><span>, iioImage, </span><span class="keyword">null</span><span>);  </span></span></li>
    <li class="alt"><span>    BASE64Encoder encoder = <span class="keyword">new</span><span> BASE64Encoder();  </span></span></li>
    <li class=""><span>    String result = encoder.encode(out.toByteArray()).replaceAll(<span class="string">&quot;[\r\n]&quot;</span><span>,  </span></span></li>
    <li class="alt"><span>            <span class="string">&quot;&quot;</span><span>);  </span></span></li>
    <li class=""><span>    System.out.println(<span class="string">&quot;data:image/png;base64,&quot;</span><span> + result);  </span></span></li>
    <li class="alt"><span>}  </span></li>
</ol>
</div>
<br />
需要其他颜色，自己修改一下代码即是。
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/80905#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 May 2007 15:14:17 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/80905</link>
        <guid>http://JSI.group.javaeye.com/group/blog/80905</guid>
      </item>
          <item>
        <title>发布了一段时间JSI2预览版了，下一步准备JSI2Alpha版开发。</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/79212" style="color:red;">http://JSI.group.javaeye.com/group/blog/79212</a>&nbsp;
          发表时间: 2007年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>发布了一段时间JSI2预览版了，下一步准备JSI2Alpha版开发。<br />
主要任务有：<br />
<br />
1、优化依赖管理模块。<br />
2、完善日志输出功能。<br />
3、清理现有bug。<br />
<br />
预计需要3周左右时间。<br />
<br />
按需装载的优化、JSDoc的完善、将推后。</p>
示例装饰器将暂时停止更新。<br />
<br />
<a href="http://www.xidea.org/project/jsi/index.html">http://www.xidea.org/project/jsi/index.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/79212#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 May 2007 13:07:27 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/79212</link>
        <guid>http://JSI.group.javaeye.com/group/blog/79212</guid>
      </item>
          <item>
        <title>云想衣裳花想容－－JSI组件模型介绍（一）</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/71422" style="color:red;">http://JSI.group.javaeye.com/group/blog/71422</a>&nbsp;
          发表时间: 2007年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JSI组件模型是一种用来装饰简单html元素的框架，使用简单的xml标记，标识其装饰行为，比如将一个普通的input装饰成一个日期输入控件，将一 个html ul标记装饰成菜单或树，将一个textarea装饰成一个代码语法高亮显示区域，或一个wysiwyg html编辑器。<br />
JSI启动后将自动检查decorator标记，构建层次结构，自动做相关类的寻找、导入和装饰操作；实现零脚本代码的web富客户端编程。<br />
<br />
<h2>代码示例：</h2>
<ol>
    <li>日期选择器 (DatePicker):<br />
    <br />
    <div class="dp-highlighter">
    <ol start="1" class="dp-xml">
        <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">d:datepicker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test2&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">d:datepicker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </li>
    <li>编辑器示例 (Editor):<br />
    <br />
    <div class="dp-highlighter">
    <ol start="1" class="dp-xml">
        <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">d:editor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">textarea</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">'editorText'</span><span class="tag">&gt;</span><span>This&nbsp;is&nbsp;some&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">strong</span><span class="tag">&gt;</span><span>sample&nbsp;text</span><span class="tag">&lt;/</span><span class="tag-name">strong</span><span class="tag">&gt;</span><span>.&nbsp;You&nbsp;are&nbsp;using&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;http://www.fckeditor.net/&quot;</span><span class="tag">&gt;</span><span>FCKeditor</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>.</span><span class="tag">&lt;/</span><span class="tag-name">textarea</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">d:editor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </li>
    <li>Spinner控件（Spinner 类似window时间日期管理中，年份调节的控件）:<br />
    <div class="code_title"><br />
    </div>
    <div class="dp-highlighter">
    <ol start="1" class="dp-xml">
        <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">d:spinner</span><span>&nbsp;</span><span class="attribute">start</span><span>=</span><span class="attribute-value">'0'</span><span>&nbsp;</span><span class="attribute">end</span><span>=</span><span class="attribute-value">'8'</span><span>&nbsp;</span><span class="attribute">step</span><span>=</span><span class="attribute-value">'2'</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test2&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">'0'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">d:spinner</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </li>
    <li>客户端包含(Include):<br />
    <div class="code_title"><br />
    </div>
    <div class="dp-highlighter">
    <ol start="1" class="dp-xml">
        <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">d:include</span><span>&nbsp;</span><span class="attribute">url</span><span>=</span><span class="attribute-value">'menu.xml'</span><span>&nbsp;</span><span class="attribute">xslt</span><span>=</span><span class="attribute-value">&quot;menu.xsl&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">d:include</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </li>
    <li>代码语法高亮显示控件(Code):<br />
    <div class="code_title"><br />
    </div>
    <div class="dp-highlighter">
    <ol start="1" class="dp-xml">
        <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">d:code</span><span>&nbsp;</span><span class="attribute">language</span><span>=</span><span class="attribute-value">&quot;js&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;<span class="tag">&lt;</span><span class="tag-name">textarea</span><span class="tag">&gt;</span><span>alert(&lsquo;Hello&nbsp;World&rsquo;)</span><span class="tag">&lt;/</span><span class="tag-name">textarea</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">d:code</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </li>
    <li>标签页控件(TabBox参照xul tabbox标签):<br />
    <br />
    <div class="dp-highlighter">
    <ol start="1" class="dp-xml">
        <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">d:tabbox</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabs</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>tab1</span><span class="tag">&lt;/</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>tab2</span><span class="tag">&lt;/</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>tab3</span><span class="tag">&lt;/</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:tabs</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabpanels</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>content1</span><span class="tag">&lt;/</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>content2</span><span class="tag">&lt;/</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>content3</span><span class="tag">&lt;/</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:tabpanels</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">d:tabbox</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    <br />
    </li>
    <li> 综合示例:</li>
</ol>
来一个复杂一点的完整的例子,以日期选择控件的演示页面为例<br />
页面上有: 标签页装饰器（TabBox&hellip;.）、源代码高亮显示装饰器（Code）、日期选择装饰器（DatePicker）、包含装饰器（Include）：<br />
<div class="code_title"><br />
</div>
<div class="dp-highlighter">
<ol start="1" class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;utf-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Strict//EN&quot;&nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="attribute">xmlns:d</span><span>=</span><span class="attribute-value">&quot;http://www.xidea.org/taglib/decorator&quot;</span><span>&nbsp;</span><span class="attribute">xml:lang</span><span>=</span><span class="attribute-value">&quot;zh_CN&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="attribute">lang</span><span>=</span><span class="attribute-value">&quot;zh_CN&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../scripts/boot.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>DatePicker&nbsp;示例</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">h2</span><span class="tag">&gt;</span><span>DatePicker&nbsp;示例</span><span class="tag">&lt;/</span><span class="tag-name">h2</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comments">&lt;!--&nbsp;开始标签页装饰器&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">d:tabbox</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabs</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>效果</span><span class="tag">&lt;/</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>代码</span><span class="tag">&lt;/</span><span class="tag-name">d:tab</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:tabs</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabpanels</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;开始日期装饰器(内嵌式)&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:datepicker</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">'grid'</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test1&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:datepicker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;开始日期装饰器(弹出式)&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:datepicker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test2&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:datepicker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;开始代码高亮显示&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">d:code</span><span>&nbsp;</span><span class="attribute">language</span><span>=</span><span class="attribute-value">&quot;xml&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">textarea</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;!--&nbsp;开始日期装饰器(内嵌式)&nbsp;--&amp;gt;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;d:datepicker&nbsp;<span class="attribute">type</span><span>=</span><span class="attribute-value">'grid'</span><span>&amp;gt;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;input&nbsp;<span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test1&quot;</span><span>&nbsp;/&amp;gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;/d:datepicker&amp;gt;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;!--&nbsp;开始日期装饰器(弹出式)&nbsp;--&amp;gt;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;d:datepicker&amp;gt;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;input&nbsp;<span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test2&quot;</span><span>&nbsp;/&amp;gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;/d:datepicker&amp;gt;<span class="tag">&lt;/</span><span class="tag-name">textarea</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:code</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:tabpanel</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">d:tabpanels</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">d:tabbox</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">select</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;margin-left:120px&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">option</span><span class="tag">&gt;</span><span>弹出的datepicker&nbsp;可覆盖IE&nbsp;select</span><span class="tag">&lt;/</span><span class="tag-name">option</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">select</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">hr</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comments">&lt;!--&nbsp;开始Include装饰器,包含装饰器菜单&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">d:include</span><span>&nbsp;</span><span class="attribute">url</span><span>=</span><span class="attribute-value">'menu.xml'</span><span>&nbsp;</span><span class="attribute">xslt</span><span>=</span><span class="attribute-value">&quot;menu.xsl&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">d:include</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
<h2> 装饰结果：</h2>
<br />
<img alt="" src="http://www.javaeye.com/topics/download/c82ca92e-830e-45bd-9e80-9878790f1f2d" /><br />
<br />
<br />
<br />
<font color="#ff0000">云想衣裳花想容－－JSI组件模型介绍（二）已经发布，那里有装饰过程及其原理的介绍：</font><br />
<a href="http://www.javaeye.com/topic/71425">http://www.javaeye.com/topic/71425</a><br />
<h1><br />
</h1>
          <br/>
          <span style="color:red;">
            <a href="http://JSI.group.javaeye.com/group/blog/71422#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Apr 2007 07:54:38 +0800</pubDate>
        <link>http://JSI.group.javaeye.com/group/blog/71422</link>
        <guid>http://JSI.group.javaeye.com/group/blog/71422</guid>
      </item>
          <item>
        <title>海纳百川 有容乃大――采用JSI封装、集成第三方类库</title>
        <author>jindw</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jindw.javaeye.com">jindw</a>&nbsp;
                    链接：<a href="http://JSI.group.javaeye.com/group/blog/71282" style="color:red;">http://JSI.group.javaeye.com/group/blog/71282</a>&nbsp;
          发表时间: 2007年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Java的成功，离不开它那个庞大的类库，不单是sun的类库，很多细节的实现都取自第三方（如xml解析采用Apache的实现）。<br />
<br />
如前言所述，我们暂时不大算编写丰富的公共API，但是我们可以集成其他成熟的类库，同时隔离他们的依赖，隔离各个脚本的执行上下文，消除命名冲突的危险。<br />
<br />
这里我们详细介绍一个复杂一点的实例：类似Windows XP文件浏览器左侧的滑动折叠面板(任务菜单)效果。<br />
<br />
我们先集成Scriptaculous Effect类库，并且在这个基础上按我个人的习惯对一个面板折叠效果做一个简单的封装，展示框架的类库封装功能。<br />
<br />
1。集成Scriptaculous类库：<br />
<br />
这里我们不做过多介绍，详细情况请参考集成实战；我们发布的版本中已经把Scriptaculous放置于us.aculo.script包中，您可以把这些作为系统内置的类库使用。<br />
<br />
2。编写我们的折叠面板函数（org/xidea/example/display/effect.js）：<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;滑动面板实现.</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;当指定元素可见时，将其第一个子元素向上滑动至完全被遮掩（折叠）。</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;当指定元素不可见时，将其第一个子元素向下滑动至完全显示（展开）。</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;slidePanel(panel){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;panel&nbsp;=&nbsp;$(panel);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">if</span><span>(panel.style.display=='none'){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//调用Scriptaculous&nbsp;Effect的具体滑动展开实现</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;Effect.SlideDown(panel);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//调用Scriptaculous&nbsp;Effect的具体滑动闭合实现</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;Effect.SlideUp(panel);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
3。编写包定义脚本（org/xidea/example/display/__$package.js）：
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="comment">//添加slidePanel（滑动面板控制）函数</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">this</span><span>.addScript(</span><span class="string">&quot;effect.js&quot;</span><span>,</span><span class="string">&quot;slidePanel&quot;</span><span>,</span><span class="keyword">null</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//给effect.js脚本添加对us.aculo.script包中effects.js脚本的装载后依赖this.addScriptDependence(&quot;effect.js&quot;,</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="string">&quot;us/aculo/script/effects.js&quot;</span><span>,</span><span class="keyword">false</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//给effect.js脚本添加对net.conio.prototype包中$函数的装载后依赖this.addScriptObjectDependence(&quot;effect.js&quot;,</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="string">&quot;net.conio.prototype.$&quot;</span><span>,</span><span class="keyword">false</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
4。编写我们的HTML代码：<br />
<div class="code_title">html 代码
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>重用aculo&nbsp;Effect脚本实例</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">&quot;stylesheet&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/css&quot;</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;/styles/default.css&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;/scripts/boot.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>...&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$import(&quot;org.xidea.display.slidePanel&quot;);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">body</sp