好书推荐,EXT JS WEB应用程序开发指南,第2版本,很不错的工具书


一 EXT.WINDOW.MESSAGEBOX


1)基本alert

<link rel="stylesheet" type="text/css" href="../../ext-4.0/resources/css/ext-all.css" />

<script type="text/javascript" src="../../ext-4.0/bootstrap.js"></script>

<script type="text/javascript" src="../../ext-4.0/locale/ext-lang-zh_CN.js"></script>

<script type="text/javascript">

Ext.onReady(function(){

Ext.Msg.alert('提示','<font color=red>支持HTML格式文本</font>');

});

</script>


注意alert不是阻塞的。


2)confirm

Ext.onReady(function(){

Ext.MessageBox.confirm('提示','请单击我,做出选择',callBack);

function callBack(id){

alert('单击的按钮ID是:'+id);

}

});


3)prompt:

Ext.onReady(function(){

Ext.MessageBox.prompt('提示','输入一些内容看看:',callBack,this,true,"我是默认值");

function callBack(id,msg){

alert('单击的按钮ID是:'+id+'\n'+'输入的内容是:'+msg);

}

});

4)wait:

Ext.onReady(function(){

Ext.MessageBox.wait('请等待,操作需要很长时间!','提示',{

text : '进度条上的文字'

});

})


5) show:

Ext.onReady(function(){

Ext.MessageBox.show({

title:'提示',

msg:'我有三个按钮,和一个多行文本区。',

modal:true,

prompt:true,

value:'请输入',

fn:callBack,

buttons:Ext.Msg.YESNOCANCEL,

icon:Ext.Msg.QUESTION

})

function callBack(id,msg){

alert('单击的按钮ID是:'+id+'\n'+'输入的内容是:'+msg);

}

});


6)动态更新进度条

Ext.onReady(function(){

var msgBox = Ext.MessageBox.show({

title:'提示',

msg:'动态跟新的进度条和信息文字',

modal:true,

width:300,

progress:true

})


var count = 0;//滚动条被刷新的次数

var percentage = 0;//进度百分比

var progressText = '';//进度条信息


var task = {

run:function(){

count++;

//计算进度

percentage = count/10;

//生成进度条文字

progressText = '当前完成度:'+percentage*100 + "%";

//更新信息提示对话框

msgBox.updateProgress(percentage,progressText,

'当前时间:'+Ext.util.Format.date(new Date(),'Y-m-d g:i:s A'));

//刷新10次后关闭信息提示对话框

if(count > 10){

Ext.TaskManager.stop(task);

msgBox.hide();

}


},

interval:1000

}


Ext.TaskManager.start(task);

});



二 progress bar进度条

1)手工模式

Ext.onReady(function(){

var ProgressBar = new Ext.ProgressBar({

width:300,//设定进度条的宽度

renderTo:'ProgressBar'

});

var count = 0;//滚动条被刷新的次数

var percentage = 0;//进度百分比

var progressText = '';//进度条信息


Ext.TaskManager.start({

run:function(){

count++;

//刷新10次后关闭信息提示对话框

if(count > 10){

ProgressBar.hide();

}

//计算进度

percentage = count/10;

progressText = percentage * 100 + '%'

//更新信息提示对话框

ProgressBar.updateProgress(percentage,progressText,true);

},

interval:1000,//设置时间间隔

repeat : 6//设置执行次数

});

});


2)自动模式

Ext.onReady(function(){

var ProgressBar = new Ext.ProgressBar({

width:300,//设定进度条的宽度

renderTo:'ProgressBar'

cls:'customer' //定义样式

});

ProgressBar.wait({

duration:10000,//进度条持续更新10秒钟

interval:1000,//每1秒钟更新一次

increment:10,//进度条分10次更新完毕

scope:this,//回调函数的执行范围

text : 'waiting',//进度条上的文字

fn:function(){//更新完成后调用的回调函数

alert('更新完毕');

}

});

});



三 菜单工具栏

