// JavaScript Document
Ext.namespace('CRM.Panels');
CRM.Panels.UserDetail = Ext.extend(Ext.Panel,{
width:350,
height:120,
data:{
ID: 0,
FirstName: '',
LastName: '',
Email: '',
City: '',
Phone:''
},
split:true,
tpl: new Ext.XTemplate([
'<div>编号:{ID}</div>',
'<div>姓名:{FirstName}-{LastName}</div>',
'<div>电话:{Phone}</div>',
'<div>城市:{City}</div>',
'<div>邮箱:{Email}</div>'
]),
initComponent:function(){
CRM.Panels.UserDetail.superclass.initComponent.call(this);
if(typeof this.tpl === 'string'){
this.tpl = new Ext.XTemplate(this.tpl);
}
this.addEvents('UAlert');//注册新事件
this.addListener({//侦听函数 www.2cto.com
UAlert: { //注册的新事件
fn:this.onAlert,//调用onAlert方法
scope: this
}
});
},
//////////////
onAlert: function(){
alert('注册的新事件');
},
UAlert:function(){
this.fireEvent('UAlert');
},
/////////////////////
onRender: function(ct, position){
CRM.Panels.UserDetail.superclass.onRender.call(this, ct, position);
if(this.data){
this.update(this.data);
}
},
update: function(data){
this.data = data;
this.tpl.overwrite(this.body, this.data);
// this.fireEvent('update',this.data);
}
});
//把新建的自定义组件注册为一种xtype
Ext.reg('UserDetail',CRM.Panels.UserDetail);
/*使用:
items:[
{
region:'west',
xtype:'UserDetail',
data: userData[0],
title:'User Detail'
}
]*/ 在页面上:
<script language="javascript">
var userData = [
{ID:1,FirstName:'Zhang',LastName:'Jinshan',Email:'zjs@qq.com',Phone:'123456',City:'ZhangPing'},
{ID:2,FirstName:'Wang',LastName:'wu',Email:'wjf@qq.com',Phone:'123456',City:'ZhangPing'}
];
Ext.onReady(function(){
var userDetail = new CRM.Panels.UserDetail({
applyTo:'body',
title:'User Detail',
data:userData[0]
});
updateContact = function(event, el, data){
userDetail.update(data.data);//调用更新数据
}
Ext.get('xt').on('click',updateContact,this,{data:userData[1]});
Ext.get('alert').on('click',function(){
userDetail.UAlert();
});
})
</script>
<button id="xt">点击</button>
<button id="alert">注册的新事件</button> ////////////////////////////////// ExtJS中的面向对象设计,组件化编程思想/**
* @author: Lilf
* Description: ExtJS中的面向对象设计,组件化变成思想
*/
/****************************扩展VTypes类,增加年龄的验证****************************/
Ext.apply(Ext.form.VTypes, {
"age": function(_v){
if (/^\d+$/.test(_v)) {
var intExp = parseInt(_v);
if (intExp < 200)
return true;
}
return false;
},
ageText: "请输入正确的年龄格式,如:23"
});
/****************************继承自FormPanel的表单组件,用来构件Window***************************/
PersonInfoFormPanel = Ext.extend(Ext.form.FormPanel, {
constructor: function(){
PersonInfoFormPanel.superclass.constructor.apply(this, [{
baseCls: "x-plain",
buttonAlign: "right",
labelWidth: 30,
defaultType: "textfield",
defaults: {
anchor: "95%",
labelStyle: "text-align:right"
},
items: [{
fieldLabel: "姓名",
name: "name"
}, {
fieldLabel: "年龄",
name: "age",
vtype: "age"//验证年龄(通过vtype类型来验证)
}, {
xtype: "combo",
mode: "local",//本地数据
readOnly: true,
fieldLabel: "性别",
displayField: "sex",//显示下拉框的内容
triggerAction: "all",//在选择时,显示所有的项
value: "男",//默认值
store: new Ext.data.SimpleStore({
fields: ["sex"],
data: [["男"], ["女"]]
}),
name: "sex"//绑定字段
}]
}])
},
//---以下为PersonInfoFormPanel类对外提供的方法---
getValues: function(){
if (this.getForm().isValid())
return new Ext.data.Record(this.getForm().getValues());
else
throw new Error("验证没有通过");//自定义异常
},
setValues: function(_r){
this.getForm().loadRecord(_r);
},
reset: function(){
this.getForm().reset();
}
});
/**************继承自Window的基类,insertWindow与updateWindow都由此继承****************/
baseWindow = Ext.extend(Ext.Window, {
form: null,
constructor: function(){
this.form = new PersonInfoFormPanel();//实例化PersonInfoFormPanel类
baseWindow.superclass.constructor.apply(this, [{
plain: true,
width: 350,
//title: "新增人员",
modal: true,
resizable: false,
closeAction: "hide",
defaults: {
style: "padding:5px"
},
items: this.form,
buttons: [{
text: "确 定",
handler: this.onSubmitClick,//提交事件调用
scope: this
}, {
text: "取 消",
handler: this.onCancelClick,//取消事件调用
scope: this }]
}]);
//给insertWindow对象添加事件(事件冒泡)
this.addEvents("submit");
},
//提交事件处理函数
onSubmitClick: function(){
try {
//发布事件
this.fireEvent("submit", this, this.form.getValues());//调用PersonInfoFormPanel类中自定义的方法getValues
this.close(); }
catch (_err) {
Ext.Msg.alert("系统提示", _err.description);//扑捉自定义错误或异常
}
},
//取消事件处理函数
onCancelClick: function(){
this.close();
},
//重置与隐藏事件处理函数
close: function(){
this.form.reset();
this.hide();
} });
/*******************insertWindow类****************************/
insertWindow = Ext.extend(baseWindow, {
title: "新增人员"
});
/*****************updateWindow类******************************/
updateWindow = Ext.extend(baseWindow, {
title: "修改人员",
load: function(_r){
this.form.setValues(_r);
}
});
/********根据上面组件创建新的GridPanel类,它就像我们根据不同的零件设计出来的汽车************
* ExtJs自定义PersonListGridPanel类
* 该类继承自GridPanel[使用Ext.extend(superClass,override Object)方法实现继承],
* 并override了该类的构造函?hu数
* 构造函数内部继承自GridPanel的构造函数[apply(this,arguments)实现继承]
* 该类实现了如何对外部公布一个事件
* 在构造函数中添加一个事件[this.addEvents("事件名称")]
* 然后使用this.fireEvent("事件名称",参数)来发布此事?件
* 最后在客户端调用的时候来订阅该事?jian件
*/
PersonListGridPanel = Ext.extend(Ext.grid.GridPanel, {
_window: null,
_updateWin: null,
constructor: function(_url){
this._window = new insertWindow();//insertWindow对象引用
this._updateWin = new updateWindow();//updateWindow对象引用
PersonListGridPanel.superclass.constructor.apply(this, [{
renderTo: Ext.getBody(),
width: 550,
height: 200,
frame: true,
layout: "form",
//工具栏
tbar: [{
text: "add",
handler: function(){
this._window.show();
},
scope: this
}, "-", {
text: "update",
handler: function(){
this._updateWin.show();
try {
this._updateWin.load(this.getSelected());
} catch (_err) {
Ext.Msg.alert("系统提示", _err.description);
this._updateWin.close();
}
},
scope: this
}, "-", {
text: "delete",
handler: this.onRemovePerson,
scope: this
}],
enableColumnMove: false,
//列模板
columns: [{
header: "Name",
menuDisabled: true,
dataIndex: "name"
}, {
header: "Age",
menuDisabled: true,
dataIndex: "age"
}, {
header: "Sex",
menuDisabled: true,
dataIndex: "sex"
}],
//数据源
store: new Ext.data.JsonStore({
autoLoad: true,
url: _url,
fields: ["name", "age", "sex"]
}),
//选中模板
selModel: new Ext.grid.RowSelectionModel({
singleSelect: true,
listeners: {
"rowselect": {
fn: this.onRowSelected,
scope: this
}
}
}) }]);
//添加事件
this.addEvents("rowselect");
//事件订阅
this._window.on("submit", this.onInsertWinSubmit, this);
this._updateWin.on("submit", this.onUpdateWinSubmit, this);
},
//----- 以下为自定义方法---------
//获得选中的记录
getSelected: function(){
var _sm = this.getSelectionModel();
if (_sm.getCount() == 0)
throw new Error("你没有选中任何记录,请选择一条记录后重试");
return _sm.getSelected();
},
//插入一条记录
insert: function(_r){
this.getStore().add(_r);
},
//更新选中的记录
update: function(_r){
try {
var _rs = this.getSelected();
var _data = _rs.data;
for (var _i in _data) {
_rs.set(_i, _r.get(_i));
};
_rs.commit();
}
catch (_err) { } },
//删除选中的记录
remove: function(){
try {
var _rs = this.getSelected();
Ext.Msg.confirm("系统提示", "你确定删除吗?", function(_btn){
if (_btn == "yes")
this.getStore().remove(_rs);
}, this);
}
catch (_err) {
Ext.Msg.alert("系统提示", _err.description);
}
},
//-------以下为自定义事件处理函数------------
//添加事件
onInsertWinSubmit: function(_win, _r){
this.insert(_r);
},
//修改事件
onUpdateWinSubmit: function(_win, _r){
this.update(_r);
},
//删除事件
onRemovePerson: function(){
this.remove();
},
//选中事件
onRowSelected: function(_sel, _index, _r){
this.fireEvent("rowselect", _r);//发布事件
}
})
//////////////
如何编写ExtJS自定义控件
// 1、引入命名空间
Ext.namespace("ExtUD.Ext");//相当于java中包的作用
// 2、编写自定义控件类
ExtUD.Ext.UDPanel = Ext.extend(Ext.Panel, {
title : '自定义控件',
html:'自定义控件面板',
layout:'fit',
getAlert:function(){alert('自定义控件函数!');}
});
// 3、注册控件
Ext.reg('udpanel', ExtUD.Ext.UDPanel);//第一个参数为自定义控件的xtype //4、使用自定义控件
Ext.onReady(function() {
var temp = new ExtUD.Ext.UDPanel({
renderTo : document.body
});
temp.show();
temp.getAlert();
});
如何编写ExtJS自定义控件
// 1、引入命名空间
Ext.namespace("ExtUD.Ext");//相当于java中包的作用
// 2、编写自定义控件类
ExtUD.Ext.UDPanel = Ext.extend(Ext.Panel, {
title : '自定义控件',
html:'自定义控件面板',
layout:'fit',
getAlert:function(){alert('自定义控件函数!');}
});
// 3、注册控件
Ext.reg('udpanel', ExtUD.Ext.UDPanel);//第一个参数为自定义控件的xtype //4、使用自定义控件
Ext.onReady(function() {
var temp = new ExtUD.Ext.UDPanel({
renderTo : document.body
});
temp.show();
temp.getAlert();
});
//单文本加单铵钮控件
Ext.Diy.GridCodeName1 = Ext.extend(Ext.Panel, {
winWidth:500,//定义弹出窗体的大小
id:'',//窗体ID
fieldLabel:'',
labelWidth:60,
allowBlank:false,//验证是否可为空
blankText:'This field is required',//空白文本
displayField:'NAME',//值1
valueField:'VALUE',//值2
codeField:'CODE',//值3
oldValue:'',//缓存旧值
autoDoLoad:true,//自动加载
pageSize:10,//页显示行数
remoteSort:true,//是否可排序
showLabel: false,//是否显示label
initComponent:function() {//在这里定义控件样式与弹出窗体样式等,并获得值
//暂存调用页面传下来的参数
var id=this.id;
var tmpNameField=this.displayField;
var tmpValueField=this.valueField;
var tmpCodeField=this.codeField;
var winWidth = this.winWidth;
var pageSize = this.pageSize;
var remoteSort = this.remoteSort;
var tabIndex = -1;//分页
var cm;//列头
if(this.tabIndex!==undefined){
tabIndex = this.tabIndex;
}
if(this.cm!==undefined){
cm = this.cm;
}else{
cm = new Ext.grid.ColumnModel([
new Ext.grid.CheckboxSelectionModel({singleSelect:true}),
{id:tmpValueField,header: "值", width: 0, sortable: false, dataIndex: tmpValueField, hidden:true},
{header: "编码", width: 70, sortable: true, dataIndex: tmpCodeField},
{header: "名称", width: 100, sortable: true, dataIndex: tmpNameField}
]);
} var readerPanel;//定义要读取的列标题
if(this.readerPanel!==undefined){
readerPanel = this.readerPanel;
}else{
readerPanel = new Ext.data.Record.create([
{name: tmpNameField},
{name: tmpValueField},
{name: tmpCodeField}
]);
}
//读取数据
var reader = new Ext.data.XmlReader({
record: 'ROW',
totalRecords: "TOTALCOUNT"
},
readerPanel//把数据保存到溶器中
);
//定义存数据的溶器
var tmpStore = new Ext.data.Store({
url: 'servlet/ajaxservlet',
reader: reader,
remoteSort:remoteSort,
listeners:{
load:function(store,records){
Ext.getCmp(id).fireEvent('afterLoad',store,records);
}
}
}); var valueStore = new Ext.data.Store({
url: 'servlet/ajaxservlet',
reader: reader,
remoteSort:remoteSort,
listeners:{
load:function(store,records){
Ext.getCmp(id).setValueByRecord(records[0]);
}
}
});
//判断排序
if(this.sortInfo!==undefined){
tmpStore.setDefaultSort(this.sortInfo.field,this.sortInfo.direction);
}
this.valueStore = valueStore;
this.store = tmpStore;
if(this.autoDoLoad){
this.doLoad();//加载数据
} //数据获取情况提示信息
var pagingBar = new Ext.PagingToolbar({
displayInfo:true,
emptyMsg:"没有数据显示",
displayMsg:"显示从第{0}条数据到第{1}条数据,共{2}条数据",
store:tmpStore,
pageSize:pageSize
});
//数据加载提示
var grid = new Ext.grid.GridPanel({
store: tmpStore,
loadMask:{msg:'数据加载中...'},
cm: cm,
sm: new Ext.grid.CheckboxSelectionModel({singleSelect:true}),
viewConfig: {
forceFit:true
},
tbar:[{//以下设置查询
xtype:'tbtext',
text:'查询关键字:'
},{
xtype:'textfield',
id:id+'searchItemKey'
},' ',{
xtype:'tbbutton',
text:'查询',
handler:function(){
var tmpSearchKey = Ext.getCmp(id+'searchItemKey').getValue();
Ext.getCmp(id).doSearch(tmpStore,tmpSearchKey,'','');
},
pressed:true
}],
bbar:pagingBar, buttons: [{
text:'确定',
menuAlign:'center',
handler : function(){
var record = grid.getSelectionModel().getSelected();// 返回值为 Record 类型
if(record==null){
//Ext.MessageBox.alert('提示', '请选择一条数据!');
Ext.getCmp(id).clearValue();
Ext.getCmp(id).fireEvent('onChange',null,'','');
win.hide();
return;
}else{
Ext.getCmp(id).setValueByRecord(record);//以value值为索引填充数据到控件文本框
win.hide();
}
}
},{
text:'取消',
menuAlign:'center',
handler : function(){
win.hide();
}
}
], autoWidth: true,
iconCls:'icon-grid'
});
//双击数据行填充数据到控件文本框
grid.on("rowdblclick",function(thisGrid,rowIndex,e){
var record = thisGrid.getStore().getAt(rowIndex);
Ext.getCmp(id).setValueByRecord(record);
win.hide();
});
//定义窗体详细信息
var win = new Ext.Window({
title: '请选择',
width: winWidth,
defaults:{autoHeight: true},
modal: true,
closeAction: 'hide',
bodyStyle: 'padding:10px;',
items:grid
});
//定义窗体显示内容样式
Ext.apply(this,{
border:false,
bodyBorder:false,
items:[{
layout:'column',
border: false,
items:[{
columnWidth:0.9,
labelWidth:this.labelWidth,
layout: 'form',
border: false,
items:[{
xtype:'textfield',
fieldLabel: this.fieldLabel,
anchor:'100%',
id:id+'_code',
readOnly:true,
tabIndex:tabIndex,
listeners:{
specialkey : function(field, e){
if (e.getKey() == Ext.EventObject.ENTER) {
Ext.getCmp(id).setValueByCode(field.getValue());
}
}
}
}]
},{
columnWidth:0.1,
border: false,
items:[{
xtype:'button',
id:id+'_btn',
text:' ',
handler:function(){
if(Ext.getCmp(id).fireEvent("beforeClick")===false){
return;
}
win.show();
win.center();
Ext.getCmp(id).fireEvent("afterClick");
},
pressed:true
}]
}]
},{
xtype:'textfield',
id:id+'_value',
hidden:true
}]
});
//注册控件事件
Ext.Diy.GridCodeName1.superclass.initComponent.apply(this, arguments);
this.addEvents({'onChange':true},{'codeInvalid':true},{'beforeClick':true},{'afterClick':true},{'afterLoad':true});
},
//以下定义控件事件
setLabelDisplay: function(p_showLabel){
this.showLabel=p_showLabel;
if(p_showLabel){
document.getElementByIdx_x(this.id).childNodes[0].style.display="none";
var tmpDiv=document.getElementByIdx_x("mylbl_"+this.id);
if(tmpDiv){
document.getElementByIdx_x("mylbl_"+this.id+"_td").innerHTML=document.getElementByIdx_x(this.id+"_name").value;
tmpDiv.style.display="block";
}else{
tmpDiv = document.createElement_x("div");
tmpDiv.id="mylbl_"+this.id;
tmpDiv.innerHTML="<div style='width:100%;height:25px;' class='diyform-label-div'>"+
"<table width='100%' border='0' cellspacing='0' cellpadding='0'><tr ><td width='"+this.labelWidth+"'>"+this.fieldLabel+
":</td><td id='mylbl_"+this.id+"_td' class='diyform-label-td'>"+
document.getElementByIdx_x(this.id+"_name").value+"</td></tr></table></div>";
tmpDiv.style.width=document.getElementByIdx_x(this.id).style.width;
document.getElementByIdx_x(this.id).appendChild(tmpDiv);
}
}else{
document.getElementByIdx_x(this.id).childNodes[0].style.display="block";
try{document.getElementByIdx_x(this.id).removeChild(document.getElementByIdx_x("mylbl_"+this.id));}catch(ex){}
}
},
doLoad:function(addCon){
if(addCon!==undefined){
this.clearValue();
this.condition=addCon;
}
this.doSearch(this.store,'','','');
},
doSearch:function(store,searchKey,value,code){
var tmpParam=[];
tmpParam.push(searchKey);
tmpParam.push(value);
tmpParam.push(code);
if(this.condition!==undefined){
tmpParam.push(this.condition);
}
var parmObj=createRequestXml(this.classUrl,"GetData",this.method,tmpParam.join(','));
store.baseParams={
requestType: 'requestData4DiyGrid',
requestCharSet:'UTF8',
requestLisence: '1',
requestXml: parmObj
};
var pageSize = this.pageSize;
store.load({params:{start:0, limit:pageSize}});
},
unedit:function(flag){
Ext.getCmp(this.id+"_btn").setDisabled(flag);
Ext.getCmp(this.id+"_code").setDisabled(flag);
},
clearValue:function(){
this.oldValue=Ext.getCmp(this.id+'_value').getValue();
Ext.getCmp(this.id+"_value").setValue('');
Ext.getCmp(this.id+"_code").setValue('');
},
changeValue:function(record,value,oldValue){
if(value!=oldValue){
this.fireEvent('onChange',record,value,oldValue);
}
},
codeInvalid:function(){
this.fireEvent('codeInvalid');
},
setValue:function(value){
if(value==null||value==""){
return;
}
var record;
var i=0,j=this.store.getCount();
for(;i<j;i++){
record = this.store.getAt(i);
if(record.get(this.valueField)==value){
this.setValueByRecord(record);
break;
}
}
if(i==j){
this.doSearch(this.valueStore,'',value,'');
}
},
setDtlValue:function(dtl,ifFireEvent){
this.oldValue=Ext.getCmp(this.id+'_value').getValue();
Ext.getCmp(this.id+"_value").setValue(dtl.value);
Ext.getCmp(this.id+"_code").setValue(dtl.code);
if(ifFireEvent==false){ }else{
this.changeValue(null,dtl.value,this.oldValue);
} },
setValueByCode:function(code){
var record;
var i=0,j=this.store.getCount();
for(;i<j;i++){
record = this.store.getAt(i);
if(record.get(this.codeField)==code){
this.setValueByRecord(record);
break;
}
}
if(i==j){
this.doSearch(this.valueStore,'','',code);
}
},
setValueByRecord:function(record){
if(record!=null){
this.clearValue();
Ext.getCmp(this.id+'_value').setValue(record.get(this.valueField));
Ext.getCmp(this.id+'_code').setValue(record.get(this.codeField));
this.changeValue(record,record.get(this.valueField),this.oldValue);
}else{
if(Ext.getCmp(this.id+'_code').getValue()!=""){
Ext.MessageBox.alert('提示','找不到该信息');
Ext.getCmp(this.id+'_code').focus();
}
this.clearValue();
this.fireEvent('codeInvalid');
}
},
getValue:function(){return Ext.getCmp(this.id+"_value").getValue();}
});
// 4、注册控件
Ext.reg('diygridcodename1', Ext.Diy.GridCodeName1);//第一个参数为自定义控件的xtype 调用方式:
id:'LM_SPEC',
xtype : 'diygridcodename1',//自定义控件 diygridcodename
fieldLabel:'规格',
labelWidth:80,
allowBlank:false,
classUrl:classUrl,
method:'getSpecInfo',
readerPanel:[{name: 'CODE'},{name: 'VALUE'},{name: 'NAME'}],
cm:new Ext.grid.ColumnModel([
new Ext.grid.CheckboxSelectionModel(),
{header: "编号", width:100, sortable: true,dataIndex: 'NAME'},
{header: "规格", width:120,unedit:false, sortable: true,dataIndex: 'CODE'}
]),
listeners:{
onChange:function(p_record,p_value,p_oldValue){
//ifdef = p_record.get("SOM_IFDEFAULT");
},
beforeClick:function(){
if(!checkbaseunit()){
Ext.MessageBox.alert("提示","主要单位不能为空!");
return;
}
}
},
anchor : '98%'//占用总宽度的百份比

  

