<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>丫梨的笔记本</title>
    <description>不懈的努力，会给自己带来希望</description>
    <link>http://yahaitt.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>ExtJs视频教程集锦</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/236080" style="color:red;">http://yahaitt.javaeye.com/blog/236080</a>&nbsp;
          发表时间: 2008年09月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          《ExtJs视频教程》全套已全面出炉，欢迎大家关注！目录如下：<br />第1讲 ExtJs介绍及应用举例<br />第2讲 组件解析<br />第3讲 ExtJS事件处理<br />第4讲 ExtJS事件处理续一<br />第5讲 ExtJS事件处理续二<br />第6讲 ExtJs组件应用之动态树<br />第7讲 ExtJs组件应用之动态树续一<br />第8讲 ExtJs组件应用之动态树续二<br />第9讲 ExtJs组件应用之动态树续三<br />第10讲 ExtJs组件应用之动态树续四<br />第11讲 ExtJs组件应用之动态树续五<br />第12讲 ExtJs组件应用之动态树续六<br />第13讲 布局<br />第14讲 布局续<br />第15讲 布局续二<br />第16讲 表单<br />第17讲 表单续一<br />第18讲 表单续二<br />第19讲 表单续三<br />第20讲 表单续四<br />第21讲 表单续五<br />第22讲 表单续六<br />第23讲 Grid控件<br />第24讲 Grid控件续一<br />第25讲 Grid控件续二<br />第26讲 Grid控件续三<br />第27讲 Grid控件续四<br />第28讲 Grid控件续五<br />第29讲 Grid控件续六<br />第30讲 Grid控件续七<br />第31讲 ExtJs综合应用<br />第32讲 ExtJs综合应用续一<br />第33讲 ExtJs综合应用续二<br />第34讲 ExtJs综合应用续三<br />第35讲 ExtJs综合应用续四
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/236080#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Sep 2008 12:55:42 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/236080</link>
        <guid>http://yahaitt.javaeye.com/blog/236080</guid>
      </item>
      <item>
        <title>ExtJs中关于grid和store的应用分析（三）</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/234469" style="color:red;">http://yahaitt.javaeye.com/blog/234469</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><br />第三部分：解析器与数据的关系<br /></strong><br /><strong><br />一、XmlReader的构造方法定义如下：<br /></strong><br /><pre name="code" class="js">
XmlReader( Object meta, Object recordType )
</pre><br /><strong><br />二、JsonReader的构造方法定义如下：<br /></strong><br /><pre name="code" class="js">
JsonReader( Object meta, Object recordType ) 
</pre><br /><strong><br />三、ArrayReader的构造方法定义如下：<br /></strong><br /><pre name="code" class="js">
ArrayReader( Object meta, Object recordType ) 
</pre><br /><br />都表示实例化这些解析器时，需要传递2个参数，一个是meta,一个是recordType。<br />但是不同的解析器他们需要的meta的值为不同的。只需看各自的Config Options（即配置选项）。也就是说，meta是由配置选项组成的。而recordType是指通过Recorde.create方法得到的数据结构的定义。一般也可以为var fields = ["id","name","email","sex","age"];这样定义的fields。<br /><strong><br />一、XmlReader所接受的配置选项有：<br /></strong><br /><span style="color: red">id</span>:<br />其值是作为数据唯一标志的字符串,必须为fields中某列的name值。如：id:"id"，也可以是id:"name"，但是这个时候，字段name的值要确保是能唯一标志数据的。<br /><span style="color: red">record</span>:<br />其值为可以指定数据的字符串。如：record:"row"<br /><span style="color: red">success</span>:<br /><span style="color: red">totalRecords</span>:<br />其值为可以指定数据总数的字符串。如：totalRecords:"total"<br /><strong><br />二、JsonReader所接受的配置选项有：<br /></strong><br /><span style="color: red">id</span>:<br />同XmlReader<br /><span style="color: red">root</span>:<br />其值为可以指定数据的字符串。如：root:"result"<br /><span style="color: red">successProperty</span>:<br /><span style="color: red">totalProperty</span>:<br />其值为可以指定数据总数的字符串。如：totalProperty:"total"<br /><strong><br />三、ArrayReader所接受的配置选项有：<br /></strong><br /><span style="color: red">id</span>:<br />同XmlReader<br /><br />现在再来看一下解析器与数据的关系。<br />数据只要满足了解析器的要求，那么数据就能获取成功。什么叫满足解析器的要求呢？有两种方式均可满足解析器的要求。<br /><span style="color: red">第一种：给予的数据不包含metaData</span><br /><span style="color: red">第二种：给予的数据包含了metaData</span><br /><br /><span style="color: red">ArrayReader和XmlReader需要的数据是没有metaData的</span>，此时给予的数据需要包含以下内容：<br />1、ArrayReader:<br />比如ArrayReader如下定义：<br />var fields = ["id","name","email","sex","age"];<br />var reader = new Ext.data.ArrayReader({<br />  id:"id"<br />},fields);<br /><br />给予的数据应该如下：<br /><pre name="code" class="js">
[[
	"1","langsin1","langsin@langsin.com","0","20"
],[
	"2","langsin2","langsin@langsin.com","1","21"
],[
	"3","langsin3","langsin@langsin.com","0","22"
],[
	"4","langsin4","langsin@langsin.com","1","23"
],[
	"5","langsin5","langsin@langsin.com","0","24"
]]
</pre><br />也就是必须为二维数组。<br />此时二维数组中的每列的数据顺序与fields中的字段名的定义是从左向右一一匹配，即，这里有5条数据，第一条数据是:<br />id的值为"1"，<br />name的值为"langsin1"，<br />email的值为"langsin@langsin.com"，<br />sex的值为"0"，<br />age的值为"20"<br /><br />2、XmlReader<br />比如XmlReader如下定义：<br />var fields = ["id","name","email","sex","age"];<br />var reader = new Ext.data.XmlReader({<br />  id:"id",<br />  record:"row",<br />  totalRecords:"results"<br />},fields);<br /><br />给予的数据应该如下：<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;dataset>
	&lt;results>2&lt;/results>
	&lt;row>
		&lt;id>1&lt;/id>
		&lt;name>langsin1&lt;/name>
		&lt;email>langsin@langsin.com&lt;/email>
		&lt;sex>0&lt;/sex>
		&lt;age>20&lt;/age>
	&lt;/row>
	&lt;row>
		&lt;id>2&lt;/id>
		&lt;name>langsin2&lt;/name>
		&lt;email>langsin@langsin.com&lt;/email>
		&lt;sex>1&lt;/sex>
		&lt;age>21&lt;/age>
	&lt;/row>
	&lt;row>
		&lt;id>3&lt;/id>
		&lt;name>langsin3&lt;/name>
		&lt;email>langsin@langsin.com&lt;/email>
		&lt;sex>0&lt;/sex>
		&lt;age>22&lt;/age>
	&lt;/row>
	&lt;row>
		&lt;id>4&lt;/id>
		&lt;name>langsin4&lt;/name>
		&lt;email>langsin@langsin.com&lt;/email>
		&lt;sex>1&lt;/sex>
		&lt;age>23&lt;/age>
	&lt;/row>
	&lt;row>
		&lt;id>5&lt;/id>
		&lt;name>langsin5&lt;/name>
		&lt;email>langsin@langsin.com&lt;/email>
		&lt;sex>0&lt;/sex>
		&lt;age>24&lt;/age>
	&lt;/row>
&lt;/dataset>
</pre><br />这里dataset标签可以换车其他任何字母组成的标签，如aaa，不会影响最后数据的读取。<br />但是这个dataset标签对里就必须要有1个或多个的results和row标签对。<br /><br />现在再来看下JsonReader。<br /><span style="color: red">JsonReader可以用第一种也可以用第二种的数据给予方式。</span><br />1、给予的数据不包含metaData的情况时：<br />比如JsonReader如下定义：<br />var fields = ["id","name","email","sex","age"];<br />var reader = new Ext.data.JsonReader({<br />  id:"id",<br />  root:"result",<br />  totalProperty:"total"<br />},fields);<br /><br />给予的数据应该如下：<br /><pre name="code" class="js">
{
	total:5,
	result:[{
		id:"1",
		name:"langsin1",
		email:"langsin@langsin.com",
		sex:"0",
		age:"20"
	},{
		id:"2",
		name:"langsin2",
		email:"langsin@langsin.com",
		sex:"1",
		age:"21"
	},{
		id:"3",
		name:"langsin3",
		email:"langsin@langsin.com",
		sex:"0",
		age:"22"
	},{
		id:"4",
		name:"langsin4",
		email:"langsin@langsin.com",
		sex:"1",
		age:"23"
	},{
		id:"5",
		name:"langsin5",
		email:"langsin@langsin.com",
		sex:"0",
		age:"24"
	}]
}

</pre><br />如果定义时不包含root配置选项时，那么给予的数据应该如下：<br /><pre name="code" class="js">
[{
	id:"1",
	name:"langsin1",
	email:"langsin@langsin.com",
	sex:"0",
	age:"20"
},{
	id:"2",
	name:"langsin2",
	email:"langsin@langsin.com",
	sex:"1",
	age:"21"
},{
	id:"3",
	name:"langsin3",
	email:"langsin@langsin.com",
	sex:"0",
	age:"22"
},{
	id:"4",
	name:"langsin4",
	email:"langsin@langsin.com",
	sex:"1",
	age:"23"
},{
	id:"5",
	name:"langsin5",
	email:"langsin@langsin.com",
	sex:"0",
	age:"24"
}]
</pre><br /><br />2、给予的数据包含metaData的情况时：<br />比如JsonReader如下定义：<br />var reader = new Ext.data.JsonReader({<br />  id:"id",<br />},fields);<br /><br />给予的数据应该如下：<br /><pre name="code" class="js">
{
	metaData:{
		fields:["id","name","email","sex","age"],
		root:"result"
	},
	result : [{
		id : "1",
		name : "langsin1",
		email : "langsin@langsin.com",
		sex : "0",
		age : "20"
	}, {
		id : "2",
		name : "langsin2",
		email : "langsin@langsin.com",
		sex : "1",
		age : "21"
	}, {
		id : "3",
		name : "langsin3",
		email : "langsin@langsin.com",
		sex : "0",
		age : "22"
	}, {
		id : "4",
		name : "langsin4",
		email : "langsin@langsin.com",
		sex : "1",
		age : "23"
	}, {
		id : "5",
		name : "langsin5",
		email : "langsin@langsin.com",
		sex : "0",
		age : "24"
	}]
}

</pre><br /><br />这里将root和fields等都转移到了给予的数据的metaData中。
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/234469#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 16:01:16 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/234469</link>
        <guid>http://yahaitt.javaeye.com/blog/234469</guid>
      </item>
      <item>
        <title>ExtJs中关于grid和store的应用分析（二）</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/234409" style="color:red;">http://yahaitt.javaeye.com/blog/234409</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><br />第二部分:Store的核心阐释<br /></strong><br />Store即数据存储器，主要用于提供给GridPanel，EditorGridPanel等关联数据用的。<br />Store由Proxy（数据源）和DataReader（数据解析器）组成。<br />换句话说：<br />第一、数据存储器需要有数据才能叫数据存储器，而这个数据就是通过数据源获得；<br />第二、获得数据后还需要通过数据解析器将这些数据进行解析，从而成为客户端认可的符合一定格式的数据。<br />通过以上两个条件，这个数据存储器才能真正的为GridPanel等服务。<br /><br />现在来看一下Store是如何运作的：<br />看API，我们只需要关心他的4个配置选项：data、proxy、reader、url<br />以及他的1个方法:load<br /><br />1、如果配置了data，则proxy和url无效，且不需要调用load方法来生成Record集合<br /><br />2、如果没有配置data,则必须设置proxy或url,或两者都设置。此时，如果没有将autoLoad设置为true，那么需要手动进行load方法的调用。就是为了得到数组、Json或Xml格式的数据。<br /><br />3、reader是必须的，用以指定数据解析器，需要根据获得的数据格式指定相应类型的解析器。<br /><br />4、如果没有指定proxy，但指定了url，则会默认用HttpProxy作为数据源，并将url作为HttpProxy实例化时的参数。<br /><br />5、如果data封装的是数组格式的数据，则用ArrayReader作为解析器，也就是需要在Store实例化时，做如下的配置:<br /><pre name="code" class="js">