1) 基本

Ext.onReady(function(){

var toolbar = new Ext.toolbar.Toolbar({//创建工具栏

renderTo:'toolbar',

width:500

});

toolbar.add(

{text:'新建'},{text:'打开'},

{text:'编辑'},{text:'保存'}, //加入按钮

'-', //加入工具栏分隔符

{ //加入表单元素

xtype:'textfield',

hideLabel : true,

width:150

},

'->', //加入一个充满工具栏的空白元素

'<a href=#>超连接</div>', //加入一个Element元素

{xtype: 'tbspacer', width: 50},//加入一个空白元素,宽度为50像素

'静态文本' //加入一个简单字符串

);

});


2)menu基本

Ext.onReady(function(){

var toolbar = new Ext.toolbar.Toolbar({//创建工具栏

renderTo:'toolbar',

width:300

});

var fileMenu = new Ext.menu.Menu({//文件创建菜单

shadow : 'frame',//设置菜单四条边都有阴影

allowOtherMenus : true,

items : [

new Ext.menu.Item({

text: '新建',//菜单项名称

menuHideDelay:1000,

handler:onMenuItem//菜单项处理函数

}),//添加菜单项

{text: '打开',handler:onMenuItem},

{text: '关闭',handler:onMenuItem}

]

});

var editMenu = new Ext.menu.Menu({//编辑创建菜单

shadow : 'drop',//设置菜单在右下两条边有阴影

allowOtherMenus : true,

items : [

{text: '复制',handler:onMenuItem},//添加菜单项

{text: '粘贴',handler:onMenuItem},

{text: '剪切',handler:onMenuItem}

]

});

toolbar.add(

{text : '文件', menu : fileMenu},//将菜单加入工具栏

{text : '编辑', menu : editMenu}

);

function onMenuItem(item){//菜单项的回调方法

alert(item.text);//取得菜单项的text属性

}

});


四 表单

1) 表单的出错提示信息位置例子

Ext.onReady(function(){

Ext.QuickTips.init();//初始化信息提示功能

var form = new Ext.form.Panel({

title:'表单',//表单标题

height:120,//表单高度

width:200,//表单宽度

frame:true,//是否渲染表单

renderTo :'form',

defaults:{//统一设置表单字段默认属性

//autoFitErrors : false,//展示错误信息时是否自动调整字段组件宽度

labelSeparator :':',//分隔符

labelWidth : 50,//标签宽度

width : 150,//字段宽度

allowBlank : false,//是否允许为空

blankText : '不允许为空',

labelAlign : 'left',//标签对齐方式

msgTarget :'qtip' //显示一个浮动的提示信息

//msgTarget :'title' //显示一个浏览器原始的浮动提示信息

//msgTarget :'under' //在字段下方显示一个提示信息

//msgTarget :'side' //在字段的右边显示一个提示信息

//msgTarget :'none' //不显示提示信息

//msgTarget :'errorMsg' //在errorMsg元素内显示提示信息

},

items:[{

xtype : 'textfield',

fieldLabel : '姓名'//标签内容

},{

xtype : 'numberfield',

fieldLabel : '年龄'

}]

});

});


2)表单中的文本框

Ext.onReady(function(){

Ext.QuickTips.init();

var loginForm = new Ext.form.Panel({

title:'Ext.form.field.Text示例',

bodyStyle:'padding:5 5 5 5',//表单边距

frame : true,

height:120,

width:200,

renderTo :'form',

defaultType: 'textfield',//设置表单字段的默认类型

defaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 50,//标签宽度

width : 150,//字段宽度

allowBlank : false,//是否允许为空

labelAlign : 'left',//标签对齐方式

msgTarget :'side' //在字段的右边显示一个提示信息

},

items:[{

fieldLabel : '用户名',

name : 'userName',

selectOnFocus : true,//得到焦点时自动选择文本

//验证电子邮件格式的正则表达式

regex : /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/,

regexText:'格式错误'//验证错误之后的提示信息,

},{

name : 'password',

fieldLabel : '密码',

inputType : 'password'//设置输入类型为password

}

],

buttons:[{

text : '登陆',

handler : function(){

loginForm.form.setValues({userName:'user@com',password:'123456'});

}

}]

});

});