Extjs 自定义控件的更多相关文章

  1. Ext自定义控件 - 自学ExtJS

    本文所有思想表达均为个人意见,如有疑义请多批评,如有雷同不甚荣幸. 转载请注明出处:Nutk'Z http://www.cnblogs.com/nutkz/p/3448801.html 在用到ExtJ ...

  2. ExtJS in Review - xtype vs. alias

    今天在帮一个兄弟检查一段自定义控件的代码时觉得他对xtype以及alias的使用和ExtJS各示例代码的使用有较多的不一致,而我自己也不是很清楚使用这两个属性时的最佳方法.因此在回家后整理出了这样一篇 ...

  3. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  4. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

  5. ExtJS 4.2 介绍

    本篇介绍ExtJS相关知识,是以ExtJS4.2.1版本为基础进行说明,包括:ExtJS的特点.MVC模式.4.2.1GPL版本资源的下载和说明以及4种主题的演示. 目录 1. 介绍 1.1 说明 1 ...

  6. ExtJS 4.2 第一个程序

    本篇介绍如何创建一个ExtJS应用程序.并通过创建目录.导入文件.编写代码及分析代码等步骤来解释第一个ExtJS程序. 目录 1. 创建程序 1.1 创建目录建议 1.2 实际目录 1.3 index ...

  7. ExtJS 4.2 组件介绍

    目录 1. 介绍 1.1 说明 1.2 组件分类 1.3 组件名称 1.4 组件结构 2. 组件的创建方式 2.1 Ext.create()创建 2.2 xtype创建 1. 介绍 1.1 说明 Ex ...

  8. ExtJS 4.2 组件的查找方式

    组件创建了,就有方法找到这些组件.在DOM.Jquery都有各自的方法查找元素/组件,ExtJS也有自己独特的方式查找组件.元素.本次从全局查找.容器内查找.form表单查找.通用组件等4个方面介绍组 ...

  9. ExtJS 4.2 业务开发(一)主页搭建

    本篇开始搭建一个ExtJS 4.2单页面应用, 这里先介绍主页的搭建,内容包括:主页结构说明.扩展功能等方面. 目录 1. 主页结构说明 2. 扩展功能 3. 在线演示 1. 主页结构说明 1.1 主 ...