reader:new Ext.data.ArrayReader({...});
</pre><br /><br />6、如果data封装的是json格式的数据，则用JsonReader作为解析器，也就是需要在Stroe实例化时，做如下的配置：<br /><pre name="code" class="js">
reader:new Ext.data.JsonReader({...});
</pre><br /><br />7、如果data封装的是xml格式的数据，则用XmlReader作为解析器，也就是需要在Store实例化时，做如下的配置：<br /><pre name="code" class="js">
reader:new Ext.data.XmlReader({...});
</pre><br /><br />通过以上5、6这两个解析器的特点，Store衍生了2个子类，分别是SimpleStore和JsonStore。<br />SimpleStore的内部使用ArrayReader解析器，即他的reader的值为ArrayReader的实例对象。<br />JsonStore的内部使用JsonReader解析器，即他的reader的值为JsonReader的实例对象。<br /><br />对于第7条，可以如下应用：<br /><pre name="code" class="js">
var url = "testxml.xml";
var store = new Ext.data.Store({
  url:url,//指向xml文件
  proxy:proxy,//如果有了url，可以不用配置proxy
  reader:new Ext.data.XmlReader({...})//必须的选项
});
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/234409#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 13:45:48 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/234409</link>
        <guid>http://yahaitt.javaeye.com/blog/234409</guid>
      </item>
      <item>
        <title>ExtJs中关于grid和store的应用分析（一）</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/234379" style="color:red;">http://yahaitt.javaeye.com/blog/234379</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><br />第一部分：阐述grid与store的关系、gird中的ColumnModel与store中的fields的关系。<br /></strong><br />grid，即列表，他的核心功能就是用来展现数据列表，包括列表各列的头信息和实际数据。<br /><br />grid的各列头信息是由ColumnModel来定义的。<br />grid的实际数据列表是通过Store来展现的。<br /><br />grid的实例化如下：<br /><pre name="code" class="js">
var grid = new Ext.grid.GridPanel({
  cm:cm,
  store:store
  ...
});
</pre><br /><br />相关图片示例如下：<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/20837/24165a36-4704-3d78-a4aa-aa66ca678e03.jpg" /><br /><br />ColumnModel中有两个非常重要的配置选项：header和dataIndex,<br />header就是列头的文本信息，是个字符串。<br />dataIndex是store中对应的数据结构定义，即对应于fields中各项的name值。<br /><br />ColumnModel的构造函数接收的是数组类型的参数。用于一次性创建多个列信息。<br />如下：<br /><pre name="code" class="js">
var cm = new Ext.grid.ColumnModel([
  ...
]);
</pre><br /><br />下面我们再看一下Store，即数据存储器。<br />Store由数据结构定义和数据组成。<br />数据结构定义的最简单的模式如下：<br /><pre name="code" class="js">
var fields = ["id","name","email","sex","age"];
</pre><br />只标识了各名称。就像创建数据库表结构一样，可以只创建表中各字段的名称。<br /><br />因此最简单的数据存储器如下：<br /><pre name="code" class="js">
var data = [...];
var store = new Ext.data.Store({
  data:data,//此处为与数据结构定义相对应的数据
  fields:fields
  ...
});
</pre><br /><br />因为ColumnModel的dataIndex配置选项是对应于store中的数据结构定义fields，<br />因此可以如下实例化ColumnModel:<br /><pre name="code" class="js">
var cm = new Ext.grid.ColumnModel([{
    header:"id",
    dataIndex:"id"//对应于grid的store的fields中的id
  },{
    header:"姓名",
    dataIndex:"name"//对应于grid的store的fields中的name
  },{
    header:"email",
    dataIndex:"email"//对应于grid的store的fields中的email
  },{
    header:"性别",
    dataIndex:"sex"//对应于grid的store的fields中的sex
  },{
    header:"年龄",
    dataIndex:"age"//对应于grid的store的fields中的age
  }
]);
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/234379#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 12:35:59 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/234379</link>
        <guid>http://yahaitt.javaeye.com/blog/234379</guid>
      </item>
      <item>
        <title>应用ExtJs时解决乱码的方法</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/231686" style="color:red;">http://yahaitt.javaeye.com/blog/231686</a>&nbsp;
          发表时间: 2008年08月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一般情况下，项目采用了UTF-8的字符集格式，那么所有的js文件的格式也都为UTF-8格式后就不会有任何乱码的问题出现。但是如果项目采用了GBK等编码，那么js文件的编码格式就不能这么随便了，需要根据你的项目的编码情况而定。</p>
<p>就拿项目编码为GBK为例吧。</p>
<p>首先，jsp页面文件为GBK格式，那么他的头部也就有如下的设置：</p>
<p>&lt;%@ page contentType="text/html;charset=GBK"%&gt;</p>
<p>&nbsp;</p>
<p>head标签中有：</p>
<p>&lt;meta http-equiv="content-type" content="text/html; charset=GBK"&gt;</p>
<p>&nbsp;</p>
<p>然后这个页面引入了一个js，那么这个js文件的编码就必须为GBK格式。</p>
<p>如果这个js中有ext的ajax请求去获得另外一个js并执行这个js，那么这个被ext的ajax所请求的js文件的编码格式就必须为UTF-8格式的。</p>
<p>如下所示：</p>
<pre name="code" class="js">Ext.Ajax.request({
	url:"${ctx}/scripts/app/manager.js",
	scope: this,
	success:function(response){
		eval(response.responseText);
	}
});</pre>
<p>&nbsp;</p>
<p>那么这里的manager.js文件就必须为UTF-8格式的。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/231686#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Aug 2008 17:54:58 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/231686</link>
        <guid>http://yahaitt.javaeye.com/blog/231686</guid>
      </item>
      <item>
        <title>序号结合分页功能的实现</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/228267" style="color:red;">http://yahaitt.javaeye.com/blog/228267</a>&nbsp;
          发表时间: 2008年08月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>序号结合分页显示：<br />一、效果图：<br /><img src="../../../upload/picture/pic/19913/0dd434b1-689b-313c-a7a2-401b4684f463.jpg" height="260" alt="序号结合分页1" width="228" /></p>