3) 获得EXT FORM中的值的方法

function showValue(){

var memo = testForm.getForm().findField('memo');//取得输入控件

alert(memo.getValue());//取得控件值

}


4) number限制输入数字框

var form = new Ext.form.FormPanel({

title:'Ext.form.field.Number示例',

bodyStyle:'padding:5 5 5 5',//表单边距

renderTo :'form',

frame : true,

height:150,

width:250,

defaultType: 'numberfield',//设置表单字段的默认类型

defaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 80,//标签宽度

width : 200,//字段宽度

labelAlign : 'left',//标签对齐方式

msgTarget :'side' //在字段的右边显示一个提示信息

},

items:[{

fieldLabel:'整数',

hideTrigger : true,//隐藏微调按钮

allowDecimals : false,//不允许输入小数

nanText :'请输入有效的整数'//无效数字提示

},{

fieldLabel:'小数',

decimalPrecision : 2,//精确到小数点后两位

allowDecimals : true,//允许输入小数

nanText :'请输入有效的小数'//无效数字提示

},{

fieldLabel:'数字限制',

baseChars :'12345'//输入数字范围

},{

fieldLabel:'数值限制',

maxValue : 100,//最大值

minValue : 50//最小值

}]

});


5 checkboxgroup和radiogroup(4.0才支持)

new Ext.form.Panel({

title:'CheckboxGroup和RadioGroup组件示例',

bodyStyle:'padding:5 5 5 5',//表单边距

frame : true,

height:140,

width:270,

renderTo :'form',

defaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 50,//标签宽度

width : 200,//字段宽度

labelAlign : 'left'//标签对齐方式

},

items:[{

xtype : 'radiogroup',

fieldLabel : '性别',

columns : 2,//2列

items: [

{boxLabel : '男',name: 'sex', inputValue: 'male'},

{boxLabel : '女',name: 'sex', inputValue: 'female'}

]

},{

xtype : 'checkboxgroup',

fieldLabel : '爱好',

columns : 3,//3列

items: [

{boxLabel : '游泳',name: 'swim'},

{boxLabel : '散步',name: 'walk'},

{boxLabel : '阅读',name: 'read'},

{boxLabel : '游戏',name: 'game'},

{boxLabel : '电影',name: 'movie'}

]

}]

});


6 EXT.FORM.field.trigger例子

Ext.onReady(function(){

var testForm = new Ext.form.Panel({

title:'Ext.form.field.Trigger示例',

bodyStyle:'padding:5 5 5 5',//表单边距

frame : true,

height:100,

width:270,

renderTo :'form',

defaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 70,//标签宽度

width : 200,//字段宽度

labelAlign : 'left'//标签对齐方式

},

items:[{

xtype : 'triggerfield',

id:'memo',

fieldLabel:'触发字段',

hideTrigger : false,//不隐藏触发按钮

onTriggerClick : function(){

var memo = testForm.getForm().findField('memo');//取得输入控件

alert(memo.getValue());//取得控件值

Ext.getCmp('memo').setValue('test');

}

}]

});

});




7 本地数据源的组合框示例

