第一章:Ext.js基础
好书推荐
- Javascript设计模式
- 征服ajax web 2.0开发技术详解
简介
- 基础要求
- 了解HTML、CSS、熟练JS、JS的OOP、AJAX
- JSP/PHP/ASP熟悉其中之一
- 学习方法
- 书籍: 官网推荐的书籍
- 网络: 官方网站,文档API,开源论坛
- 勤奋: 多思考,多实践,多练习,多总结
- 总结: 猜、查、试
- 源码下载、目录介绍、开发环境搭建、开发工具安装配置
- 官网
- spket1.6.18下载和安装
- 引入bootstrap.js、ext-all.css文件、自定义js文件
- bootstrap.js会自动加载js文件
- 开发环境:加载ext-all-debug.js
- 生产环境:加载ext-all.js文件(小1M左右)
- bootstrap.js会自动加载js文件
- 常用术语
- 面板Panel、布局Layout、组件Component、渲染Render
- ext.js对原生JS的扩展
- Array
- Object
- 弹出框
- JS弹出框会阻碍代码继续执行
- ext.js弹出框是模拟实现的
新特性
- 原生js类的声明和对象的创建
- 类其实就是一个function
- 对象:用类名.属性 || 类名[属性]来访问
- 老版本Ext创建windows对象
- 直接new Ext.类名({属性});
new Ext.window.Window({ 属性名:值 });
- 直接new Ext.类名({属性});
- 新版本用create创建windows对象 (推荐)
Ext.create('类名',{ 属性名:值 });
- define自定义类并集成(extend)window
- 自定义Ext.define(‘自定义类名’,{});然后用Ext.create(‘自定义类名’,{}).show();初始化
Ext.define('自定义类名',{ 属性包括extend:'类名' }); Ext.create('自定义类名',{ 属性名:值 }).show();
- 自定义Ext.define(‘自定义类名’,{});然后用Ext.create(‘自定义类名’,{}).show();初始化
- js的异步加载requires
- 为了使自定义组件干净强健,一般会以单独的js文件方式引入,但加载时浪费带宽
- 先在该页面js文件中指定命名空间(预加载)
Ext.Loader.setConfig({ enable:true, paths:{myApp:'code/ux'} });
- 创建组件时指定对应的js文件名
Ext.create('对应的js文件名',{ 属性名:值 }).show();
- 自动的get和set:config
- 在自定义组件时,属性中添加config项
Ext.define('自定义类名',{ 属性包括extend:'类名', config:{ 属性名:值 } });
- 初始化对象时通过:初始化对象名.get属性名();直接使用
- 在自定义组件时,属性中添加config项
- 类的混合mixins
- 为了解决类的多继承问题
- extend只能继承一个类
- mixins可以继承多个类
Ext.define('A类',{ A方法:function(){} }); Ext.define('B类',{ extend:'类名',//extend只能继承一个类 B方法:function(){}, mixins:{ A类:'A类'//可以继承多个类 } }); 初始化B类对象,B类对象名.A方法();实现继承
- 为了解决类的多继承问题
数据模型 model
extjs4.0中的mode相当于DB中的table或java中的Class
- 主要分3部分
- model、proxy、store
- Molde创建
- 创建model模型
- 利用Ext.define创建模型类
Ext.define("user",{ extend:"Ext.data.Model", fields:[{name:'name',type:'auto'},{name:'age',type:'int'}] });
- 利用Ext.regModel创建模型(不用写extend继承)
Ext.regModel("user",{ fields:[{name:'name',type:'auto'},{name:'age',type:'int'}] });
- 利用Ext.define创建模型类
- 实例化model(3种实例化方法)
- new关键字
var p = new user({name:'uspcat.com',age:26}); alert(p.get('name'));
- create方式
var p = Ext.create("user",{name:'uspcat.com',age:26}); alert(p.get('name'));
- ModelMgr.create方式
var p = Ext.ModelMgr.create({name:'uspcat.com',age:26},'user'); alert(p.get('name')); alert(user.getName());
- new关键字
- Validations(自定义验证器)
扩展验证 Ext.apply(Ext.data.validations,{ age:function(config, value){ var min = config.min; //获取最小值 var max = config.max; //获取最大值 if(min <= value && value<=max){ return true; }else{ this.ageMessage = this.ageMessage+"年龄范围应为["+min+"~"+max+"]"; return false; } }, ageMessage:'age数据错误' //错误提示消息 }); 定义含验证的类 Ext.define("person",{ extend:"Ext.data.Model", fields:[ {name:'name',type:'auto'}, {name:'age',type:'int'} ], validations:[ {type:"length",field:"name",min:2,max:6}, {type:'age',field:"age",min:0,max:150} ] }); 实例化类 var p1 = Ext.create("person",{name:'uspcat.com',age:-26}); var errors = p1.validate(); //对验证项进行验证 var errorInfo = []; //定义数组存储错误信息 errors.each(function(v){ errorInfo.push(v.field+" "+v.message); }); alert(errorInfo.join("\n"));
- 创建model模型
- 数据代理proxy
- proxy用于完成数据的CRUD(增、删、改、查)
Ext.define("person",{ extend:"Ext.data.Model", fields:[ {name:'name',type:'auto'}, {name:'age',type:'int'} ], proxy:{ type:'ajax', url:'person.jsp' } }); var p = Ext.ModelManager.getModel("person"); //得到person模型 p.load(1, { scope: this, failure: function(record, operation) { }, success: function(record, operation) {alert(record.data.name)}, callback: function(record, operation) { } });
- proxy用于完成数据的CRUD(增、删、改、查)
- Molde的一对多和多对一
- teacher 1=>n student
老师类 Ext.regModel("teacher",{ fideld:[ {name:'teacherId',type:"int"}, {name:'name',type:"auto"} ], hasMany:{ //一对多 model: 'student', name : 'getStudent', filterProperty: 'teacher_Id' //过滤属性,相当于student表的外键 } }); 学生类 Ext.regModel("student",{ fideld:[ {name:'studentId',type:"int"}, {name:'name',type:"auto"}, {name:"teacher_Id",type:'int'} ] }); teacher类.students 得到子类的一个store数据集合(student要加s)
- teacher 1=>n student
数据代理 proxy
数据代理(proxy)是进行数据读写的主要途径,通过代理操作数据进行CRUD(增、删、改、查)
- 每一步操作都会得到唯一的Ext.data.Operation实例,包含了所有的请求参数
- proxy目录结构
- Ext.data.proxy.Proxy 代理类的根类,分客户端(Client)和服务器(Server)代理
- Ext.data.proxy.Client 客户端代理
- Ext.data.proxy.Memory 普通的内存代理 ----[重点]
Ext.regModel("user",{ fields:[ {name:'name',type:'string'}, {anem:'age',type:'int'} ] }); var userData = [{name:'uspcat.com',age:1}]; //不用create方法 我们直接用proxy来创建对象数据 //创建model的代理类 var memoryProxy = Ext.create("Ext.data.proxy.Memory",{ data:userData, model:'user' }) //update userData.push({name:'new uspcat.com',age:1}); memoryProxy.update(new Ext.data.Operation({ action:'update', //响应事件为update data:userData }),function(result){},this); //CRUD memoryProxy.read(new Ext.data.Operation(),function(result){ var datas = result.resultSet.records; Ext.Array.each(datas,function(model){ alert(model.get('name')); }) });
- Ext.data.proxy.WebStorage 浏览器客户端存储代理
- Ext.data.proxy.SessionStorage 浏览器级别代理----[重点]
- 适合网吧模式,关闭浏览器时清除所有用户信息
- Ext.data.proxy.LocalStorage 本地化的级别代理(不能跨浏览器
)----[重点]- 适合家庭电脑模式,为用户保存信息和操作习惯
Ext.regModel("user",{ fields:[{name:'name',type:'string'}], proxy:{ //相当于Cookies,浏览器级别代理:type:'sessionstorage', type:'localstorage', id : 'twitter-Searches' //全局 } }); //用store来初始化数据 var store = new Ext.data.Store({model:user}); store.add({name:'uspcat.com'}); store.sync(); //保存 store.load(); //加载 var msg = []; store.each(function(rec){ msg.push(rec.get('name')); }); alert(msg.join("\n")); //每次刷新都会加1条,不能跨浏览器
- 适合家庭电脑模式,为用户保存信息和操作习惯
- Ext.data.proxy.SessionStorage 浏览器级别代理----[重点]
- Ext.data.proxy.Memory 普通的内存代理 ----[重点]
- Ext.data.proxy.Server 服务器端代理
- Ext.data.proxy.Ajax 异步加载的方式----[重点]
- Ext.data.proxy.Rest 一种特殊的Ajax
Ext.regModel("person",{ fields:[{name:'name',type:'string'}] }); var ajaxProxy = new Ext.data.proxy.Ajax({ url:'person.jsp', model:'person', reader:'json', limitParam : 'indexLimit' //默认为limit,修改为indexLimit }); ajaxProxy.doRequest(new Ext.data.Operation({ action:'read', limit:10, //分页 start :1, sorters:[ new Ext.util.Sorter({ property:'name', //排序字段 direction:'ASC' }) ] }),function(o){ var text = o.response.responseText; alert(Ext.JSON.decode(text)['name']); });
- Ext.data.proxy.Rest 一种特殊的Ajax
- Ext.data.proxy.JsonP 跨域交互的代理----[重点]
- 跨域有严重的安全隐患,extjs的跨域也需要服务器端做相应的配合
Ext.regModel("person",{ fields:[{name:'name',type:'string'}], proxy:{ type:'jsonp', url:'http://www.uspcat.com/extjs/person.php' } }); var person = Ext.ModelManager.getModel('person'); person.load(1,{ scope:this, //作用域 success:function(model){ alert(model.get('name')); } });
- 跨域有严重的安全隐患,extjs的跨域也需要服务器端做相应的配合
- Ext.data.proxy.Direct 命令
- Ext.data.proxy.Ajax 异步加载的方式----[重点]
- Ext.data.proxy.Client 客户端代理
- Ext.data.proxy.Proxy 代理类的根类,分客户端(Client)和服务器(Server)代理
- REST解释
- REST指Representational State Transfer (或”ReST”) 表述性状态转移
- 无状态、客户端-服务器、具有缓存机制的通信协议(实际使用HTTP协议)
- RESTful应用使用HTTP请求来POST数据(创建/更新/读取数据)如进行查询、删除
数据- REST使用HTTP来进行CRUD(Create/Read/Update/Delete)操作
- REST指Representational State Transfer (或”ReST”) 表述性状态转移
数据读写器
Reader
主要用于将proxy数据代理读取的数据按照不同的规则进行解析,将解析好的数据
保存到Modle中
- 结构图
- Ext.data.reader.Reader 读取器的根类
- Ext.data.reader.Json JSON格式的读取器
var userData = { //total : 200, count:250, user:[{auditor:'yunfengcheng',info:{ //auditor审核员 userID:'1', name:'uspcat.com', orders:[ {id:'001',name:'pen'}, {id:'002',name:'book'} ] }}] }; model Ext.regModel("user",{ fields:[ {name:'userID',type:'string'}, {name:'name',type:'string'} ], hasMany: {model: 'order'} }); Ext.regModel("order",{ fields:[ {name:'id',type:'string'}, {name:'name',type:'string'} ], belongsTo: {type: 'belongsTo', model: 'user'} //order关联user }); var mproxy = Ext.create("Ext.data.proxy.Memory",{ model:'user', data:userData, reader:{ type:'json', root:'user', implicitIncludes:true, //是否级联读取 totalProperty:'count', //指定total属性名为count //服务器返回的数据可能很负载,用record可以筛选出有用的数据信息,装在Model中 record : 'info' //有效信息 } }); mproxy.read(new Ext.data.Operation(),function(result){ var datas = result.resultSet.records; //这里返回数组 //alert(result.resultSet.total); Ext.Array.each(datas,function(model){ alert(model.get('name')); }); var user = result.resultSet.records[0]; var orders = user.orders(); //这里返回对象 orders.each(function(order){ alert(order.get('name')) }); })
- Ext.data.reader.Array 扩展JSON的Array读取器
Ext.regModel("person",{ fields:[ 'name','age' //简写形式,缺点:无法加其余配置 // {name:'name'}, // {name:'age'} ], proxy :{ type:'ajax', url:'person.jsp', reader:{ type:'array' } } }); var person = Ext.ModelManager.getModel('person'); person.load(1,{ success:function(model){ alert(model.get('name')); } }) 对应的person.jsp文件代码 <%@page language="java" contentType="text/html" pageEncoding="UTF-8"%> <% response.getWriter().write("[['yunfengcheng',26]]"); %>
- Ext.data.reader.Array 扩展JSON的Array读取器
- Ext.data.reader.Xml XML格式的读取器
Ext.regModel("user",{ fields:[ {name:'name'}, {name:'id'} ], proxy:{ type:'ajax', url:'users.xml', reader:{ type:'xml', record:'user' //有效信息 } } }); var user = Ext.ModelManager.getModel('user'); user.load(1,{ //调用Model的load方法 success:function(model){ alert(model.get('id')) } }) 对应的users.xml文件代码 <users> <user> <name>uspcat.com</name> <id>00101</id> </user> </users>
- Ext.data.reader.Json JSON格式的读取器
- Ext.data.reader.Reader 读取器的根类
Writer
- 结构图
- Ext.data.writer.Writer
- Ext.data.writer.Json 对象被解释成JSON的形式传到后台
- Ext.data.writer.Xml 对象被解释成XML的形式传到后台
Ext.regModel("person",{ fields:[ 'name','age' ], proxy :{ type:'ajax', url:'person.jsp', writer:{ //type:'json' type:'xml' } } }); Ext.ModelMgr.create({ //初始化传值 name:'uspcat.con', age:1 },'person').save(); //调用save方法将数据传递到后台
- Ext.data.writer.Writer
数据集 store
store是一个存储数据对象Model的集合缓存,可以为extjs的可视化组建提供数据(GridPanel,ComboBox)等
类结构
- Ext.data.AbstractStore
- Ext.data.Store 没有特殊情况这个类就可以满足日常开发了
- Ext.data.ArrayStore
- Ext.data.ArrayStore 内置辅助的类
- Ext.data.JsonStroe 内置辅助的类
var s = new Ext.data.Store({ fields:[ {name:'name'}, {name:'age'} ], proxy:{ type:'ajax', url:'person.jsp' } //autoLoad:true //直接遍历数据时由于阻塞机制,可能加载的数据为空 }); s.load(function(records, operation, success){ Ext.Array.each(records,function(model){ //alert(model.get('name')); }); s.filter('name',"yfc"); //过滤掉其他数据,保留这条 s.each(function(model){ alert(model.get('name')); }); var index = s.find('name','yfc',0,false,true,false); alert(index); }); 对应的person.jsp文件代码 <%@page language="java" contentType="text/html" pageEncoding="UTF-8"%> <% response.getWriter().write("[{name:'uspcat.com',age:1},{name:'yfc',age:26}]"); %>
- Ext.data.TreeStore
- Ext.data.Store 没有特殊情况这个类就可以满足日常开发了
- Ext.data.Store 使用
- 参数
- autoLoad(Boolean/Object) : 自动加载数据,自动调用load
- 使用ajax代理方式时用load方法执行数据加载(防止阻塞时加载数据为空),用data时用autoLoad配置
- data(Array) : 内置数据对象的数组,初始化时就会被装载
- model(Model): 数据集合相关的模型
- fields(Field):字段的集合,程序会自动生成对应的Model
- 方法
- each( Function f, [Object scope] ) : void 遍历数据中的Model
事件机制
- 事件的3种绑定方式
- HTML/DHTML
function hello(){ alert("事件绑定"); } <input type="button" id="btn" value="事件绑定" onClick="hello()">
- DOM
if(Ext.isIE){ document.getElementById("btn").attachEvent("onclick",function(){ alert("事件绑定"); }); }else{ document.getElementById("btn").addEventListener("click",function(){ alert("事件绑定"); }); }
- Extjs
Ext.get('btn').on("click",function(){ alert("事件绑定"); })
- HTML/DHTML
- Ext.util.Observable 事件的基类
- 为所有支持事件机制的extjs组件提供事件支持
- 创建的新组件需要事件支持就继承他
- 事件分类
- 标准事件
- 键盘按键,鼠标的单击、双击、滑过、拖动
- 业务事件
- 面板收起、组件被销毁时、每个对象的属数值不为空时
- 标准事件
- 自定义事件案例
- 没有用到事件处理的场景
- 母亲问孩子饿不饿–>孩子饿了(给一瓶牛奶)|不饿(不给)
- 用了事件的场景
- 母亲给孩子一瓶牛奶–>孩子拿到牛奶感觉饿了就喝不饿就不喝
- 角色功能分析:
- 孩子:应该有自己能拿到牛奶判断饿不饿的方法,当母亲给他牛奶时调用这个方法,孩子要有一个业务事件时刻监听母亲什么时候给牛奶
- 母亲:调用孩子拿牛奶的方法传入一瓶牛奶
Ext.define("children",{ extend:'Ext.util.Observable', constructor:function(){ this.state = "hungry", //目前状态 this.getMilk = function(milk){ this.fireEvent('hungry',milk); //触发事件 }, this.addEvents({'hungry':true}), //添加事件 this.addListener("hungry",function(milk){ //注册事件 if(this.state == 'hungry'){ this.drink(milk); }else{ alert("不饿"); } }), this.drink = function(milk){ alert("喝掉牛奶: "+milk); } } }); var children = Ext.create("children",{}); //本对象牛奶过敏 Ext.util.Observable.capture(children,function(eventName){ //阻止事件 if(eventName == "hungry"){ alert('这个孩子牛奶过敏'); return false; }else{ return true; } }) //母亲调用孩子的接受牛奶的方法 children.getMilk("三鹿");
- 没有用到事件处理的场景
- 为所有支持事件机制的extjs组件提供事件支持
- relayEvents 事件的分发和传播(控制实现事件在不同组件或对象内的传播)
- 如孩子去医院,老爸要带着去
//父亲类没有声明过任何监听事件 Ext.define("father",{ extend:'Ext.util.Observable', constructor:function(config){ this.listeners = config.listeners; this.superclass.constructor.call(this,config); } }); var father = Ext.create("father",{}); father.relayEvents(children,['hungry']); father.on("hungry",function(){ alert("送孩子去医院"); });
- 如孩子去医院,老爸要带着去
- addManagedListener 受管制的监听
- 由调用的组件管理,当组件执行销毁命令时所有被组件管制的事件全部销毁
var tbar = Ext.create('Ext.toolbar.Toolbar',{ renderTo:Ext.getBody(), width:500, items:[ {xtype:'button',id:'create',text:'create'}, {xtype:'button',id:'delete',text:'delete'}, {xtype:'button',text:'销毁删除按钮',handler:function(){ var c = Ext.getCmp("delete"); //getCmp('id');根据组件ID得到组件 if(c){ c.destroy(); } }} ] }); var deleteB = Ext.getCmp("delete"); deleteB.addManagedListener(Ext.getCmp("create"),'click',function(){ alert('添加操作'); }); //Ext.getCmp("create").on("click",function(){});类似
- 由调用的组件管理,当组件执行销毁命令时所有被组件管制的事件全部销毁
- 事件对象Ext.EventObject
- 可以通过e判断键盘按键、功能键、按下位置等等
Ext.get("btn")on("click",function(e){ alert(e.getPageX()) });
- 可以通过e判断键盘按键、功能键、按下位置等等
- 事件管理器Ext.EventManager
- 可以更方便的为页面元素绑定事件处理函数
- 方法:addListener 为元素增减事件
Ext.EventManager.addListener("btn",'click',function(){ alert("通过事件管理器进行事件的监听注册"); })
ajax
Ext.Ajax是Ext.data.Connection的一个子类,提供了用简单方式进行Ajax的功能实现
- 主要方法
- abort : 终止一个没有完成的Ajax请求
- isLoading : 判断指定的Ajax请求是否正在运行
- paresStatus : 返回请求响应的代码
- request : 发送服务器请求(重点)
Ext.get('btn').on("click",function(){ Ext.Ajax.request({ url : 'person.jsp', params:{id:'01'}, method : 'POST', timeout :3000, form:"myform", // 表单的id success :function(response , options){ alert(eval(response.responseText)[0].name); }, failure :function(response , options){ alert(response.responseText+" "+options) } }); }) 对应的html文件代码 <form id="myform"> Name:<input type="text" name="name"><br> Pass:<input type="password" name="pass"><br> <input type="button" value="login" id="btn"> </form> 对应的person.jsp文件代码 <%@page language="java" contentType="text/html" pageEncoding="UTF-8"%> <% String id = request.getParameter("id"); if("01".equals(id)){ response.getWriter().write("[{id:'01',name:'happy','age':26,email:'2018@126.com'}]"); } %>
- jsonData方式向后台传输数据(不常用,传参数足够)
var data = "{id:'01',name:'happy','age':26,email:'happy@126.com'}"; Ext.Ajax.request({ url : 'person.jsp', method : 'POST', timeout :3000, jsonData:data, success :function(response , options){ alert(eval(response.responseText)[0].name); }, failure :function(response , options){ alert(response.responseText+" "+options) } });
- Ext.ElementLoader 方便重构页面
- load方法
Ext.get('btn').on("click",function(){ var time = Ext.get("time").getLoader(); // time为ID time.load({ url:'/extjs/extjs!getTime.action', renderer:function(loader,response,request){ // 请求成功时执行 var time = response.responseText; Ext.getDom("time").value = time; } }); })
- startAutoRefresh 方法
Ext.get('btn').on("click",function(){ var count = Ext.get('count').getLoader(); count.startAutoRefresh(1000,{ // 每隔一秒执行一次 url:'/extjs/extjs!getI.action', renderer:function(loader,response,request){ var count = response.responseText; Ext.getDom("count").value = count; } }); })
- load方法
- 多级联动菜单
定义创建option的方法 function createChild(value,name){ var el = document.createElement("option"); el.setAttribute("value",value); el.appendChild(document.createTextNode(name)); return el; } //var data = {}; // 常用的数据尽量采用缓存机制 Ext.onReady(function(){ //1.得到city这个dom对象 var cityObj = Ext.get("city"); //2.我们为这个city对象注册一个change cityObj.on("change",function(e,select){ //3.得到改变后的数值 var ids = select.options[select.selectedIndex].value; //3.1 先去前台缓存变量中查数据,当没有时再去后台拿 if(data["city"]){ //直接操作 }else{ //做ajax请求 } //4.ajax请求后台数据 Ext.Ajax.request({ url:'/extjs/extjs!menu.action', params:{ids:ids}, // 根据ids返回对应的地区 method:'post', timeout:4000, success:function(response,opts){ var obj = eval(response.responseText); //eval将字符串转换成对象 //5.得到地区的那个对象area DOM var oldObj = Ext.get("area").dom; //6.清除里面项 while(oldObj.length>0){ oldObj.options.remove(oldObj.length-1); } //7.加入新的项 Ext.Array.each(obj,function(o){ Ext.get('area').dom.appendChild(createChild(o.valueOf(),o.name)); }) //8.把从数据库拿到的数据进行前台页面缓存 } }); }); }); 对应的html文件代码 <select name="city" id="city"> <option value="beij" selected>北京市</option> <option value="tianj">天津市</option> </select> <select name="area" id="area"> <option value="def" selected>-----</option> </select>
Ext类和core包
- Ext.core.Element
- API解释
- 组建和控件的基础
- 对DOM对象的封装(Document Object Model)
- 获取Element
- Ext.core.Element.fly(String/HTMLElement el, [String named] ) : Element
- Ext.get(Mixed el) : Element
- Element 相关方法
- addClsOnClick( String className ) : Ext.core.Element
- addClsOnOver( String className ) : Ext.core.Element
var elDiv = Ext.core.Element.fly("divId"); elDiv.addClsOnOver("className"); //鼠标滑过时增加样式滑出时移除样式
- addKeyMap( Object config ) : Ext.util.KeyMap
var input = Ext.get("inputId"); var fn = function(){ alert("单击B按钮调用这个函数") } input.addKeyMap({key:Ext.EventObject.B,ctrl:false,fn:fn,scope:inputId});
- addKeyListener( Number/Array/Object/String key, Function fn, [Objectscope] ) : Ext.util.KeyMap
inputId.addKeyListener({key:Ext.EventObject.X,ctrl:true},function(){ alert("单击ctrl+x") },inputId);
- appendChild( String/HTMLElement/Array/Element/CompositeElement el ) : Ext.core.Element
function createChild(){ var el = document.createElement("h5"); el.appendChild(document.createTextNode("被追加的h5")); return el; } Ext.get("divId").appendChild(createChild());
- createChild( Object config, [HTMLElement insertBefore], [Boolean returnDom] ) : Ext.core.Element
Ext.getBody().createChild({ tag:'li', id:'item1', html:'子节点' });
- API解释
- Ext.core.DomHelper
- 容易操作页面的HTML和DOM元素
- append( Mixed el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.core.Element 追加孩子
var p = Ext.create("Ext.panel.Panel",{ width:400, height:300, html:"<p id='pId'>hello word</p>", id:'myPanel', title:'my panel', renderTo:"divId" }); Ext.core.DomHelper.append(Ext.get("pId"),"<br><div id='d'>被追加元素</div>");
- 追加兄弟结点
- insertAfter( Mixed el, Object o, [Boolean returnElement] ) :
- insertBefore( Mixed el, Object/String o, [Boolean returnElement] ) :
- applyStyles 添加样式
Ext.core.DomHelper.applyStyles(Ext.get("pId"),"color:red");
- createDom( Object/String o ) : HTMLElement
var html = Ext.core.DomHelper.createDom("<h1>hello</h1>"); alert(html)
- Ext方法
- onReady( Function fn, Object scope, Boolean withDomReady, Object options ) : void
- 在文件和onload加载之后,image加载之前执行
- get()和getCmp( String id ) : void
- get(‘id’);在html中通过id获取元素
- getCmp(‘id’);在组件管理器中通过id获取组件
Ext.create("Ext.panel.Panel",{ width:400, height:300, html:'<p>hello word</p>', id:'mypCmp', title:'my panel', renderTo:"divId" }); var divId = Ext.getCmp("mypCmp"); divId.setTitle("new title");
- select( String/Array selector, [Boolean unique], [HTMLElement/String root] )
- 通过类名获取元素
var el = Ext.select("className"); alert(el);
- 通过类名获取元素
- query( String path, [Node root] ) : Array
- xpath
- 类似XML查询节点的方法(语法 Ext.DomQuery)
var arr = Ext.query("TR TD"); //返回tr下的所有td元素 alert(arr)
- isEmpty( Mixed value, [Boolean allowEmptyString] ) : Boolean
alert(Ext.isEmpty('',true)); //flase默认值 alert(Ext.isEmpty('',false)); //true
- namespace( String namespace1, String namespace2, String etc ) : Object
- 用于分包管理应用
Ext.namespace("App.Model","App.Core"); App.Model.A = { name:'happy' }; App.Core.A = function(){ alert("App.Core.A"); };
- 用于分包管理应用
- each( Array/NodeList/Mixed iterable, Function fn, Object scope, Boolean reverse ) : Boolean
- 遍历数组
var array = [-1,23,4,6,7,8]; Ext.each(array,function(i){ alert(i); })
- 遍历数组
- apply( Object object, Object config, Object defaults ) : Object
- 扩展一个对象
var a = { name:'happy' } Ext.apply(a,{getName:function(){ alert(this.name); }}); a.getName();
- 扩展一个对象
- encode( Mixed o ) : String
- 将一个对象进行编码
var a = { name:'happy' } alert(Ext.encode(a));
- 将一个对象进行编码
- htmlDecode
- 将特殊的html转义符转义成html
Ext.Msg.alert("hello",Ext.htmlDecode("<h1>hel>lo</h1>"));
- 将特殊的html转义符转义成html
- typeOf( Mixed value ) : String
- 过去变量的类型
alert(Ext.typeOf("")); //string alert(Ext.typeOf(function(){})); //function
- 过去变量的类型
- onReady( Function fn, Object scope, Boolean withDomReady, Object options ) : void
Ext.util包
- Ext.util.CSS
- createStyleSheet( String cssText, String id ) : StyleSheet
- 创建一个id为styleId的style标签,并添加样式.className{color:red}
Ext.util.CSS.createStyleSheet(".className{color:red}","styleId"); Ext.get("divId").addClsOnOver("className");
- 创建一个id为styleId的style标签,并添加样式.className{color:red}
- removeStyleSheet( String id ) : void
- 移除样式表
Ext.get("btn").on("click",function(){ Ext.util.CSS.removeStyleSheet("styleId"); });
- 移除样式表
- getRule( String/Array selector, Boolean refreshCache ) : CSSRule
- 获取样式
var cssObj = Ext.util.CSS.getRule(".className",true); alert(cssObj.style.color);
- 获取样式
- updateRule( String/Array selector, String property, String value ) : Boolean
- 更新样式
Ext.get("btn").on("click",function(){ Ext.util.CSS.updateRule(".className","color","#990055"); });
- 更新样式
- swapStyleSheet( String id, String url ) : void
- 切换样式表
var i = 1; Ext.get("btn").on("click",function(){ if(i%2==0){ Ext.util.CSS.swapStyleSheet("linkIdOne","hrefOne.css"); Ext.get("divId").addClsOnOver("className") i++; }else{ Ext.util.CSS.swapStyleSheet("linkIdTwo","hrefTwo.css"); Ext.get("divId").addClsOnOver("className") i++; } })
- 切换样式表
- createStyleSheet( String cssText, String id ) : StyleSheet
- Ext.util.ClickRepeater
- 控制元素指定时间内的单击事件(元素没有失去焦点)
new Ext.util.ClickRepeater(Ext.get("btn"),{ delay:3000, //单击时执行第1次,3秒后执行第2次 interval:4000, //重复调用后每隔4秒执行1次 stopDefault:true, //停止这个el上的默认单击事件 handler:function(){ alert("单击我"); } });
- 控制元素指定时间内的单击事件(元素没有失去焦点)
- Ext.util.DelayedTask 代替setTimeout
var task = new Ext.util.DelayedTask(function(){ alert("waiting..."); }); Ext.get("btn").on("click",function(){ task.delay(4000); task.cancel(); });
- Ext.util.Format 格式化的公共类
- ellipsis() : void
- 从0取指定长度字符进行显示,其余的用…代替
- alert(Ext.util.Format.ellipsis(“www.uspcat.com”,10));
- 从0取指定长度字符进行显示,其余的用…代替
- capitalize( ) : void
- 将str的首字母大写
- alert(Ext.util.Format.capitalize(str));
- 将str的首字母大写
- date( String/Date value, String format ) : String
- alert(Ext.util.Format.date(new Date(),”Y年-m月-d日”));
- substr( String value, Number start, Number length ) : String
- 从指定位置截取指定长度的子串
- alert(Ext.util.Format.substr(str,0,5));
- 从指定位置截取指定长度的子串
- lowercase( String value ) : String
- 字符串转小写
- alert(Ext.util.Format.lowercase(“USPCAT.COM”))
- 字符串转小写
- number( Number v, String format ) : String
- 格式化显示数字
- alert(Ext.util.Format.number(“12344556.7892”,”0,000.00”))
- 格式化显示数字
- nl2br( String str ) : String
- 将字符串中的转义符转成html元素
- alert(Ext.util.Format.nl2br(“asd\n123”))
- 将字符串中的转义符转成html元素
- ellipsis() : void
- Ext.util.MixedCollection 集合类
- add( String key, Object o ) : Object
- 添加单个项
var items = new Ext.util.MixedCollection(); var a = {name:'a'}; var b = {name:'b'}; items.add("01",a); items.add("02",b); alert(items)
- 添加单个项
- addAll( Object/Array objs ) : void
- 添加多个项
var items = new Ext.util.MixedCollection(); var array = []; array.push(a); array.push(b); items.addAll(array);
- 添加多个项
- clear( ) : void
- 清除所有项
- items.clear();
- 清除所有项
- clone( ) : MixedCollection
- 清除所有项
- items = items.clone();
- 清除所有项
- 判断集合中是否有相应的对象
- contains( Object o ) : Boolean
- alert(items.contains(a));
- containsKey( String key ) : Boolean
- alert(items.containsKey(“01”));
- contains( Object o ) : Boolean
- each( Function fn, [Object scope] ) : void
items.each(function(item){ alert(item.name) });
- 从集合中得到单个对象
- get( String/Number key ) : Object
- alert(items.get(“01”).name);
- first( ) : Object
- alert(items.first().name);
- get( String/Number key ) : Object
- 集合相关事件
- add,clear,remove,replace
items.on("add",function(index,o,key ){ alert("集合items有了一个新的成员 : "+key) }); items.add("03",{name:'c'});
- add,clear,remove,replace
- add( String key, Object o ) : Object
- Ext.util.TaskRunner 模拟线程控制
var runner = new Ext.util.TaskRunner(); var task = { run:function(){ Ext.getDom("Id").value = Ext.util.Format.date(new Date(),"Y-m-d-s"); }, interval:1000 } runner.start(task); Ext.get("btn").on("click",function(){ runner.stop(task); })