<p>&nbsp;</p>
<p><img src="../../../upload/picture/pic/19911/54bb3575-115b-3614-9ba3-634effc59900.jpg" height="260" alt="序号结合分页2" width="228" /><br />二、相关js脚本：<br />1、全局变量：var record_start = 0;<br />2、grid的columns部分<br />&nbsp;columns : [new Ext.grid.RowNumberer({<br />&nbsp;&nbsp;header : "序号",<br />&nbsp;&nbsp;width : 40,<br />&nbsp;&nbsp;renderer:function(value,metadata,record,rowIndex){<br />&nbsp;&nbsp;&nbsp;return record_start + 1 + rowIndex;<br />&nbsp;&nbsp;}<br />&nbsp;}), {<br />&nbsp;&nbsp;header : "项目编号",<br />&nbsp;&nbsp;width : 50,<br />&nbsp;&nbsp;sortable : false,<br />&nbsp;&nbsp;dataIndex : "projectNumber"<br />&nbsp;}, {<br />&nbsp;&nbsp;header : "项目名称",<br />&nbsp;&nbsp;sortable : false,<br />&nbsp;&nbsp;dataIndex : "psName"<br />&nbsp;}, {<br />&nbsp;&nbsp;header : "基站名",<br />&nbsp;&nbsp;sortable : false,<br />&nbsp;&nbsp;dataIndex : "psSiteName"<br />&nbsp;}]<br />3、grid的分页部分：<br />&nbsp;bbar : new Ext.PagingToolbar({<br />&nbsp;&nbsp;store : grid_store,<br />&nbsp;&nbsp;pageSize : 8,<br />&nbsp;&nbsp;displayInfo : true,<br />&nbsp;&nbsp;beforePageText:"第",<br />&nbsp;&nbsp;afterPageText:"/ {0}页",<br />&nbsp;&nbsp;firstText:"首页",<br />&nbsp;&nbsp;prevText:"上一页",<br />&nbsp;&nbsp;nextText:"下一页",<br />&nbsp;&nbsp;lastText:"尾页",<br />&nbsp;&nbsp;refreshText:"刷新",<br />&nbsp;&nbsp;displayMsg : "当前显示记录从 {0} - {1} 总 {2} 条记录",<br />&nbsp;&nbsp;emptyMsg : "没有相关记录!",<br />&nbsp;&nbsp;doLoad : function(start){<br />&nbsp;&nbsp;&nbsp;record_start = start;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;var o = {}, pn = this.paramNames;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;o[pn.start] = start;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;o[pn.limit] = this.pageSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;this.store.load({params:o});<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;})<br />三、解析js:<br />1、全局变量record_start用于记录列表开始的数据点，如第一页，那么为0，如第二页，那么为8，这里分页pagesize设置为了8<br />2、分页中doLoad这部分的代码来自于Ext.PagingToolbar的doLoad方法，PagingToolbar在分页发生变化时会调用这个方法来重新load数据，只是多了个对全局变量进行赋值的步骤，为的就是在分页发生变化时，记录传递给Url的参数start的值。<br />3、在columns中实例化Ext.grid.RowNumberer时，重写了renderer方法，其实之所以这样做的原因，大家看一下Ext.grid.RowNumberer源码中的renderer方法就知道了，就是根据行号+1来设置序号的，这里我们改这个方法，是为了得到 行号+分页变化时得到的start参数的值+1 的值，这样就能够正确得到序号结合分页的数据了。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/228267#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Aug 2008 11:18:19 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/228267</link>
        <guid>http://yahaitt.javaeye.com/blog/228267</guid>
      </item>
      <item>
        <title>ExtJs想入门的请进-解读API</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/217517" style="color:red;">http://yahaitt.javaeye.com/blog/217517</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果你对EXT有兴趣但不知道如何下手，如果你有了API但不知道如何看如何用，如果你够认真的话，那么就看下面的内容，我保证你看了就会用API了，但是你必须看完，另，如果你没有API的话，我提供一个2.0的API给你，在附件里下载。 <br />================================开始=================================== <br />有人这样提问： <br />我怎么判断当前节点是否选中呀 <br />function onItemClick(checked){ <br />var myItems =[]; <br />var checkedNodes =tree.getChecked(); <br /><br />for(var i=0;i&lt;checkedNodes.length;i++){ <br />alert(checkedNodes[i].checked()); <br />myItems.push(checkedNodes[i].id); <br />} <br />alert(myItems.join(',')); <br />}; <br />alert(checkedNodes[i].checked()); 这个不对呀 <br /><br />那么我就知道他不会用API，在瞎蒙。 <br />很多人，特别是初学者，都这样在看了别人代码后，只是按自己想的去加点或修改点什么，结果呢，调试的时间付出了沉痛的代价，结果还是不知其所以然，面对这种现象，我很感慨，大家急切的心理我很理解，只是万事开头难，但是再难你也要把开头给做好。 <br />API是学习EXT的最好手册，所以我这里就贴出原谈话（去掉了些许），大家看完了就知道之所以然了。 <br /><br />逆天 09:19:02 <br />鸭梨姐姐呀 我怎么判断当前节点是否选中呀 <br />function onItemClick(checked){ <br />var myItems =[]; <br />var checkedNodes =tree.getChecked(); <br /><br />for(var i=0;i&lt;checkedNodes.length;i++){ <br />alert(checkedNodes[i].checked()); <br />myItems.push(checkedNodes[i].id); <br />} <br />alert(myItems.join(',')); <br />}; <br />逆天 09:19:10 <br />alert(checkedNodes[i].checked()); 这个不对呀 <br />丫梨^_^ 09:22:58 <br />偶滴神那 <br /><br />丫梨^_^ 09:23:06 <br />你会不会看api呀 <br /><br />逆天 09:23:21 <br />嘿嘿 偶这里没有API呀 姐姐 <br />丫梨^_^ 09:23:23 <br />checked是node的属性，而不是方法 <br /><br />丫梨^_^ 09:23:45 <br />哎，extjs的api下载个被 <br /><br />丫梨^_^ 09:24:03 <br />最好的方法是运行你当前在用的版本的ext工程 <br /><br />逆天 09:24:27 <br />恩 我试验过了呀 我选中节点后我弹出 alert(checkedNodes[i].checked); 报为null呀 姐姐 <br />丫梨^_^ 09:24:32 <br />要不然下载的api根你实际在用的版本不同 <br /><br />逆天 09:24:39 <br />恩 <br />丫梨^_^ 09:25:45 <br />没有API你现在这样写代码是在瞎蒙 <br /><br />逆天 09:25:53 <br />恩 <br />丫梨^_^ 09:26:09 <br />对了。关于树方面的你下载了我的源码了没 <br /><br />丫梨^_^ 09:26:17 <br />你运行那个错了？ <br /><br />逆天 09:26:29 <br /><br />逆天 09:26:51 <br />我是用扩展的树呀 <br />丫梨^_^ 09:27:09 <br />哎，这叫啥扩展啊 <br /><br />逆天 09:27:18 <br />不知道呀 <br />逆天 09:27:28 <br />偶新手咩 鸭梨姐姐 <br />逆天 09:27:41 <br />文件“ExtJs_2API.CHM”(2.1MB)发送失败！由于对方QQ的“接收文件安全级”限制，您的文件传送请求被拒绝。 <br />丫梨^_^ 09:27:46 <br />偶也是新手啊 <br /><br />丫梨^_^ 09:28:02 <br />给你个API好好揣摩去 <br /><br />逆天 09:28:06 <br />在发下鸭梨姐姐 <br />逆天 09:28:07 <br />恩 <br />丫梨^_^ 09:28:11 <br />瞎蒙 <br /><br />丫梨^_^ 09:28:12 <br />哈哈 <br /><br />逆天 09:29:26 <br />鸭梨姐姐有中文的API米 <br />丫梨^_^ 09:29:35 <br />没的 <br /><br />逆天 09:29:37 <br />文件“ExtJs_2API.rar”(2.1MB)已经发送完毕。 <br />丫梨^_^ 09:29:42 <br />中文不中文的不都一样吗 <br /><br />丫梨^_^ 09:30:03 <br />你看看那些属性的名字和方法的名字不就能大概知道了 <br /><br />丫梨^_^ 09:31:08 <br />api会看么 <br /><br />丫梨^_^ 09:31:30 <br />你必须要会看 <br /><br />逆天 09:31:40 <br />不会看 鸭梨姐姐 <br />逆天 09:31:54 <br /><br />丫梨^_^ 09:32:09 <br />Config Options <br />Public Properties <br />Public Methods <br />Public Events <br />基本上都由以上4部分组成 <br /><br />丫梨^_^ 09:33:05 <br />Config Options下的内容为你在实例化一个对象时进行配置的，也就是比如new Panel({a:"xxx",b:"yyy"})，这里的a和b就是来自于Config Options <br /><br /><br />丫梨^_^ 09:33:22 <br />Config Options <br />Public Properties <br />Public Methods <br />Public Events <br />基本上每个类都由以上4部分组成 <br /><br /><br />丫梨^_^ 09:34:01 <br />你API打开了没 <br /><br />丫梨^_^ 09:34:08 <br />我给你简单的说一下 <br /><br />逆天 09:34:10 <br />开了 <br /><br />丫梨^_^ 09:34:40 <br />咱就拿tree下的TreeNode来说一下<br /><br /><br />丫梨^_^ 09:35:17 <br />看Config Options下的checked <br /><br />丫梨^_^ 09:35:31 <br />checked : Boolean <br />True to render a checked checkbox for this node, false to render an unchecked checkbox (defaults to undefined with no... <br />True to render a checked checkbox for this node, false to render an unchecked checkbox (defaults to undefined with no checkbox rendered) <br /><br />丫梨^_^ 09:36:02 <br />TreeNode是树节点的意思，是吧，那么肯定也就是一个节点 <br /><br />逆天 09:36:27 <br />对 <br />丫梨^_^ 09:36:30 <br />而checked很明显我们就能猜出来是 是否选中 的意思 <br /><br />逆天 09:36:38 <br />对 <br />逆天 09:36:51 <br />可是鸭梨姐姐我写上去了不行呀 <br />丫梨^_^ 09:36:52 <br />checked : Boolean 那么你就要考虑是否是真的你想的那样 <br /><br />丫梨^_^ 09:36:58 <br />你先别看你的代码 <br /><br />丫梨^_^ 09:37:46 <br />这个checked是在Confgi Options下的，是实例化的时候用的，注意这点，其他时候能否用你是不知道的 <br /><br />丫梨^_^ 09:38:31 <br />而且这个配置选项的值必须只接受boolean类型的，也就是true或false <br /><br />丫梨^_^ 09:38:57 <br />比如 var root = new Ext.tree.TreeNode({checked:true}); <br /><br />丫梨^_^ 09:39:16 <br />那其他的配置选项你你应该也知道怎么用了是吧 <br /><br />逆天 09:39:21 <br />恩 <br />丫梨^_^ 09:39:39 <br />比如href : String 表示的配置选项href接受的类型是string的 <br /><br />丫梨^_^ 09:39:51 <br />我再强调下 <br /><br />丫梨^_^ 09:40:37 <br />这个所谓的配置选项，也就是Config Options下的内容，只有你在实例化的时候用的，也就是你在new 类名({...})时用的 <br /><br /><br />丫梨^_^ 09:40:59 <br />然后你再看 Public Properties 部分 <br /><br />逆天 09:41:14 <br />Public Properties应该是方法吧 <br />丫梨^_^ 09:41:26 <br />属性，老大，not 方法 <br /><br />丫梨^_^ 09:41:58 <br />你看这个childNodes ，public properties下的，看到了没 <br /><br />逆天 09:42:10 <br />恩 <br />丫梨^_^ 09:42:17 <br />childNodes : Array 这样写的是吧？ <br /><br />逆天 09:42:30 <br />对 <br />丫梨^_^ 09:43:05 <br />表示的是你从一个实例化对象里取得的属性，比如你刚才 var tn = new Ext.tree.treeNode({....});这样已经实例化了一个对象了是不？ <br /><br />丫梨^_^ 09:43:15 <br />那么现在你可以取实例化对象的数据了。 <br /><br />丫梨^_^ 09:43:41 <br />怎么取呢，可以取里面的什么东西呢，那么这里public properties里的列出的就是你能取的 <br /><br />丫梨^_^ 09:44:03 <br />那么你要tn.childNodes就能获得一个Array类型的数据 <br /><br />丫梨^_^ 09:45:03 <br />所以public properties下列出的就是一个实例化对象能取的信息，冒号后面的是你索取得的信息的返回类型<br /><br /><br />丫梨^_^ 09:45:21 <br />Public Methods 再来看这个部分 <br /><br />丫梨^_^ 09:45:47 <br />一般第一个都会是你实例化一个对象的构造方法 <br /><br />丫梨^_^ 09:46:03 <br />TreeNode( Object/String attributes ) <br /> <br />丫梨^_^ 09:46:34 <br />表示的是这个构造方法可以接受两种类型的参数，一个是object类型的，一个是string类型的 <br /><br />丫梨^_^ 09:46:42 <br />两者均可 <br /><br />丫梨^_^ 09:47:03 <br />所谓的object类型的一般是这种模式{...} <br /><br /><br />丫梨^_^ 09:47:21 <br />而所谓的string类型就是"..."<br /><br /><br />丫梨^_^ 09:47:43 <br />我们再看appendChild( Node/Array node ) : Node 这个 <br /><br />丫梨^_^ 09:47:52 <br />那你说说这个方法是什么意思 <br /><br />逆天 09:48:13 <br />添加一个子节点吧 <br />丫梨^_^ 09:48:23 <br />什么样的子节点？ <br /><br />逆天 09:48:27 <br />Node类型 <br />丫梨^_^ 09:48:31 <br />是么 <br /><br />丫梨^_^ 09:48:34 <br />就这个？ <br /><br />逆天 09:48:51 <br /><br />丫梨^_^ 09:49:13 <br />表示的是能接受的参数是Node类型或者Array类型的数据 <br /><br />丫梨^_^ 09:49:17 <br />看来你还是没理解 <br /><br />逆天 09:49:37 <br />啊奥 偶在看看 <br />丫梨^_^ 09:49:35 <br />注意看括号里面的 <br /><br />丫梨^_^ 09:49:55 <br />括号里面的才是调用这个方法时需要传递进去的参数类型 <br /><br />逆天 09:50:06 <br />2选1 <br />丫梨^_^ 09:50:17 <br />而冒号后面的那个Node的意思是你调用这个方法后返回的一个数据类型 <br /><br />丫梨^_^ 09:51:32 <br />比如var n = tn.appendChild(new Ext.tree.TreeNode({....}));那么是能够得到这个n的值的，并且这个n的值肯定就是Node类型的 <br /><br /><br />丫梨^_^ 09:52:14 <br />接下来看Public Events部分 <br /><br />丫梨^_^ 09:53:00 <br />这部分的内容表示的是你在使用TreeNode类的时候可能出现的事件 <br /> <br />丫梨^_^ 09:53:24 <br />比如你对一个树节点进行添加子节点的操作，那么append事件就会发生 <br /> <br />逆天 09:53:49 <br />参数怎么传 <br />逆天 09:54:03 <br />tr.on("append",) <br />丫梨^_^ 09:54:03 <br />也就是在你var n = tn.appendChild(new Ext.tree.TreeNode({....}));运行这个代码的时候会发生append事件<br /><br />逆天 09:54:18 <br />恩 <br />丫梨^_^ 09:54:21 <br />你先听我说完 <br /><br />逆天 09:54:27 <br />恩好 <br />丫梨^_^ 09:54:31 <br />这个on不on的没有什么的 <br /><br />丫梨^_^ 09:54:42 <br />append : ( Tree tree, Node this, Node node, Number index ) <br /><br />丫梨^_^ 09:55:10 <br />冒号后面的表示的是发生这个事件时会传递过来的数据 <br /><br />丫梨^_^ 09:55:17 <br />你要记住和理解这点 <br /><br />丫梨^_^ 09:56:01 <br />那么事件是这样发生的，但是你如何捕获事件呢 <br /><br />丫梨^_^ 09:56:07 <br />就是通过两种方式 <br /><br /><br />丫梨^_^ 09:56:21 <br />一种是on，一种是listeners <br /><br /><br />丫梨^_^ 09:57:05 <br />你可以在实例化一个类的时候为listeners配置选项赋值 <br /><br />丫梨^_^ 09:57:48 <br />比如var tn = new Ext.tree.TreeNode({listeners:{"append":function(a,b,c,d){....}}}) <br /><br /><br />丫梨^_^ 09:58:39 <br />还有一种是你对这个实例进行on或addListener方法的调用 <br /><br /><br />丫梨^_^ 09:58:52 <br />Public Methods下面的on或addListener <br /><br />丫梨^_^ 09:58:59 <br />这个不是无缘无故出来的 <br /><br />逆天 09:59:47 <br />on( String eventName, Function handler, [Object scope], [Object options] ) : void <br />丫梨^_^ 10:00:09 <br />对，所以你要知道这个事件捕获接受哪些参数 <br /><br />丫梨^_^ 10:00:35 <br />这里的[Object scope], [Object options]相对复杂些 <br /><br />丫梨^_^ 10:00:40 <br />另外我先告诉你一下 <br /><br />丫梨^_^ 10:00:51 <br />js跟java是不一样的 <br /><br />丫梨^_^ 10:01:12 <br />java的方法你传递的参数个数必须根定义的一样，但是js的并不需要 <br /> <br />丫梨^_^ 10:01:44 <br />所以你在进行on方法的调用是可以传递不等同个数的参数 <br /><br />丫梨^_^ 10:02:13 <br />那么这里on( String eventName, Function handler, [Object scope], [Object options] ) : void <br /><br />丫梨^_^ 10:02:21 <br />你可以只传递2个参数 <br /><br />丫梨^_^ 10:02:51 <br />一般情况下，这个api告诉你的是，[]这样括起来的表示你可以不传递的参数 <br /><br />丫梨^_^ 10:03:04 <br />其他的最好传递进来 <br /><br />丫梨^_^ 10:03:42 <br />所以你可以这样调用了. tn.on("append",function(){...})<br /><br />丫梨^_^ 10:04:35 <br />或者 <br />tn.on("append",hello); <br />function hello(a,b,c,d){...} <br /><br />逆天 10:05:47 <br />[Object scope], [Object options]这个要传什么 <br />丫梨^_^ 10:05:55 <br />这个是作用域 <br /><br />逆天 10:06:06 <br />没有用到过呀 <br />丫梨^_^ 10:06:07 <br />一般就是传递this什么的 <br /><br />丫梨^_^ 10:06:23 <br />有时候会用到，特别是当你遇到一些问题时 <br /><br />逆天 10:06:30 <br />比如 <br />丫梨^_^ 10:06:34 <br />这个比如我就不说了 <br /><br />丫梨^_^ 10:06:46 <br />你可以网上找一下作用域的问题 <br /><br />丫梨^_^ 10:07:48 <br />这个on或addListener方法的调用跟public events下的事件是挂钩的 <br /><br />丫梨^_^ 10:08:30 <br />事件append : ( Tree tree, Node this, Node node, Number index ) 冒号后面表示的是事件发生时自动得到的信息 <br /><br />丫梨^_^ 10:09:21 <br />所以，当你在调用on方法时，on方法里handler参数就很关键了 <br /><br />丫梨^_^ 10:10:08 <br />Function handler 这里定义的方法将被调用，别且会将 <br />事件append : ( Tree tree, Node this, Node node, Number index ) 冒号后面表示的是事件发生时自动得到的信息 <br />的参数传递给它 <br /><br />丫梨^_^ 10:10:45 <br />所以你在定义这个handler的时候就可以定义成接受( Tree tree, Node this, Node node, Number index ) 这4个类型的参数 <br /><br />丫梨^_^ 10:11:05 <br />他们的关系你弄明白了没？ <br /><br />逆天 10:14:02 <br />问下tree.on("click",function(node,event) <br />逆天 10:14:12 <br />我怎么知道function(node,event)有2个参数 <br />丫梨^_^ 10:14:24 <br />哎，你就没明白我说的意思了。 <br /><br />逆天 10:14:25 <br />click : ( Node this, Ext.EventObject e ) <br />丫梨^_^ 10:14:27 <br />恩 <br /><br />丫梨^_^ 10:14:28 <br />对 <br /><br />丫梨^_^ 10:14:33 <br />看来慢慢理解了 <br /><br />逆天 10:14:46 <br />多亏了姐姐帮忙 <br />丫梨^_^ 10:15:20 <br />tree.on("click",function(node,event) 这里的function(node,event)可以单独拿出来 <br /><br />丫梨^_^ 10:15:37 <br />就是我之上举例的hello <br /><br />丫梨^_^ 10:15:41 <br />这样代码就规范些了 <br /><br />逆天 10:15:46 <br />checkchange : ( Node this, Boolean checked ) 那这个没有event <br />逆天 10:16:12 <br />tree.on("checkchange ",function(node,checked) <br />丫梨^_^ 10:16:25 <br />event 就是事件，事件并不是作用在方法上，而是作用在对象上 <br /><br />丫梨^_^ 10:16:50 <br />只是你在调用某些方法的时候触发了事件的发生 <br /><br />丫梨^_^ 10:17:39 <br />比如你想右键一个树节点后去调用某个方法 <br /><br />逆天 10:17:53 <br />dblclick : ( Node this, Ext.EventObject e ) ？ <br /><br />丫梨^_^ 10:18:25 <br />那么，你就可以tn.on("contextmenu",function(node,e){...}) <br /><br />逆天 10:18:46 <br />这回比刚才明白好多了姐姐 <br />逆天 10:18:48 <br />嘿嘿 <br />丫梨^_^ 10:18:52 <br />Public Events下面的东西只是定义了一些事件 <br /><br />丫梨^_^ 10:19:13 <br />而真正使用事件是你进行捕获 <br /><br />丫梨^_^ 10:19:23 <br />就是用on <br /><br />丫梨^_^ 10:19:47 <br />另外我告诉你,on是addListener的简写，两个方法是一样的 <br /><br />逆天 10:20:11 <br />恩 <br /><br />丫梨^_^ 10:20:15 <br />你觉得现在这个api你能看明白了么？ <br /><br />逆天 10:20:54 <br />差不多就是英文的晕点 我英文不好 <br />丫梨^_^ 10:21:00 <br />根英文没有关系 <br /><br />丫梨^_^ 10:21:07 <br />看API就是看结构 <br /><br /> <br />丫梨^_^ 10:21:31 <br />我再告诉你一点知识 <br /><br />丫梨^_^ 10:22:23 <br />你看API各个配置选项或属性或方法或事件的右边 <br /><br />逆天 10:22:43 <br />恩看见了 有的是Node <br />丫梨^_^ 10:22:42 <br />是不是有个叫Defined By <br /><br />丫梨^_^ 10:23:18 <br />列头 - Defined By <br /><br />丫梨^_^ 10:23:22 <br />看到了没？ <br /><br />逆天 10:23:29 <br />恩 <br /><br />逆天 10:23:32 <br />看到了 <br /><br /><br />丫梨^_^ 10:23:41 <br />每个部分的列头都有是不？ <br /><br />逆天 10:23:48 <br />是 <br />丫梨^_^ 10:24:11 <br />他表示的是这些信息是由哪个类定义的 <br /><br />丫梨^_^ 10:24:28 <br />因为你要知道ext中一个很重要的信息就是继承 <br /> <br />丫梨^_^ 10:24:49 <br />所以有些方法或配置选项或属性都是来自于他的父类或超类 <br /><br />丫梨^_^ 10:25:13 <br />那么这个Defined By 就告诉了你是来自具体的哪个父类或超类 <br /><br />丫梨^_^ 10:25:23 <br />这样在你看源码的时候就非常清晰 <br /><br />丫梨^_^ 10:26:23 <br />然后Defined By 如果字体是黑色的表示这个配置选项或属性或方法或事件是他本身这个类定义的 <br /><br />丫梨^_^ 10:27:12 <br />所以你一般去看一个类的特性的时候，你只需要去关注这个黑色文本的那些配置选项或属性或方法或事件 <br /><br /><br />丫梨^_^ 10:27:54 <br />然后我们再看看最上面的部分 <br /><br />丫梨^_^ 10:28:00 <br />Class Ext.tree.TreeNodePackage: Ext.tree <br />Defined In: TreeNode.js <br />Class: TreeNode <br />Subclasses: AsyncTreeNode <br />Extends: Node <br /><br /><br />丫梨^_^ 10:28:49 <br />这里有Subclasses和Extends <br /><br />逆天 10:28:57 <br />恩 <br />丫梨^_^ 10:29:02 <br />知道是啥意思么 <br /><br />逆天 10:29:10 <br />继承 <br />丫梨^_^ 10:29:20 <br />前面那个呢 <br /><br />逆天 10:29:22 <br />不知道 <br /><br />丫梨^_^ 10:30:05 <br />Subclasses表示这个类有哪些子类，Extends表示这个类继承自哪个类 <br /> <br />丫梨^_^ 10:31:03 <br />我之所以要跟你说这点，是因为要告诉你 事件应用的限制 <br /><br />丫梨^_^ 10:32:05 <br />只有那些继承了Observable类的类，也就是这个类是Observable的子类或子孙类，那么这个类才拥有事件处理机制，也就是才会有Public Events部分 <br /> <br />丫梨^_^ 10:33:03 <br />所以，你如果你自己扩展一个类，想拥有事件处理和响应机制，那么你这个类就必须是这个Observable类的子类或子孙类 <br /><br />丫梨^_^ 10:33:46 <br />你可以一直点Extends后面的进去，最后肯定会出来我说的这个Observable类
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/217517#comments" style="color:red;">已有 <strong>6</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 10:49:30 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/217517</link>
        <guid>http://yahaitt.javaeye.com/blog/217517</guid>
      </item>
      <item>
        <title>关于动态树的完整示例代码下载</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/214600" style="color:red;">http://yahaitt.javaeye.com/blog/214600</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          应网友反馈，现提供动态树的完整示例代码工程，以方便大家学习和交流。请看附件处 <strong>下载</strong>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/214600#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 15:57:00 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/214600</link>
        <guid>http://yahaitt.javaeye.com/blog/214600</guid>
      </item>
      <item>
        <title>ExtJs中关于mask()的应用说明</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/209624" style="color:red;">http://yahaitt.javaeye.com/blog/209624</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Ext.Msg.alert( String title, String msg, [Function fn], [Object scope] )方法应用起来后能看到蒙版的效果。也就是除了alert框内的东东能点击外，其他部分均不可操作。<br /><br />图1-alert效果图<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16943/d0b9848d-03db-390f-86b6-d6536a67c761.bmp" /><br /><br />其实蒙版效果也可完全作用于任何一个组件。通过调用Element的mask()方法即可。<br />那么他们间是如何联系的呢？<br />先来看看Ext的组件的超类Ext.Component,这个类中有getEl()方法，返回的是Element元素对象实例。<br />因此，如果是想蒙版一个组件实例，即可这样应用。如：<br />var fp = new Ext.form.FormPanel({......});<br />fp.getEl().mask();<br />或者<br />var fp = new Ext.form.FormPanel({id:"fpanel",......});<br />Ext.getCmp("fpanel").getEl().mask();<br /><br />图2-对组件实例进行蒙版的效果图<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16945/3b506e06-8a04-30f5-8a0c-99a20c75b276.bmp" /><br /><br />另外，如果想为整个的body蒙版的话，可以如下：<br />Ext.get(document.body).mask();<br />或者<br />Ext.getBody().mask();<br /><br />图3-对Body进行蒙版的效果图<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16947/f0fd091f-1683-311c-94b2-786f6176f894.bmp" />
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/209624#comments" style="color:red;">已有 <strong>6</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 10:25:41 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/209624</link>
        <guid>http://yahaitt.javaeye.com/blog/209624</guid>
      </item>
      <item>
        <title>EXTJS动态树的实现</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/207696" style="color:red;">http://yahaitt.javaeye.com/blog/207696</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          EXTJS动态树的实现举例<br />一、描述：通过dwr实现JS与后台的交互，从而实现动态树中叶子节点和目录节点的增加和编辑、以及节点的拖曳，节点的增删和拖曳都会改变自身以及它所在的目录节点下的相关节点的序号，能使得后台与前台同步。这个序号借助了tree中node的index。<br />1、相关基础：<br />servlet、mysql、dwr、json<br />2、涉及的ExtJs中部分知识点：<br />menu、tree、window以及事件机制<br />3、实现的效果图：<br />a)ExtJs动态树-右键叶子节点菜单<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16565/d20b074a-d512-3947-a561-75d4263099b2.bmp" /><br />b)ExtJs动态树-选择右键叶子节点菜单的“编辑”选项<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16567/f0700e52-7f46-31ea-8c09-7c6248b1f0a4.bmp" /><br />c)ExtJs动态树-右键目录节点菜单<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16569/4b242cab-30f3-33ef-a455-5c7a8b150ad0.bmp" /><br />d)ExtJs动态树-选择右键目录节点菜单的“编辑”选项<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16571/18847e8b-7ecc-3de1-8a00-db117df97e04.bmp" /><br />e)ExtJs动态树-拖曳节点<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16573/d3133279-61f4-3272-aa0f-830c0e6dd3fd.bmp" /><br />4、导航数据表结构：<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16563/72e7606d-2641-3a23-8094-9c9dcff9763c.bmp" /><br />5、源码结构图：<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16587/bfd9f040-cddb-371b-a8fe-643a67b0c5b5.bmp" /><br />6、页面结构图：<br /><img src="http://yahaitt.javaeye.com/upload/picture/pic/16589/27f6107b-39a7-32d5-bbe0-bca2805e18e4.bmp" /><br /><br />二、实现流程<br />JAVA源码部分：<br />1、数据库连接<br /><pre name="code" class="java">