随机推荐

  1. Log4j常用配置及使用

    Log4j常用配置及使用 2016-12-14 目录 1 添加log4j依赖2 使用代码配置并调用log  2.1 代码配置LogConfiguration.java  2.2 调用  2.3 结果3 ...

  2. webRTC结合canvas截图

    直接看代码.css基础弱鸡,将就看吧.慢慢学习 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  3. localtime、localtime_s、localtime_r的使用

    (1).localtime用来获取系统时间,精度为秒 #include <stdio.h>#include <time.h>int main(){    time_t time ...

  4. 轻松学习之Linux教程二 一览纵山小:Linux操作系统具体解释

    本系列文章由@uid=hpw" style="padding:0px; margin:0px; color:rgb(255,0,0); text-decoration:none&q ...

  5. 添加信任站点和允许ActiveX批处理

    有两种写法 1.如果是用IP reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMa ...

  6. ftp的主动模式active mode和被动模式 passive mode的配置和区别

    ftp的主动模式active mode和被动模式 passive mode的配置和区别 2017年05月08日 17:47:16 阅读数:21768 本文主要记录的是在linux上的区别,弄了一整天才 ...

  7. 等待事件 wait event

    衡量数据库状况, 优化数据库等 当一个进程连接到数据库后, 进程所经历的种种等待就开始被记录, 并且通过一系列的性能视图进行展示, 通过等待事件用户可以很快发现数据库的性能瓶颈, 从而进行针对性能的优 ...

  8. kettle的jndi的使用

    kettle可以使用jdbc的方式设置job或者tansform的数据库连接,但是,同时它也支持JNDI方式连接数据库,后者更加方便,只需要配置一份配置文件就可以了,不用每个DBConnection都 ...

  9. js学习系列之-----apply和call

    apply call 从字面意思就看出来,申请请,呼叫. 打个比方就是别人有什么功能,你向别人,申请 呼叫 一下,哥们拿你的功能用一下,而apply 和call就是实现这样的功能 apply 和cal ...

  10. Qt信号槽的一些事

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...