Ext.onReady(function(){

//创建数据模型

Ext.regModel('PostInfo', {

fields: [{name: 'province'},{name: 'post'}]

});

//定义组合框中显示的数据源

var postStore = Ext.create('Ext.data.Store',{

model : 'PostInfo',

data : [

{province:'北京',post:'100000'},

{province:'通县',post:'101100'},

{province:'昌平',post:'102200'},

{province:'大兴',post:'102600'},

{province:'密云',post:'101500'},

{province:'延庆',post:'102100'},

{province:'顺义',post:'101300'},

{province:'怀柔',post:'101400'}

]

});

//创建表单

Ext.create('Ext.form.Panel',{

title:'Ext.form.field.ComboBox本地数据源示例',

renderTo: Ext.getBody(),

bodyPadding: 5,

frame : true,

height:100,

width:270,

defaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 70,//标签宽度

width : 200,//字段宽度

labelAlign : 'left'//标签对齐方式

},

items:[{

xtype : 'combo',

listConfig : {

emptyText : '未找到匹配值',//当值不在列表是的提示信息

maxHeight : 60//设置下拉列表的最大高度为60像素

},

name:'post',

autoSelect : true,

fieldLabel:'邮政编码',

triggerAction: 'all',//单击触发按钮显示全部数据

store : postStore,//设置数据源

displayField:'province',//定义要显示的字段

valueField:'post',//定义值字段

queryMode: 'local',//本地模式

forceSelection : true,//要求输入值必须在列表中存在

typeAhead : true,//允许自动选择匹配的剩余部分文本

value:'102600'//默认选择大兴

}]

});



8 如果是远程AJAX方式

Ext.onReady(function(){

//创建数据模型

Ext.regModel('BookInfo', {

fields: [{name: 'bookName'}]

});

//定义组合框中显示的数据源

var bookStore = Ext.create('Ext.data.Store',{

model : 'BookInfo',

proxy: {

type: 'ajax',//Ext.data.AjaxProxy

url : 'bookSearchServer.jsp',

reader: new Ext.data.ArrayReader({model : 'BookInfo'})

}

});


。。。。。。。。。。。。。。。。。。。。

items:[{

xtype : 'combo',

fieldLabel:'书籍列表',

listConfig : {

loadingText : '正在加载书籍信息',//加载数据时显示的提示信息

emptyText : '未找到匹配值',//当值不在列表是的提示信息

maxHeight : 100//设置下拉列表的最大高度为60像素

},

allQuery:'allbook',//查询全部信息的查询字符串

minChars : 3,//下拉列表框自动选择前用户需要输入的最小字符数量

queryDelay : 300,//查询延迟时间

queryParam : 'searchbook',//查询的名字

triggerAction: 'all',//单击触发按钮显示全部数据

store : bookStore,//设置数据源

displayField:'bookName',//定义要显示的字段

valueField:'bookName',//定义值字段

queryMode: 'remote'//远程模式

}]


9 时间框

Ext.onReady(function(){

Ext.QuickTips.init();

Ext.create('Ext.form.Panel',{

title:'Ext.form.field.Time示例',

renderTo: Ext.getBody(),

bodyPadding: 5,

frame : true,

height:100,

width:300,

items:[{

fieldLabel:'时间选择框',

xtype : 'timefield',

width : 220,

labelSeparator :':',//分隔符

msgTarget :'side',//在字段的右边显示一个提示信息

autoFitErrors : false,//展示错误信息时是否自动调整字段组件宽度

maxValue : '18:00',//最大时间

maxText : '时间应小于{0}',//大于最大时间的提示信息

minValue : '10:00',//最小时间

minText : '时间应大于{0}',//小于最小时间的提示信息

pickerMaxHeight : 70,//下拉列表的最大高度

increment : 60,//时间间隔为60分钟

format : 'G时i分s秒 ',//G标示为24时计时法

invalidText :'时间格式无效'

}]

});

});


10 日期框

Ext.create('Ext.form.Panel',{

title:'Ext.form.field.Date示例',

frame : true,

height:100,

width:300,

renderTo: Ext.getBody(),

bodyPadding: 5,

items:[{

fieldLabel:'日期选择框',

xtype : 'datefield',

labelSeparator :':',//分隔符

msgTarget :'side',//在字段的右边显示一个提示信息

autoFitErrors : false,//展示错误信息时是否自动调整字段组件宽度

format:'Y年m月d日',//显示日期的格式

maxValue :'12/31/2008',//允许选择的最大日期

minValue :'01/01/2008',//允许选择的最小日期

disabledDates : ['2008年03月12日'],//禁止选择2008年03月12日

disabledDatesText :'禁止选择该日期',

disabledDays : [0,6],//禁止选择星期日和星期六

disabledDaysText : '禁止选择该日期',

width : 220,

value : '12/31/2008'

}]

});


//其中注意disableddates的日期格式要与formatdate的日期格式一样



11 隐藏hidden域

items:[{

name:'userName',

fieldLabel:'姓名'

},{//隐藏域

name:'age',

xtype : 'hidden'

}


12 ext.form.fieldcontainer容器字段

将多个字段框合在一起,比如生产日期xxx年XXX月XXX日,三个文本框一起验证

Ext.QuickTips.init();//初始化提示

Ext.create('Ext.form.Panel',{

title:'Ext.form.FieldContainer示例',

width : 300,

frame : true,

renderTo: Ext.getBody(),

bodyPadding: 5,

fieldDefaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 60,//标签宽度

width : 260,//字段宽度

msgTarget : 'side'

},

defaultType: 'textfield',//设置表单字段的默认类型

items:[{

fieldLabel:'商品名称'

},{

xtype: 'fieldcontainer',

fieldLabel: '生产日期',

layout: {//设置容器字段布局

type: 'hbox',

align: 'middle'//垂直居中

},

combineErrors : true,//合并展示错误信息

fieldDefaults: {

hideLabel: true,//隐藏字段标签

allowBlank : false//设置字段值不允许为空

},

defaultType: 'textfield',//设置表单字段的默认类型

items: [{

fieldLabel: '年',

flex: 1,

inputId : 'yearId'

},{

xtype: 'label',

forId : 'yearId',

text: '年'

},{

fieldLabel: '月',

flex: 1,

inputId : 'monthId'

},{

xtype: 'label',

forId : 'monthId',

text: '月'

},{

fieldLabel: '日',

flex: 1,

inputId : 'dayId'

},{

xtype: 'label',

forId : 'dayId',

text: '日'

}]

},{

fieldLabel:'产地来源'

}]

});


13 上传表单

var uploadForm = Ext.create('Ext.form.Panel',{

title:'Ext.form.field.File示例',

bodyStyle:'padding:5 5 5 5',//表单边距

frame : true,

height:100,

width:300,

renderTo :'form',

defaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 50,//标签宽度

width : 150,//字段宽度

allowBlank : false,//是否允许为空

labelAlign : 'left',//标签对齐方式

msgTarget :'side' //在字段的右边显示一个提示信息

},

items:[{

xtype: 'filefield',

name: 'photo',

fieldLabel: '照片',

anchor: '100%',

buttonText: '选择照片...'

}],

buttons: [{

text: '上传文件',

handler: function() {

var form = uploadForm.getForm();

if(form.isValid()){

form.submit({

url: 'uploadServer.jsp',

waitMsg: '正在上传照片文件请稍候...',

success: function(fp, o) {

Ext.Msg.alert('提示信息', '您的照片文件 "' + o.result.file + '"已经成功上传。');

}

});

}

}

}]

});



14 自定义VTYPE验证

Ext.onReady(function(){

//自定义电话号码的vtype验证

Ext.apply(Ext.form.field.VTypes, {

phone: function(v) {

//规则区号(3-4位数字)-电话号码(7-8位数字)

return /^(\d{3}-|\d{4}-)?(\d{8}|\d{7})$/.test(v);

},

phoneText: '请输入有效的电话号码',

phoneMask: /[\d-]/i//只允许输入数字和-号

});

Ext.QuickTips.init();

Ext.create('Ext.form.Panel',{

title:'自定义电话号码验证示例',

width : 300,

frame : true,

renderTo: Ext.getBody(),

bodyPadding: 5,

defaultType: 'textfield',//设置表单字段的默认类型

fieldDefaults:{//统一设置表单字段默认属性

labelSeparator :':',//分隔符

labelWidth : 80,//标签宽度

width : 270,//字段宽度

msgTarget : 'side'

},

items:[{

fieldLabel:'住宅号码',

vtype:'phone'//使用电话类型验证

},{

fieldLabel:'办公号码',

vtype:'phone'//使用电话类型验证

}]

});

});


15 多字段验证扩展

比如验证多个日期字段

Ext.onReady(function(){

//自定义VType类型,验证日期选择范围

Ext.apply(Ext.form.field.VTypes, {

//验证方法

dateRange : function(val, field) {

var beginDate = null,//开始日期

beginDateCmp = null,//开始日期组件

endDate = null,//结束日期

endDateCmp = null,//结束日期组件

validStatus = true;//验证状态

if(field.dateRange){

//获取开始时间

if(!Ext.isEmpty(field.dateRange.begin)){

beginDateCmp = Ext.getCmp(field.dateRange.begin);

beginDate = beginDateCmp.getValue();

}

//获取结束时间

if(!Ext.isEmpty(field.dateRange.end)){

endDateCmp = Ext.getCmp(field.dateRange.end);

endDate = endDateCmp.getValue();

}

}

//如果开始日期或结束日期有一个为空则校验通过

if(!Ext.isEmpty(beginDate) && !Ext.isEmpty(endDate)){

validStatus = beginDate <= endDate;

}


return validStatus;

},

//验证提示信息

dateRangeText : '开始日期不能大于结束日期,请重新选择。'

});

Ext.QuickTips.init();//初始化提示;

var dateForm = Ext.create('Ext.form.Panel',{

title:'自定义日期范围验证示例',

frame : true,

width:250,

renderTo: Ext.getBody(),

bodyPadding: 5,

fieldDefaults:{//统一设置表单字段默认属性

autoFitErrors : false,//不自动调整字段宽度

labelSeparator :':',//分隔符

labelWidth : 90,//标签宽度

width : 210,//字段宽度

format:'Y年n月j日',//显示日期的格式

editable : false,//设置只读

allowBlank : false,//不允许为空

msgTarget : 'side'//设置提示信息展示位置

},

defaultType: 'datefield',//设置表单字段的默认类型

items:[{

id:'beginDate1',

fieldLabel:'入学开始日期',

dateRange:{begin:'beginDate1',end:'endDate1'},//用于vtype类型dateRange

vtype:'dateRange'

},{

id:'endDate1',

fieldLabel:'入学结束日期',

dateRange:{begin:'beginDate1',end:'endDate1'},//用于vtype类型dateRange

vtype:'dateRange'

},{

id:'beginDate2',

fieldLabel:'毕业开始日期',

dateRange:{begin:'beginDate2',end:'endDate2'},//用于vtype类型dateRange

vtype:'dateRange'

},{

id:'endDate2',

fieldLabel:'毕业结束日期',

dateRange:{begin:'beginDate2',end:'endDate2'},//用于vtype类型dateRange

vtype:'dateRange'

}]

});

});


16 表单

1)同步加载表单(跟服务端沟通)

//表单加载数据的回调函数

function loadIntroduction(){

var params = productForm.getForm().getValues();

productForm.getForm().load({

params : params,//传递参数

url : 'productServer.jsp',//请求的url地址

method:'GET',//请求方式

success:function(form,action){//加载成功的处理函数

Ext.Msg.alert('提示','产品简介加载成功');

},

failure:function(form,action){//加载失败的处理函数

Ext.Msg.alert('提示','产品简介加载失败<br>失败原因:'+action.result.errorMessage);

}

});



2)AJAX

function login(){//提交表单

loginForm.getForm().submit({

clientValidation:true,//进行客户端验证

url : 'loginServer.jsp',//请求的url地址

method:'GET',//请求方式

success:function(form,action){//加载成功的处理函数

Ext.Msg.alert('提示','系统登陆成功');

},

failure:function(form,action){//加载失败的处理函数

Ext.Msg.alert('提示','系统登陆失败,原因:'+action.failureType);

}

});