package com.demo.core.dao;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConn {

	private static  String url = "jdbc:mysql://localhost:3306/langsin";
	private static  String username = "root";
	private static  String password = "";
	private static  String driver = "com.mysql.jdbc.Driver";
	
	public static Connection getConnection(){
		Connection conn = null;
		try{
			Class.forName(driver);
			conn = DriverManager.getConnection(url,username,password);
		}catch(Exception e){
			e.printStackTrace();
		}
		return conn;
	}
}
</pre><br />2、dao层：<br /><pre name="code" class="java">
package com.demo.navigate.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.demo.core.dao.DBConn;
import com.demo.navigate.model.Navigate;

public class NavigateDao {
	private static NavigateDao dao;
	private NavigateDao(){		
	}	
	public static NavigateDao getInstanece(){
		if(null == dao){
			dao = new NavigateDao();
		}
		return dao;
	}
	/**
	 * 获得指定ID的数据
	 * @param id
	 * @return
	 */
	public Navigate get(Serializable id){
		Connection conection = null;
		Statement stmt = null;
		ResultSet rs = null;
		Navigate obj = null;
		try{
			conection = DBConn.getConnection(); 
			stmt = conection.createStatement();
			StringBuffer sql = new StringBuffer("select * from navigate where id = ");
			sql.append(id);
			rs = stmt.executeQuery(sql.toString());
			if(rs.next())
			{
				obj = new Navigate();
				obj.setId(rs.getInt("id"));
				obj.setLeaf(rs.getInt("leaf"));
				obj.setNumber(rs.getInt("number"));
				obj.setParentId(rs.getInt("parentId"));
				obj.setTitle(rs.getString("title"));
				obj.setUrl(rs.getString("url"));
			}
		}catch(Exception e){
			e.printStackTrace();			
		}finally{
			try{
				if(rs != null) {
	        		try {
						rs.close();
					} catch (SQLException e) {
					}
	        		rs = null;
	        	}	        	
	        	if (stmt != null) {
		        	try {
		        		stmt.close();
		        	} catch (SQLException sqlex) {
		        	}
		        	stmt = null;
	        	}
	        	if (conection != null) {
		        	try {
		        		conection.close();
		        	} catch (SQLException sqlex) {
		        	}
		        	conection = null;
	        	}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return obj;
	}
	
	/**
	 * 获得指定节点的所有儿子节点
	 * @param id
	 */
	@SuppressWarnings("unchecked")
	public List&lt;Navigate> getChildrenById(Integer id){
		List&lt;Navigate> list = new ArrayList&lt;Navigate>();
		Connection conection = null;
		Statement stmt = null;
		ResultSet rs = null;
		try{
			conection = DBConn.getConnection(); 
			stmt = conection.createStatement();
			StringBuffer sql = new StringBuffer("select * from navigate where parentId = ");
			sql.append(id);
			sql.append(" order by number,id");
			rs = stmt.executeQuery(sql.toString());
			while(rs.next())
			{
				Navigate obj = new Navigate();
				obj.setId(rs.getInt("id"));
				obj.setLeaf(rs.getInt("leaf"));
				obj.setNumber(rs.getInt("number"));
				obj.setParentId(rs.getInt("parentId"));
				obj.setTitle(rs.getString("title"));
				obj.setUrl(rs.getString("url"));
				list.add(obj);
			}
		}catch(Exception e){
			e.printStackTrace();			
		}finally{
			try{
				if(rs != null) {
	        		try {
						rs.close();
					} catch (SQLException e) {
					}
	        		rs = null;
	        	}	        	
	        	if (stmt != null) {
		        	try {
		        		stmt.close();
		        	} catch (SQLException sqlex) {
		        	}
		        	stmt = null;
	        	}
	        	if (conection != null) {
		        	try {
		        		conection.close();
		        	} catch (SQLException sqlex) {
		        	}
		        	conection = null;
	        	}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return list;
	}
	
	/**
	 * 保存数据
	 * @param obj 
	 */
	public void save(Navigate obj){
		StringBuffer sql = new StringBuffer("insert into navigate(parentId,title,leaf,number,url) values(");
		sql.append(obj.getParentId());
		sql.append(",'");
		sql.append(obj.getTitle());
		sql.append("',");
		sql.append(obj.getLeaf());
		sql.append(",");
		sql.append(obj.getNumber());
		sql.append(",'");
		sql.append(obj.getUrl());
		sql.append("')");
		this.bulkUpdate(sql.toString());
	}
	
	/**
	 * 更新数据
	 * @param obj 
	 */
	public void update(Navigate obj){
		StringBuffer sql = new StringBuffer("update navigate set");
		sql.append(" parentId = ");
		sql.append(obj.getParentId());
		sql.append(",");
		sql.append(" title = '");
		sql.append(obj.getTitle());
		sql.append("',");
		sql.append(" leaf = ");
		sql.append(obj.getLeaf());
		sql.append(",");
		sql.append(" number = ");
		sql.append(obj.getNumber());
		sql.append(", url = '");
		sql.append(obj.getUrl());
		sql.append("' where id = ");
		sql.append(obj.getId());
		this.bulkUpdate(sql.toString());
	}
	
	/**
	 * 异步更新标题
	 * @param id
	 * @param title
	 * @return true-修改成功 false-修改失败
	 */
	public Boolean ajaxUpdateTitle(Integer id,String title){
		Boolean flag = false;
		Navigate obj = this.get(id);
		if(null != obj){
			StringBuffer sql = new StringBuffer("update navigate set");
			sql.append(" title = '");
			sql.append(title);
			sql.append("'");
			sql.append(" where id = ");
			sql.append(id);
			this.bulkUpdate(sql.toString());
			flag = true;
		}
		return flag;
	}
	
	/**
	 * 删除指定的一条数据
	 * @param id
	 */
	public void removeById(Integer id){
		StringBuffer sql = new StringBuffer("delete from navigate where id = ");
		sql.append(id);
		this.bulkUpdate(sql.toString());
	}
	
	/**
	 * 异步删除数据，包括其子孙节点
	 * @param id
	 * @param title
	 */
	@SuppressWarnings("unchecked")
	public void ajaxRemoveNode(Integer id){
		List list = this.getChildrenById(id);
		for (Object object : list) {
			Navigate obj = (Navigate)object;
			ajaxRemoveNode(obj.getId());
		}
		this.removeById(id);
	}
	
	/**
	 * 移动指定节点
	 * @param id	指定的节点的id
	 * @param oldParentId	节点移动前所在的父节点
	 * @param newParentId	节点移动后的目标父节点
	 * @param nodeIndex		节点移动后的目标位置
	 */
	public void ajaxMoveNode(int id, int oldParentId, int newParentId, int nodeIndex){
		Navigate obj = this.get(id);
		int minIndex = obj.getNumber().intValue();
		int maxIndex = nodeIndex;
		if(oldParentId == newParentId && minIndex != maxIndex){
			// 在同一个父节点下发生移动
			if(minIndex &lt; maxIndex){
				// 当要移动的节点的序号小于要移动到的目标序号，则下移
				this.downNode(oldParentId, minIndex, maxIndex);
			}else if(minIndex > maxIndex){
				// 当要移动的节点的序号大于要移动到的目标序号，则上移
				maxIndex = minIndex;
				minIndex = nodeIndex;
				this.upNode(oldParentId, minIndex, maxIndex);
			}
			// 节点本身的序号设置成要移动到的目标序号
			obj.setNumber(nodeIndex);
			this.update(obj);
		}
		if(oldParentId != newParentId){
			// 在不同父节点下发生移动
			//1、相当于要移动的节点在原父节点下下移到最后再删除掉，因此要指定移动发生时节点所在的位置
			this.downNode(oldParentId, minIndex, -1);
			//2、相当于要移动的节点在新父节点下上移到指定的位置，因此需要指定要移动到的位置
			this.upNode(newParentId, maxIndex, -1);
			// 节点本身的序号设置成要移动到的目标序号
			obj.setNumber(nodeIndex);
			obj.setParentId(newParentId);
			this.update(obj);
		}
	}
	/**
	 * 指定的节点下移
	 * @param parentId	指定范围内要移动的节点的父节点
	 * @param minIndex	指定节点移动发生时所在的位置
	 * @param maxIndex	指定节点要移动到的目标位置
	 */
	@SuppressWarnings("unchecked")
	public void downNode(int parentId, int minIndex, int maxIndex){
		// 指定的节点下移，意味着其范围内的节点各自减1
		StringBuffer sql = new StringBuffer("update navigate set number=number-1 where parentId = ");
		sql.append(parentId);
		if(maxIndex != -1){
			sql.append(" and number &lt;= ");
			sql.append(maxIndex);
		}
		if(minIndex != -1){
			sql.append(" and number > ");
			sql.append(minIndex);
		}		
		this.bulkUpdate(sql.toString());
	}
	/**
	 * 指定的节点上移
	 * @param parentId	指定范围内要移动的节点的父节点
	 * @param minIndex	指定节点要移动到的目标位置
	 * @param maxIndex	指定节点移动发生时所在的位置
	 */
	@SuppressWarnings("unchecked")
	public void upNode(int parentId, int minIndex, int maxIndex){
		// 指定的节点上移，意味着其范围内的节点各自加1
		StringBuffer sql = new StringBuffer("update navigate set number=number+1 where parentId = ");
		sql.append(parentId);
		if(maxIndex != -1){
			sql.append(" and number &lt; ");
			sql.append(maxIndex);
		}
		if(minIndex != -1){
			sql.append(" and number >= ");
			sql.append(minIndex);
		}
		this.bulkUpdate(sql.toString());
	}
	/**
	 * 批量更新或删除操作
	 * @param sql
	 */
	public void bulkUpdate(String sql){
		Connection conection = null;
		Statement stmt = null;
		try{
			conection = DBConn.getConnection(); 
			stmt = conection.createStatement();
			stmt.executeUpdate(sql);
		}catch(Exception e){
			e.printStackTrace();			
		}finally{
			try{    	
	        	if (stmt != null) {
		        	try {
		        		stmt.close();
		        	} catch (SQLException sqlex) {
		        	}
		        	stmt = null;
	        	}
	        	if (conection != null) {
		        	try {
		        		conection.close();
		        	} catch (SQLException sqlex) {
		        	}
		        	conection = null;
	        	}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}

</pre><br />3、Service层<br /><pre name="code" class="java">
package com.demo.navigate.service;

import java.io.Serializable;
import java.util.List;

import com.demo.navigate.dao.NavigateDao;
import com.demo.navigate.model.Navigate;

public class NavigateManager {
	private NavigateDao dao = NavigateDao.getInstanece();
	public Navigate get(Serializable id){
		return dao.get(id);
	}
	/**
	 * 获得指定节点的所有儿子节点
	 * @param id
	 */
	@SuppressWarnings("unchecked")
	public List&lt;Navigate> getChildrenById(Integer id){
		return dao.getChildrenById(id);
	}
	/**
	 * 保存数据
	 * @param obj 
	 */
	public void save(Navigate obj){
		dao.save(obj);
	}
	/**
	 * 更新数据
	 * @param obj 
	 */
	public void update(Navigate obj){
		dao.update(obj);
	}
	/**
	 * 删除指定的一条数据
	 * @param id
	 */
	public void removeById(Integer id){
		dao.removeById(id);
	}
	/**
	 * 异步更新标题
	 * @param id
	 * @param title
	 * @return true-修改成功 false-修改失败
	 */
	public Boolean ajaxUpdateTitle(Integer id,String title){
		return dao.ajaxUpdateTitle(id, title);
	}
	/**
	 * 异步删除数据，包括其子孙节点
	 * @param id
	 * @param title
	 */
	public void ajaxRemoveNode(Integer id){
		Navigate obj = dao.get(id);
		dao.downNode(obj.getParentId(), obj.getNumber(), -1);
		dao.ajaxRemoveNode(id);
	}
	/**
	 * 异步移动指定节点
	 * @param id	指定的节点的id
	 * @param oldParentId	节点移动前所在的父节点
	 * @param newParentId	节点移动后的目标父节点
	 * @param nodeIndex		节点移动后的目标位置
	 */
	public void ajaxMoveNode(int id, int oldParentId, int newParentId, int nodeIndex){
		dao.ajaxMoveNode(id, oldParentId, newParentId, nodeIndex);
	}
}

</pre><br />4、Servlet层<br />a)edit<br /><pre name="code" class="java">
package com.demo.navigate.web;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.demo.navigate.model.Navigate;
import com.demo.navigate.service.NavigateManager;

@SuppressWarnings("serial")
public class NavigateEditServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String idstr = request.getParameter("id");
		String parentId = request.getParameter("parentId");
		String leaf = request.getParameter("leaf");
		String number = request.getParameter("number");
		Navigate obj = null;
		if(null != idstr){
			NavigateManager navigateManager = new NavigateManager();
			obj = navigateManager.get(idstr);
		}else{
			obj = new Navigate();
			obj.setParentId(new Integer(parentId));
			obj.setLeaf(new Integer(leaf));
			obj.setNumber(new Integer(number));
		}
		request.setAttribute("obj", obj);
		RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/console-edit.jsp");
		dispatcher.forward(request, response);
	}
}

</pre><br />b)save<br /><pre name="code" class="java">
package com.demo.navigate.web;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.demo.navigate.model.Navigate;
import com.demo.navigate.service.NavigateManager;

@SuppressWarnings("serial")
public class NavigateSaveServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		NavigateManager navigateManager = new NavigateManager();
		Navigate obj = null;
		request.setCharacterEncoding("UTF-8");
		String id = request.getParameter("id");
		String number = request.getParameter("number");
		String parentId = request.getParameter("parentId");
		String leaf = request.getParameter("leaf");
		String title = request.getParameter("title");
		String url = request.getParameter("url");
		
		if(null != id && !"".equals(id)){
			obj = navigateManager.get(id);
			if(obj == null){
				RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/error.jsp");
				dispatcher.forward(request, response);
				return;
			}
		}else{
			obj = new Navigate();
			obj.setLeaf(new Integer(leaf));
			obj.setParentId(new Integer(parentId));
		}
		obj.setNumber(new Integer(number));
		obj.setTitle(title);
		obj.setUrl(url);
		if(null != id && !"".equals(id)){
			navigateManager.update(obj);
		}else{
			navigateManager.save(obj);
		}
		RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/success.jsp");
		dispatcher.forward(request, response);		
	}

}

</pre><br />c)json<br /><pre name="code" class="java">
package com.demo.navigate.web;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.demo.navigate.service.NavigateManager;

@SuppressWarnings("serial")
public class NavigateJsonServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		NavigateManager navigateManager = new NavigateManager();
		request.setAttribute("list", navigateManager.getChildrenById(new Integer(request.getParameter("id"))));
		RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/console-json.jsp");
		dispatcher.forward(request, response);
	}

}

</pre><br /><br />页面：<br />1、edit<br /><pre name="code" class="html">
&lt;%@ page contentType="text/html;charset=UTF-8" %>
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
&lt;%@ include file="/common/in.jsp"%>
&lt;html>
&lt;head>
	&lt;base href="&lt;%=basePath%>">
	&lt;title>菜单编辑&lt;/title>
	&lt;link rel="stylesheet" type="text/css" href="scripts/ext/resources/css/ext-all.css">
	&lt;script type="text/javascript" src="scripts/ext/adapter/ext/ext-base.js">&lt;/script>


	&lt;script type="text/javascript" src="scripts/ext/ext-all.js">&lt;/script>
	&lt;script type="text/javascript">
		function checkForm(form){
			if(form.parentId.value == "" || form.leaf.value == ""){
				Ext.Msg.alert("错误提示","表单信息不健全！");
				return false;
			}
			if(form.title.value == ""){
				Ext.Msg.alert("错误提示","标题不能为空！");
				return false;
			}
		}
	&lt;/script>
&lt;/head>
&lt;body style="background-color: white">
	&lt;br/>&lt;br/>
	&lt;form action="navigatesave" method="post" onsubmit="return checkForm(this)">
		&lt;input type="hidden" name="id" value="${obj.id}"/>
		&lt;input type="hidden" name="parentId" value="${obj.parentId}"/>
		&lt;input type="hidden" name="leaf" value="${obj.leaf}"/>
		&lt;input type="hidden" name="number" value="${obj.number}"/>
		&lt;table align="center">
			&lt;tr>&lt;td width="60">标题：&lt;/td>
				&lt;td>&lt;input type="text" name="title" value="${obj.title}"/>&lt;/td>&lt;/tr>
			&lt;c:if test="${obj.leaf==1}">
			&lt;tr>&lt;td>URL：&lt;/td>
				&lt;td>&lt;input type="text" name="url" value="${obj.url}"/>&lt;/td>&lt;/tr>
			&lt;/c:if>
			&lt;tr>&lt;td colspan="2" align="center">
					&lt;br/>
					&lt;input type="submit" name="submit" value="保存"/>
					&nbsp;&nbsp;
					&lt;input type="reset" name="reset" value="重置"/>
					&nbsp;&nbsp;
					&lt;input type="button" name="button" value="取消" onclick="window.parent.FormEditWin.close();">
				&lt;/td>&lt;/tr>
		&lt;/table>
	&lt;/form>
&lt;/body>
&lt;/html>

</pre><br /><br />2、success<br /><pre name="code" class="html">
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
&lt;html>
&lt;head>
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
&lt;title>信息更新成功&lt;/title>
&lt;script type="text/javascript">
	// 信息保存成功后，刷新父节点
	this.parent.FormEditWin.reloadNavNode();
&lt;/script>
&lt;/head>
&lt;body>
	&lt;center>
		恭喜，信息更新成功！
	&lt;/center>
&lt;/body>
&lt;/html>
</pre><br /><br />3、json<br /><pre name="code" class="html">
&lt;%@ page contentType="text/html;charset=UTF-8" %>
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

&lt;c:set var="len" value="${fn:length(list)-1}" >&lt;/c:set>
[
&lt;c:forEach items="${list}" var="obj" varStatus="i">
{
	id:'${obj.id}',
	text:'${obj.title}',
	&lt;c:if test="${obj.leaf == 1}">
		leaf:true,
	&lt;/c:if>
	singleClickExpand:true
}
	&lt;c:if test="${i.index&lt;len}">,&lt;/c:if>
&lt;/c:forEach>
]
</pre><br /><br />4、in.jsp<br /><pre name="code" class="html">
&lt;%@ page language="java" pageEncoding="UTF-8"%>
&lt;%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
</pre><br /><br />js核心：<br />console-index.js<br /><pre name="code" class="js">
// 全局路径
var basePath = "http://localhost:8080/langsinext";
if(typeof(glbRootPath) != "undefined"){
	basePath = glbRootPath;
}
// 扩展窗体
FormEditWin = function(){
	var curFormWin;
	return {
		width : 600,
		height : 400,
		showAddDirWin : function(parentNode) {
			// 显示添加子目录窗口
			var number = parentNode.indexOf(parentNode.lastChild) + 1;
			var editpage = basePath
					+ "/navigateedit?parentId="
					+ parentNode.id + "&leaf=0&number=" + number;
			var window = this.createWin("windirnew", "新建目录节点", editpage, function() {
				parentNode.reload();
			});
			window.show();
		},
		showAddLeafWin : function(parentNode) {
			// 显示添加子叶子节点窗口
			var number = parentNode.indexOf(parentNode.lastChild) + 1;
			var editpage = basePath
					+ "/navigateedit?parentId="
					+ parentNode.id + "&leaf=1&number=" + number;
			var window = this.createWin("winleafnew", "新建叶子节点", editpage, function() {
				parentNode.reload();
			});
			window.show();
		},
		showEditDirWin : function(node) {
			// 显示目录编辑窗口
			var editpage = basePath
					+ "/navigateedit?id=" + node.id;
			var window = this.createWin("win" + node.id, node.text, editpage, function() {
				var nodeparent = node.parentNode;
				var tree = node.getOwnerTree();
				nodeparent.on("expand", function(pnode) {
					tree.getNodeById(node.id).select();
				}, this, {
					single : true
				});
				node.parentNode.reload();
			});
			window.show();
		},
		showEditLeafWin : function(node) {
			// 显示叶子节点编辑窗口
			var editpage = basePath
					+ "/navigateedit?id=" + node.id;
			var window = this.createWin("win" + node.id, node.text, editpage, function() {
				var nodeparent = node.parentNode;
				var tree = node.getOwnerTree();
				nodeparent.on("expand", function(pnode) {
					tree.getNodeById(node.id).select();
				}, this, {
					single : true
				});
				node.parentNode.reload();
			});
			window.show();
		},
		createWin : function(winId, winTitle, iframePage, closeFun) {
			// 供各类型窗口创建时调用
			var win = Ext.getCmp(winId);
			if (!win) {
				win = new Ext.Window({
					id : winId,
					title : "菜单编辑窗口-" + winTitle,
					width : this.width,
					height : this.height,
					maximizable : true,
					modal : true,
					html : "&lt;iframe width='100%' height='100%' frameborder='0' src='"
							+ iframePage + "'>&lt;/iframe>"
				});
				this.reloadNavNode = closeFun;
			}
			curFormWin = win;
			return win;
		},
		reloadNavNode : function() {
		},
		close : function() {
			if(curFormWin){
				curFormWin.close();
			}
		}
	}
}();

// 导航树
NavTree = function(){
	var nav;
	var navEditor;
	var leafMenu;
	var dirMenu;
	var loader;
	var root;
	var removeFlag = false;
	var titleChangeFlag = false;
	var nodeSelected;
	var mgr;
	return {
		init : function(){
			if(!mgr){
				Ext.Msg.alert("警告提示","请先通过NavTree.setMgr()设置mgr");
				return;
			}
			if(!loader){
				loader = new Ext.tree.TreeLoader({
					url : basePath + '/navigatejson'
				});
				loader.on('beforeload', function(treeloader, node) {
					treeloader.baseParams = {
						id : node.id,
						method : 'tree'
					};
				}, this);
			}
			if(!root){
				root = new Ext.tree.AsyncTreeNode({
					id : '0',
					text : "系统菜单"
				});
			}
			if(!nav){
				nav = new Ext.tree.TreePanel({
					title : "左部导航",
					width : 232,
					autoScroll : true,
					animate : true,
					loader : loader,
					root : root,
					enableDD : true,
					listeners : {
						'click' : function(node, event) {
							if (node.isLeaf()) {
								// 为叶子节点时，点击不进入链接
								event.stopEvent();
							}
						}
					}
				});
				// 添加右键菜单
				nav.on("contextmenu", this.showTreeMenu);
				// 当节点文本改变时触发事件
				nav.on("textchange", function(node, newText, oldText) {
					if (!titleChangeFlag && newText != oldText) {
						mgr.ajaxUpdateTitle(node.id, newText, function(success) {
							if (!success) {
								Ext.Msg.show({
									title : "操作失败！",
									msg : "菜单修改失败！",
									buttons : Ext.Msg.OK,
									icon : Ext.MessageBox.ERROR
								});
								titleChangeFlag = true;
								node.setText(oldText);
								titleChangeFlag = false;
							}
						});
					}
				});
				// 当节点移动时触发事件
				nav.on("movenode", function(tree, node, oldParent, newParent, index) {
					mgr.ajaxMoveNode(node.id, oldParent.id, newParent.id, index);
				});
				// 当节点删除时触发事件
				nav.on("remove", function(tree, parentNode, node) {
					if (removeFlag) {
						mgr.ajaxRemoveNode(node.id);
					}
				});
			}
			if(!navEditor){
				navEditor = new Ext.tree.TreeEditor(nav, {
					allowBlank : false,
					ignoreNoChange : true,
					blankText : '标题不能为空',
					selectOnFocus : true
				});
			}
			this.setLeafMenu();
			this.setDirMenu();
		},
		setMgr : function(manager){
			mgr = manager;
		},
		getMgr : function(){
			return mgr;
		},
		setLeafMenu: function(){
			// 设置叶子菜单
			if(!leafMenu){
				leafMenu = new Ext.menu.Menu({
					items : [{
						text : "修改标题",
						handler : function() {
							navEditor.triggerEdit(nodeSelected);
						}
					}, "-", {
						text : "编辑",
						handler : function() {
							FormEditWin.showEditLeafWin(nodeSelected);
						}
					}, "-", {
						text : "删除",
						handler : this.delTreeItemComfirm
					}]
				});
			}
		},
		setDirMenu: function(){
			// 设置目录菜单
			if(!dirMenu){
				dirMenu = new Ext.menu.Menu({
					items : [{
						text : "修改标题",
						handler : function() {
							navEditor.triggerEdit(nodeSelected);
						}
					}, "-", {
						text : "编辑",
						handler : function() {
							FormEditWin.showEditDirWin(nodeSelected);
						}
					}, "-", {
						text : "添加叶子节点",
						handler : function() {
							FormEditWin.showAddLeafWin(nodeSelected);
						}
					}, "-", {
						text : "添加目录节点",
						handler : function() {
							FormEditWin.showAddDirWin(nodeSelected);
						}
					}, "-", {
						text : "删除",
						handler : this.delTreeItemComfirm
					}]
				});
			}
		},
		showTreeMenu : function(node, e){
			nodeSelected = node;
			nodeSelected.select();
			if (node.isLeaf()) {
				// 显示叶子节点菜单
				leafMenu.showAt(e.getPoint());
			} else {
				// 显示目录节点菜单
				dirMenu.showAt(e.getPoint());
			}
		},
		delTreeItemComfirm : function(){
			Ext.Msg.confirm("确认删除", "确定要删除所选节点吗？", function(btn) {
				if (btn == "yes") {
					NavTree.delTreeItem();
				}
			});
		},
		delTreeItem : function(){
			if (nodeSelected != nav.getRootNode()) {
				removeFlag = true;
				nodeSelected.remove();
				removeFlag = false;
			} else {
				Ext.Msg.alert("警告", "不能删除树的根节点！");
			}
		},
		show : function(){
			nav.render(Ext.getBody());
			nav.getRootNode().toggle();
		}
	}
}();

// 文档加载完毕执行
Ext.onReady(function(){
	Ext.BLANK_IMAGE_URL = "../scripts/ext/resources/images/default/s.gif";
	if(typeof(NavigateManager)=="undefined"){
		Ext.Msg.alert("警告提示","请先设置DWR，并实例化NavigateManager");
	}else{
		NavTree.setMgr(NavigateManager);
		NavTree.init();
		NavTree.show();
	}
});
</pre><br /><br />dwr配置：<br />dwr.xml<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr//dwr20.dtd">

&lt;dwr>
	&lt;allow>
		&lt;create javascript="NavigateManager" creator="new">
			&lt;param name="class"
				value="com.demo.navigate.service.NavigateManager">
			&lt;/param>
			&lt;include method="ajaxUpdateTitle" />
			&lt;include method="ajaxRemoveNode" />
			&lt;include method="ajaxMoveNode" />
		&lt;/create>
	&lt;/allow>
&lt;/dwr>
</pre><br /><br />servlet配置：<br />web.xml<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  &lt;servlet>
		&lt;servlet-name>navigatejson&lt;/servlet-name>
		&lt;servlet-class>
			com.demo.navigate.web.NavigateJsonServlet
		&lt;/servlet-class>
	&lt;/servlet>
	&lt;servlet>
		&lt;servlet-name>navigateedit&lt;/servlet-name>
		&lt;servlet-class>
			com.demo.navigate.web.NavigateEditServlet
		&lt;/servlet-class>
	&lt;/servlet>
	&lt;servlet>
		&lt;servlet-name>navigatesave&lt;/servlet-name>
		&lt;servlet-class>
			com.demo.navigate.web.NavigateSaveServlet
		&lt;/servlet-class>
	&lt;/servlet>
	&lt;servlet-mapping>
		&lt;servlet-name>navigatejson&lt;/servlet-name>
		&lt;url-pattern>/navigatejson&lt;/url-pattern>
	&lt;/servlet-mapping>
	&lt;servlet-mapping>
		&lt;servlet-name>navigateedit&lt;/servlet-name>
		&lt;url-pattern>/navigateedit&lt;/url-pattern>
	&lt;/servlet-mapping>
	&lt;servlet-mapping>
		&lt;servlet-name>navigatesave&lt;/servlet-name>
		&lt;url-pattern>/navigatesave&lt;/url-pattern>
	&lt;/servlet-mapping>
	&lt;servlet>
		&lt;servlet-name>dwr-invoker&lt;/servlet-name>
		&lt;servlet-class>uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class>
		&lt;init-param>
			&lt;param-name>debug&lt;/param-name>
			&lt;param-value>true&lt;/param-value>
		&lt;/init-param>
		&lt;init-param>
			&lt;param-name>
				allowGetForSafariButMakeForgeryEasier
			&lt;/param-name>
			&lt;param-value>true&lt;/param-value>
		&lt;/init-param>
		&lt;load-on-startup>1&lt;/load-on-startup>
	&lt;/servlet>
	&lt;servlet-mapping>
		&lt;servlet-name>dwr-invoker&lt;/servlet-name>
		&lt;url-pattern>/dwr/*&lt;/url-pattern>
	&lt;/servlet-mapping>
	&lt;welcome-file-list>
		&lt;welcome-file>index.jsp&lt;/welcome-file>
	&lt;/welcome-file-list>
&lt;/web-app>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/207696#comments" style="color:red;">已有 <strong>10</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 00:27:35 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/207696</link>
        <guid>http://yahaitt.javaeye.com/blog/207696</guid>
      </item>
      <item>
        <title>MyEclipse 6.0 注册机</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/199698" style="color:red;">http://yahaitt.javaeye.com/blog/199698</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          MyEclipse 6.0 注册机<br />一、解压缩<br />二、进入cmd到指定的解压缩后的目录，<br />三、运行输入命令：java -jar MyEclipseKeyGen.jar<br />四、出来注册机界面，获得用户名（Administrator）和注册码等<br />五、打开MyEclipse<br />六、通过菜单进入：Window->Preferences->MyEclipse->Subscription<br />七、将从注册机中复制过来的用户名和密码粘贴到第六步出来的对话框中。
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/199698#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jun 2008 13:21:04 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/199698</link>
        <guid>http://yahaitt.javaeye.com/blog/199698</guid>
      </item>
      <item>
        <title>透析Extjs源码之结合API写事件响应函数</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193662" style="color:red;">http://yahaitt.javaeye.com/blog/193662</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: olive"><br />我在一个论坛看到EXT传递参数的问题，觉得很多学EXT的人都会碰到：<br />++++++++++++++++++++++++++++++++++++++++<br />通过示例代码中的msg-box.js<br />我们可以看到<br />Ext.get('mb1').on('click', function(e){<br />        Ext.MessageBox.confirm('Confirm', 'Are you sure you want to do that?', showResult);<br />    });<br />这样的代码，还有它的回调函数showResult：<br />function showResult(btn){<br />        Ext.example.msg('Button Click', 'You clicked the {0} button', btn);<br />    };<br /><br />    function showResultText(btn, text){<br />        Ext.example.msg('Button Click', 'You clicked the {0} button and entered the text "{1}".', btn, text);<br />    };<br />（这里我把两个回调函数都放上来，用来说明我的问题）<br />我想请教的是：其中的匿名函数function(e)、showResult(btn)及showResultText(btn, text)中的参数如何来定义，我如何才能知道这些函数的具体意义，因为这里好像没有文档可查。也许在这里提出这个问题让您不好回答，请继续往下看。我出 现这个问题是在这里遇到的：<br />在Layout Dialog示例中的layout.js中：<br />有dialog.addButton('Submit', dialog.hide, dialog);这样一行代码，也就是说增加一个submit按钮，点击后dialog隐藏。<br />但如果我想让这个按钮加入回调函数或获取某些特定内容的值，这样问题就出现了，我是这样实现的：<br />dialog.addButton('Submit', function(a,b){<br />                                        alert(a);<br />                                        alert(b);<br />    }, dialog);<br />但我不知道function(a,b)中a和b代表什么(alert出来都是object，当我加到三个参数时就是未定义了，也就是说这个方法支持两个参数)，因为好像这里没有文档。<br /><br />当然，如果有其它方法来实现类似功能您也可以提出，但最好是解答一下我的问题，我不知道如何入手这个function<br /><br />++++++++++++++++++++++++++++++++++++++++++<br /></span><br /><br /><br />以上是我在论坛中看到的一个帖子，并且有人这样回复：<br /><div class="quote_title">fangzhouxing 写道</div><div class="quote_div">这个确实是一个Ext文档不全的问题. 只能查看源代码来解决了.</div><br /><br /><br />这个文档中其实是有说明的，而且不含糊，你仔细看的话就能理解。<br />看这个前先得理解各个支持事件响应的类的on或addListener方法，它的后面两个参数表示的是什么意思？scope和options，如果你知道了，那么在事件触发的时候想调用自定义的或EXT中已有的函数就不费解了。这里scope（作用域）默认指的是事件触发时所作用的对象，而当事件触发后会传递给响应函数什么参数呢？像普通的HtmlElement对象（比如一个表单按钮）都会传一个EventObject实例对象，像EXT中自定义的函数触发的话，API中有说明：<br />比如Ext.MessageBox的confirm方法，是这么解释的：<br />confirm( String title, String msg, [Function fn], [Object scope] ) : Ext.MessageBox <br /><br />Displays a confirmation message box with Yes and No buttons (comparable to JavaScript's confirm). If a callback function is passed it will be called after the user clicks either button, and the id of the button that was clicked will be passed as the only parameter to the callback (could also be the top-right close button). <br /><br />看最后一句：and the id of the button that was clicked will be passed as the only parameter to the callback，只传递你所点击的按钮（“确认”或“取消”）的按钮本身或它的id，也就是说只有一个参数，这样的话，你的响应函数就可以定义成function(aaa){...}那么这个aaa就是这个你点击的按钮的id了。<br /><br />同样，再看一下Ext.MessageBox的prompt方法，是这么解释的：<br />prompt( String title, String msg, [Function fn], [Object scope], [Boolean/Number multiline], [String value] ) : Ext.MessageBox <br /><br />Displays a message box with OK and Cancel buttons prompting the user to enter some text (comparable to JavaScript's prompt). The prompt can be a single-line or multi-line textbox. If a callback function is passed it will be called after the user clicks <span style="color: red"> either button, and the id of the button </span>that was clicked (could also be the top-right close button) and <span style="color: red">the text that was entered </span><span style="color: red">will be passed as the two parameters to the callback</span>. <br /><br />也就是会传递2个参数，<br />1、事件触发时所点击的按钮本身或按钮的id<br />2、在输入框中输入的文本值。<br />这样在你自定义或已有的响应函数你就可以这样定义了，function(first,second){...}其中第一个参数是1、中说的，第二个参数是2中说的。<br /><br /><br />另外，像EXT的API中很多组件都有Public Events这部分内容，就是会响应的事件列表，这个写法是什么意思呢？<br />比如，Ext.Window下的move事件，API中是这样写的：<br />move : ( Ext.Component this, Number x, Number y ) <br /><br />Fires after the component is moved. <br />Listeners will be called with the following arguments:<br /> <br />this : Ext.Component<br />x : Number<br />The new x position<br />y : Number<br />The new y position<br /><br />指的是当move（窗口移动）事件发生时，会有3个参数产生，这3个参数是能够传递给你的响应函数的。那么这个时候你的响应函数就可以这样定义：<br />function(component,positionX,positionY){....}<br />(里面的参数名随便写)，或者可以根据你的需要可以少定义几个参数，但是这里的话最多就是3个参数，而且是按move事件传递给你的参数顺序来的（比如第一个参数一定是Ext.Component类型的，第二个参数一定是Number类型的，并且是个x坐标值，第三个参数一定是个Number类型的，一定是个y坐标值），如果你非要这样定义：function(component,positionX,positionY,otherparam){....}<br />那么你的函数体里其实是获得不了otherparam的。<br /><br />EXT组件中的Public Events部分都是这样的。如果理解了事件机制，那么如何定义和使用响应函数就很顺利了。<br /><br />请看下面的示例代码并结合之上提的有关Ext.Window的move事件的API：<br /><pre name="code" class="js">
Ext.onReady(function(){
	var win = new Ext.Window({
		title:'响应窗口移动事件的例子',
		width:400,
		height:300,
		html:'&lt;br/>&lt;br/>&lt;p>&lt;center>这是响应窗口移动事件的例子，请注意响应函数中的参数&lt;/center>&lt;/p>'
	});
	win.on("move",moving);
	win.show();
});
moving = function(c,x,y){
	alert("移动窗口的id:" + c.id);
	alert("窗口移动后的x坐标值：" + x);
	alert("窗口移动后的y坐标值" + y);
};

//也可以这样定义：去掉注释，并把上面定义的给注释掉即可
/*
moving = function(c,x){
	alert("移动窗口的id:" + c.id);
	alert("窗口移动后的x坐标值：" + x);
}
*/
//也可以这样定义：去掉注释，并把上面定义的给注释掉即可
/*
moving = function(c){
	alert("移动窗口的id:" + c.id);
}
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193662#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 14:34:37 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193662</link>
        <guid>http://yahaitt.javaeye.com/blog/193662</guid>
      </item>
      <item>
        <title>透析Extjs源码之layout（二）FormPanel与FormLayout的关系</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193553" style="color:red;">http://yahaitt.javaeye.com/blog/193553</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          理解了layout之后，再看看FormPanel源码，发现它指定了layout:'form',而FormPanel又是Container的子孙类，所以，它就是用了FormLayout布局。只是通过FormPanel，将FormLayout所需要的配置都做了些初始化提取出来了，便于开发者使用和理解。所以，在FormPanel渲染后就会用FormLayout来进行doLayout功能。<br />所以写成下面两种方式的代码，效果是一样的：<br />一、用FormPanel<br /><pre name="code" class="js">
Ext.onReady(function(){
	var panel = new Ext.FormPanel({
		renderTo:'hello',
		title:'容器组件',
		width:300,
		hideLabels:false,
		labelAlign:'right',
		height:120,
		defaultType:'textfield',
		items:[{
			fieldLabel:'请输入姓名',
			name:'name'
		},{
			fieldLabel:'请输入地址',
			name:'address'
		},{
			fieldLabel:'请输入电话',
			name:'tel'
		}]
	});
});
</pre><br /><br />二、只指定layout:'form'<br /><pre name="code" class="js">
Ext.onReady(function(){
	var panel = new Ext.Panel({
		renderTo:'hello',
		title:'容器组件',
		width:300,
		layout:'form',
		hideLabels:false,
		labelAlign:'right',
		height:120,
		defaultType:'textfield',
		items:[{
			fieldLabel:'请输入姓名',
			name:'name'
		},{
			fieldLabel:'请输入地址',
			name:'address'
		},{
			fieldLabel:'请输入电话',
			name:'tel'
		}]
	});
});
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193553#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 10:38:20 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193553</link>
        <guid>http://yahaitt.javaeye.com/blog/193553</guid>
      </item>
      <item>
        <title>透析Extjs源码之layout（一）layout的实现</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193535" style="color:red;">http://yahaitt.javaeye.com/blog/193535</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、配置选项layout什么时候可用？<br />只有Ext.Container的子类或子孙类才具有layout的功能，<br />如果在这些子孙类中不指定layout的配置选项，那么layout就有个默认值是'auto',即为Ext.layout中的超类：Ext.layout.ContainerLayout。<br />每个layout类，看layout包下的类，都是直接或间接的继承了Ext.layout.ContainerLayout，并且每个layout类都会注册到Ext.Container.LAYOUTS中去，如：Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;<br />这样就可以结合配置选项layout的值来获得对应的布局类实例对象：<br />Container.js文件第204行：<br /><pre name="code" class="js">
if(typeof this.layout == 'string'){
                this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);
            }
</pre><br />第209行代码：<br /><pre name="code" class="js">
if(this.activeItem !== undefined){
                var item = this.activeItem;
                delete this.activeItem;
                this.layout.setActiveItem(item);
                return;
            }
</pre><br />拥有activeItem和setActiceItem功能的布局类才具有这个激活项功能，比如：Ext.layout.CardLayout，在目前所提供的布局类中就只有这个Ext.layout.CardLayout才有这个功能。<br /><br />2、doLayout的条件？<br />看Container.js文件第216行：<br /><pre name="code" class="js">
if(!this.ownerCt){
            this.doLayout();
        }
</pre><br />也就是布局执行前还没有指定要渲染的容器。<br /><br />3、什么时候执行布局？<br />在发生渲染（执行render()方法）时（当new时，如果指定了renderTo配置选项值，那么在其超类Component的构造器中最后也会执行render()方法），<br />看Container.js文件第202行：<br /><pre name="code" class="js">
Ext.Container.superclass.render.apply(this, arguments);
</pre><br />是先去执行BoxComponent的render()方法，BoxComponent继承了Component，它的render()方法就是Component的render()方法。<br />所以，它是在render()后发生的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193535#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 09:48:07 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193535</link>
        <guid>http://yahaitt.javaeye.com/blog/193535</guid>
      </item>
      <item>
        <title>透析Extjs的Ext.js源码（五）分析继承的实现</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193271" style="color:red;">http://yahaitt.javaeye.com/blog/193271</a>&nbsp;
          发表时间: 2008年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ext中有关继承的实现的关键代码如下：（Ext.js中）<br /><br />extend:<br /><pre name="code" class="js">
extend : function(){
            // inline overrides
            var io = function(o){
                for(var m in o){
                    this[m] = o[m];
                }
            };
            var oc = Object.prototype.constructor;
            
            return function(sb, sp, overrides){
                if(typeof sp == 'object'){
                    overrides = sp;
                    sp = sb;
                    sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
                }
                var F = function(){}, sbp, spp = sp.prototype;
                F.prototype = spp;
                sbp = sb.prototype = new F();
                sbp.constructor=sb;
                sb.superclass=spp;
                if(spp.constructor == oc){
                    spp.constructor=sp;
                }
                sb.override = function(o){
                    Ext.override(sb, o);
                };
                sbp.override = io;
                Ext.override(sb, overrides);
                sb.extend = function(o){Ext.extend(sb, o);};
                return sb;
            };
        }()
</pre><br /><br />override:<br /><pre name="code" class="js">
override : function(origclass, overrides){
            if(overrides){
                var p = origclass.prototype;
                for(var method in overrides){
                    p[method] = overrides[method];
                }
            }
        }
</pre><br /><br />Ext.apply:<br /><pre name="code" class="js">
Ext.apply = function(o, c, defaults){
    if(defaults){
        // no "this" reference for friendly out of scope calls
        Ext.apply(o, defaults);
    }
    if(o && c && typeof c == 'object'){
        for(var p in c){
            o[p] = c[p];
        }
    }
    return o;
};
</pre><br /><br />最关键的是extend部分的代码，它使得如果子类没有constructor（或者说子类的constructor就是个默认的Object），那么当new一个子类的时候，会调用他的父类的构造器，因此，我们看到Panel是直接通过Ext.Panel = Ext.extend(Ext.Contailer,{...});的方式直接定义的，在new Panel({...})的时候就能层层进去一直到有构造器的超类Ext.Component，并执行这个超类的构造器里的代码。而Ext.Component的构造器代码中有this.initComponet()方法，这样就能够调用子类的initComponent()方法，而子类的initComponent()方法中都有 子类名.superclass.initComponent();这样的代码来调用父类的init方法，这样我们在new一个子类的后就能够直接初始化了所有的信息。<br />extend中最关键的一句话是：<br />sb = overrides.constructor != oc ? overrides.constructor : <span style="color: red">function(){sp.apply(this, arguments);}</span>;<br />它表示了执行父类构造器的原因，<br />new对象时，就是执行这个function(){sp.apply(this, arguments);}方法，<br />sp.applay()执行时，父类构造器就会马上被执行。<br /><br /><br />比较并执行下面的代码就可以理解了上面说的内容了：<br /><br />1、子类有构造器的情况<br /><pre name="code" class="js">
Parent = function() {
	alert("parent");
};
Child = function() {
	alert("child");
};
Ext.extend(Child, Parent, {
	init : function() {
		alert("child's init function");
	}
});
var cl = new Child();// 输出结果：child
cl.init();// 输出结果：child's init function

</pre><br /><br />2、子类没有构造器的情况<br /><pre name="code" class="js">
Parent = function() {
	alert("parent");
};
Child = Ext.extend(Parent, {
	init : function() {
		alert("child's init function");
	}
});
var cl = new Child();// 输出结果：parent
cl.init();// 输出结果：child's init function
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193271#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 May 2008 14:33:44 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193271</link>
        <guid>http://yahaitt.javaeye.com/blog/193271</guid>
      </item>
      <item>
        <title>透析Extjs的Ext.js源码（四）去理解Ext.js</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193056" style="color:red;">http://yahaitt.javaeye.com/blog/193056</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="js">
//先定义匿名方法，第一个括号对里的，必须要有这个括号对，之后第二个括号对用来执行这个匿名方法，如果这个匿名方法返回的是function，那么可以加第三个括号对。
(function(){
	alert("aa")
	return function(){
		alert("bb");
	}
})();// 输出结果：aa

//带参数的匿名方法使用
(function(a,b){
	alert(a);
	alert(b);
	return function(c){
		alert(c);
	}
})("匿名方法的第一个参数值","匿名方法的第二个参数值")("调用匿名方法执行后返回方法所需要的参数值");
// 输出结果：匿名方法的第一个参数值，匿名方法的第二个参数值，调用匿名方法执行后返回方法所需要的参数值
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193056#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 18:00:51 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193056</link>
        <guid>http://yahaitt.javaeye.com/blog/193056</guid>
      </item>
      <item>
        <title>透析Extjs的Ext.js源码（三）扩展</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193055" style="color:red;">http://yahaitt.javaeye.com/blog/193055</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="js">
if(!Person.extend){//若extend属性还未存在则执行里面的代码
	Person.applay(Person,{
		extend:function(){
			alert("定义时执行");
			return function(){
				alert("hello");
			}
		}()// 注意这里加了一对()，表示在new一个Person对象的时候就会立即执行extend后面定义的方法，并且返回里面return的方法给extend属性，
		   //那么这样，extend就是一个方法类型的属性了
	});
}

//因为之前!Person.extend为true，所以进行了Person.applay方法的执行，而参数中extend元素又是个定义时即时执行的属性，因此这里就先输出结果：定义时执行

Person.extend();// 输出结果：hello
Person.extend();// 输出结果：hello
//new Person();// 输出结果：定义时执行，没执行一次new Person()，都会输出一次这个结果
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193055#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 18:00:08 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193055</link>
        <guid>http://yahaitt.javaeye.com/blog/193055</guid>
      </item>
      <item>
        <title>透析Extjs的Ext.js源码（二）能在定义时就能执行的方法的写法 function(){...}</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193054" style="color:red;">http://yahaitt.javaeye.com/blog/193054</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="js">
/**
 * 第二部分：能在定义时就能执行的方法的写法 function(){...}();
 */
/**
 * 一、普通的方法的定义与执行
 */
// 1-1、普通的方法定义，不带返回值的情况
fun = function() {
	alert("执行");
};
// 1-2、普通的方法执行，不带返回值的情况
// fun();// 输出结果：执行

// 2-1、普通的方法定义，带返回值，且返回值是个字符串的情况
fun = function() {
	alert("执行");
	return "返回的是字符串";
}
// 2-2、普通的方法执行，带返回值，且返回值是个字符串的情况
// fun();// 输出结果：执行
// 2-3、普通的方法执行，带返回值，且返回值是个字符串的情况，并将返回值输出
// alert(fun());// 输出结果：执行，返回的是字符串，(分别是两次警告框形式出现)，原因是，先执行fun(),然后会带回返回的字符串，再通过alert输出
// alert(typeof fun());// 输出结果：执行，string

// 3-1、普通的方法定义，带返回值，且返回值是个object的情况
fun = function() {
	alert("执行");
	return new Date();
}
// 3-2、普通的方法执行，带返回值，且返回值是个object的情况
// fun();// 输出结果：执行
// 3-3、普通的方法执行，带返回值，且返回值是个object的情况，并将返回值输出
// alert(fun());// 输出结果：执行，Wed May 14 16:25:32 UTC+0800 2008
// 3-4、普通的方法执行，带返回值，且返回值是个object的情况，并将返回值类型输出
// alert(typeof fun());// 输出结果：执行，object

// 4-1、普通的方法执行，带返回值，且返回值是个function的情况
fun = function() {
	alert("执行");
	return function() {
		alert("返回类型是个方法");
	};
}
// 4-2、普通的方法执行，带返回值，且返回值是个function的情况
// fun();// 输出结果：执行
// 4-3、因为fun()执行后返回的是个function，所以根据这个返回的function的参数情况（比如参数的个数和类型）再执行一次返回的function，
// 因为此处这个返回的function是不需要参数的，所以就可以直接用()来执行
// fun()();// 输出结果：执行，返回类型是个方法
// 3-4、普通的方法执行，带返回值，且返回值是个object的情况，并将返回值类型输出
// alert(typeof fun());// 输出结果：执行，function

/**
 * 定义时就能执行
 */
 
fun = function(){
	alert("执行");
}();
//alert(fun);

fun = function(){
	alert("执行");
	return "返回的是字符串";// 返回的是个字符串
}();
//alert(fun)


fun = function(){
	alert("执行");
	return new Date();// 返回的是个object
}();
alert(fun);


fun = function(){
	alert("执行");
	return function(){
		alert("返回类型是个方法");
	}// 返回的是个方法
}();
fun();
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193054#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 17:59:03 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193054</link>
        <guid>http://yahaitt.javaeye.com/blog/193054</guid>
      </item>
      <item>
        <title>透析Extjs的Ext.js源码（一）对象属性的添加和设置</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/193049" style="color:red;">http://yahaitt.javaeye.com/blog/193049</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="js">
/**
 * 分析Ext.js
 */

/**
 * 第一部分：对象属性的添加和设置
 */
Person = {
	sex : 'woman'// 初始属性设置
};

Person.applay = function(source, copy, defaults) {
	if (defaults) {
		Person.applay(source, defaults)
	}
	if (source && copy && typeof copy == 'object') {
		for (var p in copy) {
			// alert(p);
			// p是属性名，通过source[p] = copy[p];对source进行属性的添加和设置。
			// 如果copy中的属性列表包含有defaults的属性，则source中采用的是copy中的属性和对应的值。
			source[p] = copy[p];
		}
	}
	return source;
};

/**
 * 一、传递的是{}配置列表时
 */
// 1、不传defaults的情况
Person.applay(Person, {
	name : 'wujinli',
	age : 26
});
// alert(Person.name);// 输出属性名为name的属性值，输出结果：wujinli，也可以用 alert(Person["name"])

// 2、传defaults并且第二个参数的属性列表中不包含第三个参数的属性的情况
Person.applay(Person, {
	age : 26
}, {
	name : 'wujinli'
});
// alert(Person.name);// 输出属性名为name的属性值，输出结果：wujinli，也可以用 alert(Person["name"])

// 3、传defaults并且第二个参数的属性列表中有包含第三个参数的属性的情况
Person.applay(Person, {
	name : '丫梨',
	age : 26
}, {
	name : 'wujinli'
});
// alert(Person.name);// 输出属性名为name的属性值，输出结果：丫梨，也可以用 alert(Person["name"])

/**
 * 二、传递的是对象时
 */
Child = function() {
	this.farther = "farther-name";
	this.mother = "mother-name";
};
Person.applay(Person, new Child());
// alert(Person.farther);// 输出属性名为farther的属性值，输出结果：farther-name
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/193049#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 17:57:12 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/193049</link>
        <guid>http://yahaitt.javaeye.com/blog/193049</guid>
      </item>
      <item>
        <title>extjs视频教程系列之-第一讲:ExtJS介绍及应用举例</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/190239" style="color:red;">http://yahaitt.javaeye.com/blog/190239</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          地址:<br />http://bbs.langsin.com/viewthread.php?tid=5498<br /><br />免费预览地址:<br />http://imgshr.jpg.name/ttthrrwtvhytthhyjjwzzsjzjshszjyyjrry.swf
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/190239#comments" style="color:red;">已有 <strong>7</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 15:13:31 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/190239</link>
        <guid>http://yahaitt.javaeye.com/blog/190239</guid>
      </item>
      <item>
        <title>ExtJs关于Ext.extend()的说明</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/184972" style="color:red;">http://yahaitt.javaeye.com/blog/184972</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Ext.extend方法是用来实现类的继承。<br />extend(Object subclass,Object superclass,[Object overrides] : Object<br />第一个参数：子类<br />第二个参数：父类<br />第三个参数：要覆盖的属性。<br />这里需要强调一下，子类继承下来的是父类中通过superclass.prototype方式定义的属性（包括用此方法定义的函数）。<br />例子如下：<br /><pre name="code" class="js">
&lt;script type="text/javascript">
			function S(){
			}
			S.prototype.s = "s";
			S.prototype.s1 = "s1";
			function C(){
				this.c = "c";
				this.c1 = "c1";
			}
			Ext.extend(C,S,{s1:"by c overload"});
			var c = new C();
			alert(c.s); //s
			alert(c.s1); //by c overload
		&lt;/script>
</pre><br />如果按下面这个方式写就会提示c.s没有定义(undefind)：<br /><pre name="code" class="js">
&lt;script type="text/javascript">
			function S(){
				this.s = "s";
				this.s1 = "s1";
			}
			function C(){
				this.c = "c";
				this.c1 = "c1";
			}
			Ext.extend(C,S,{s1:"by c overload"});
			var c = new C();
			alert(c.s); //undefind
			alert(c.s1); //by c overload
		&lt;/script>
</pre><br /><br />也可以通过如下方式来实现类的继承<br /><pre name="code" class="js">
&lt;script type="text/javascript">
			function S(){
			}
			S.prototype.s = "s";
			S.prototype.s1 = "s1";
			C = Ext.extend(S,{s1:"by c overload"});
			var c = new C();
			alert(c.s); //s
			alert(c.s1); //by c overload
		&lt;/script>
</pre><br />此时，C是子类，S是父类
          <br/><br/>
          <span style="color:red;">
            <a href="http://yahaitt.javaeye.com/blog/184972#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 15:16:53 +0800</pubDate>
        <link>http://yahaitt.javaeye.com/blog/184972</link>
        <guid>http://yahaitt.javaeye.com/blog/184972</guid>
      </item>
      <item>
        <title>Javascript对象构建</title>
        <author>yahaitt</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yahaitt.javaeye.com">yahaitt</a>&nbsp;
          链接：<a href="http://yahaitt.javaeye.com/blog/184910" style="color:red;">http://yahaitt.javaeye.com/blog/184910</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、Javascript对象构建构建javascript对象的方式有多种，其中，