當你要使用Ext JS時,基本上僅需加入下列這三列程式碼:
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" /> <script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="ext/ext-all.js"></script>
另外建立一個自己的JavaScript檔案,內容大概是這樣:
Ext.BLANK_IMAGE_URL = 'ext/resources/images/default/s.gif';
Ext.onReady(function(){
//填入你的程式碼
});
onReady( Function fn, [Object scope], [boolean options] ) : void實際上是onDocumentReady( Function fn, [Object scope], [boolean options] ) : void的縮寫,此函式方法需要三個參數(parameter),後兩個可選擇使用,因此呼叫時需要傳遞引數(argument)來呼叫。目前最新的版本是3.1.0,我從3.0.0和3.0.3用到現在,程式庫的更新也都很方便,只要將檔案更換就可以繼續使用新功能。
一樣的,推薦一本書:
![]() |
Ext JS中所有的物件都是Ext.Component元件,元件的設定都是使用JSON格式(沒有使用過Ext JS要特別注意和熟悉)。
另外,因為開發Web Desktop網頁應用程式的需求,因而使用ext-3.1.0\examples\desktop的範例程式,加上分析與修改程式碼符合自己的需要,在這裡貼上程式的五個Ext JS的JavaScript供大家參考。
App.js
/*!
* Ext JS Library 3.0.3
* Copyright(c) 2006-2009 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
/*--------------------------------------------------*/
//定義桌面應用程式物件
Ext.app.App = function(cfg){
Ext.apply(this, cfg);//複製cfg屬性到本物件
//自行定義兩個事件為ready與beforeunload
this.addEvents({
'ready': true,//自行定義
'beforeunload': true//自行定義
});
Ext.onReady(this.initApp, this);//呼叫initApp方法,初始化物件
};
/*--------------------------------------------------*/
//定義桌面應用程式物件子類別Ext.app.App,繼承父類別Ext.util.Observable。
Ext.extend(Ext.app.App, Ext.util.Observable, {
//以下為繼承之後新增的成員
isReady: false,
startMenu: null,//開始選單
modules: null,//應用程式模組
getStartConfig: function(){//讓使用者建立物件時填入
},
//建立桌面應用程式物件之後,會執行initApp函數
initApp: function(){//初始化桌面應用程式
this.startConfig = this.startConfig || this.getStartConfig();//開始功能表組態
this.desktop = new Ext.Desktop(this);//建立桌面物件,參考Desktop.js
//desktop物件之中,包含taskbar物件,其中taskbar物件含有startMenu
this.launcher = this.desktop.taskbar.startMenu;
//launcher發射器
this.modules = this.getModules();//取得模組建立
if (this.modules) {
this.initModules(this.modules);//如果模組存在,初始化模組
}
this.init();
//appends an event handler to an element, shorthand for addListener
//參數:HTML元素,事件名稱,事件處理函數,執行範圍
Ext.EventManager.on(window, 'beforeunload', this.onUnload, this);
//觸發ready事件
this.fireEvent('ready', this);
this.isReady = true;//完成初始化
},
getModules: Ext.emptyFn,//A reusable empty function讓使用者建立物件時填入
init: Ext.emptyFn,//A reusable empty function讓使用者建立物件時填入
//這裡將模組加入開始功能表
initModules: function(ms){//初始化模組
for (var i = 0, len = ms.length; i < len; i++) {
var m = ms[i];
//modify!!
if(m.show==true)
this.launcher.add(m.launcher);
m.app = this;
}
},
getModule: function(name){//取得模組
var ms = this.modules;
for (var i = 0, len = ms.length; i < len; i++) {
if (ms[i].id == name || ms[i].appType == name) {
return ms[i];
}
}
return '';
},
//定義事件處理
onReady: function(fn, scope){
if (!this.isReady) {
this.on('ready', fn, scope);
}
else {
fn.call(scope, this);
}
},
getDesktop: function(){
return this.desktop;
},
//定義事件處理
onUnload: function(e){
if (this.fireEvent('beforeunload', this) === false) {
e.stopEvent();
}
}
});
/*--------------------------------------------------*/
Desktop.js
/*!
* Ext JS Library 3.0.3
* Copyright(c) 2006-2009 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
/*--------------------------------------------------*/
//定義桌面物件(函數物件)
Ext.Desktop = function(app){
//呼叫new Ext.Desktop(this);時,將執行下列指令碼
this.taskbar = new Ext.ux.TaskBar(app);//新增工作列
/*--------------------------------------------------*/
//定義區域變數
var taskbar = this.taskbar;//工作列物件
var desktopEl = Ext.get('x-desktop');//桌面DOM元素物件
var taskbarEl = Ext.get('ux-taskbar');//工作列DOM元素物件
var shortcuts = Ext.get('x-shortcuts');//桌面捷徑DOM元素物件
var windows = new Ext.WindowGroup();//視窗群組
var activeWindow;//目前正在動作的視窗
/*--------------------------------------------------*/
//定義函數變數
function minimizeWin(win){//最小化視窗
win.minimized = true;
win.hide();
}
function markActive(win){
if (activeWindow && activeWindow != win) {
markInactive(activeWindow);
}
taskbar.setActiveButton(win.taskButton);
activeWindow = win;
Ext.fly(win.taskButton.el).addClass('active-win');
win.minimized = false;
}
function markInactive(win){
if (win == activeWindow) {
activeWindow = null;
Ext.fly(win.taskButton.el).removeClass('active-win');
}
}
function removeWin(win){//移動視窗
taskbar.removeTaskButton(win.taskButton);
layout();
}
function layout(){
desktopEl.setHeight(Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight());
}
/*--------------------------------------------------*/
//當WindowsResize時觸發layout函數
Ext.EventManager.onWindowResize(layout);
//定義物件的屬性與方法(this.開始的)
this.layout = layout;
this.createWindow = function(config, cls){//建立視窗
var win = new (cls || Ext.Window)(Ext.applyIf(config || {}, {
manager: windows,
minimizable: true,
maximizable: true
}));
win.render(desktopEl);
win.taskButton = taskbar.addTaskButton(win);
win.cmenu = new Ext.menu.Menu({
items: []
});
win.animateTarget = win.taskButton.el;
win.on({
'activate': {
fn: markActive
},
'beforeshow': {
fn: markActive
},
'deactivate': {
fn: markInactive
},
'minimize': {
fn: minimizeWin
},
'close': {
fn: removeWin
}
});
layout();//呼叫私有函數function layout()
return win;
};
this.getManager = function(){
return windows;
};
this.getWindow = function(id){//取得特定ID之視窗
return windows.get(id);
}
this.getWinWidth = function(){//取得視窗寬度
var width = Ext.lib.Dom.getViewWidth();
return width < 200 ? 200 : width;
}
this.getWinHeight = function(){//取得視窗高度
var height = (Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight());
return height < 100 ? 100 : height;
}
this.getWinX = function(width){//取得視窗X座標
return (Ext.lib.Dom.getViewWidth() - width) / 2
}
this.getWinY = function(height){//取得視窗Y座標
return (Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight() - height) / 2;
}
/*--------------------------------------------------*/
layout();
if (shortcuts) {
shortcuts.on('click', function(e, t){//Ext.lib.Event事件程式庫,Ext.EventObject
if (t = e.getTarget('dt', shortcuts)) {
e.stopEvent();//停止事件
var module = app.getModule(t.id.replace('-shortcut', ''));
if (module) {
module.createWindow();//當點選時,執行模組內部的createWindow函數
}
}
});
}
};
Module.js/*!
* Ext JS Library 3.0.3
* Copyright(c) 2006-2009 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
/*--------------------------------------------------*/
//定義桌面模組物件
Ext.app.Module = function(config){
Ext.apply(this, config);//複製config的屬性至this物件
Ext.app.Module.superclass.constructor.call(this);
this.init();
}
/*--------------------------------------------------*/
//定義桌面模組物件子類別Ext.app.Module,繼承父類別Ext.util.Observable。
Ext.extend(Ext.app.Module, Ext.util.Observable, {
//新增成員函數
init: Ext.emptyFn//a reusable empty function讓使用者建立物件時填入
});
/*--------------------------------------------------*/
StartMenu.js/*!
* Ext JS Library 3.0.3
* Copyright(c) 2006-2009 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
/**
* @class Ext.ux.StartMenu
* @extends Ext.menu.Menu
* A start menu object.
* @constructor
* Creates a new StartMenu
* @param {Object} config Configuration options
*
* SAMPLE USAGE:
*
* this.startMenu = new Ext.ux.StartMenu({
* iconCls: 'user',
* height: 300,
* shadow: true,
* title: get_cookie('memberName'),
* width: 300
* });
*
* this.startMenu.add({
* text: 'Grid Window',
* iconCls:'icon-grid',
* handler : this.createWindow,
* scope: this
* });
*
* this.startMenu.addTool({
* text:'Logout',
* iconCls:'logout',
* handler:function(){ window.location = "logout.php"; },
* scope:this
* });
*/
/*--------------------------------------------------*/
//開始功能表
Ext.namespace("Ext.ux");
//由ExtJS建立兩個物件,分別是Ext和Ext.ux兩個物件,避免命名衝突
/*--------------------------------------------------*/
//定義StartMenu物件繼承Ext.menu.Menu物件建立子物件
Ext.ux.StartMenu = Ext.extend(Ext.menu.Menu, {
//初始化元件
initComponent: function(config) {//覆寫父物件方法
Ext.ux.StartMenu.superclass.initComponent.call(this, config);
var tools = this.toolItems;//工具項
this.toolItems = new Ext.util.MixedCollection();//混合型集合類別
if(tools){
this.addTool.apply(this, tools);//複製tools至this物件
}
},
//物件的方法
onRender : function(ct, position){
Ext.ux.StartMenu.superclass.onRender.call(this, ct, position);
var el = this.el.addClass('ux-start-menu');
var header = el.createChild({
tag: "div",
cls: "x-window-header x-unselectable x-panel-icon "+this.iconCls
});
this.header = header;
var headerText = header.createChild({
tag: "span",
cls: "x-window-header-text"
});
var tl = header.wrap({
cls: "ux-start-menu-tl"
});
var tr = header.wrap({
cls: "ux-start-menu-tr"
});
var tc = header.wrap({
cls: "ux-start-menu-tc"
});
this.menuBWrap = el.createChild({
tag: "div",
cls: "x-window-body x-border-layout-ct ux-start-menu-body"
});
var ml = this.menuBWrap.wrap({
cls: "ux-start-menu-ml"
});
var mc = this.menuBWrap.wrap({
cls: "x-window-mc ux-start-menu-bwrap"
});
this.menuPanel = this.menuBWrap.createChild({
tag: "div",
cls: "x-panel x-border-panel ux-start-menu-apps-panel"
});
this.toolsPanel = this.menuBWrap.createChild({
tag: "div",
cls: "x-panel x-border-panel ux-start-menu-tools-panel"
});
var bwrap = ml.wrap({cls: "x-window-bwrap"});
var bc = bwrap.createChild({
tag: "div",
cls: "ux-start-menu-bc"
});
var bl = bc.wrap({
cls: "ux-start-menu-bl x-panel-nofooter"
});
var br = bc.wrap({
cls: "ux-start-menu-br"
});
this.ul.appendTo(this.menuPanel);
var toolsUl = this.toolsPanel.createChild({
tag: "ul",
cls: "x-menu-list"
});
this.mon(toolsUl, 'click', this.onClick, this);
this.mon(toolsUl, 'mouseover', this.onMouseOver, this);
this.mon(toolsUl, 'mouseout', this.onMouseOut, this);
this.items.each(function(item){
item.parentMenu = this;
}, this);
this.toolItems.each(
function(item){
var li = document.createElement("li");
li.className = "x-menu-list-item";
toolsUl.dom.appendChild(li);
item.render(li);
item.parentMenu = this;
}, this);
this.toolsUl = toolsUl;
this.menuBWrap.setStyle('position', 'relative');
this.menuBWrap.setHeight(this.height - 28);
this.menuPanel.setStyle({
padding: '2px',
position: 'absolute',
overflow: 'auto'
});
this.toolsPanel.setStyle({
padding: '2px 4px 2px 2px',
position: 'absolute',
overflow: 'auto'
});
this.setTitle(this.title);
},
//物件的方法
findTargetItem : function(e){
var t = e.getTarget(".x-menu-list-item", this.ul, true);
if(t && t.menuItemId){
if(this.items.get(t.menuItemId)){
return this.items.get(t.menuItemId);
}else{
return this.toolItems.get(t.menuItemId);
}
}
},
/**
* Displays this menu relative to another element
* @param {Mixed} element The element to align to
* @param {String} position (optional) The {@link Ext.Element#alignTo} anchor position to use in aligning to
* the element (defaults to this.defaultAlign)
* @param {Ext.ux.StartMenu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined)
*/
show : function(el, pos, parentMenu){
this.parentMenu = parentMenu;
if(!this.el){
this.render();
}
this.fireEvent("beforeshow", this);
this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);
var tPanelWidth = 120;
var box = this.menuBWrap.getBox();
this.menuPanel.setWidth(box.width-tPanelWidth);
this.menuPanel.setHeight(box.height);
this.toolsPanel.setWidth(tPanelWidth);
this.toolsPanel.setX(box.x+box.width-tPanelWidth);
this.toolsPanel.setHeight(box.height);
},
addTool : function(){
var a = arguments, l = a.length, item;
for(var i = 0; i < l; i++){
var el = a[i];
if(el.render){ // some kind of Item
item = this.addToolItem(el);
}else if(typeof el == "string"){ // string
if(el == "separator" || el == "-"){
item = this.addToolSeparator();
}else{
item = this.addText(el);
}
}else if(el.tagName || el.el){ // element
item = this.addElement(el);
}else if(typeof el == "object"){ // must be menu item config?
item = this.addToolMenuItem(el);
}
}
return item;
},
/**
* Adds a separator bar to the Tools
* @return {Ext.menu.Item} The menu item that was added
*/
addToolSeparator : function(){
return this.addToolItem(new Ext.menu.Separator({itemCls: 'ux-toolmenu-sep'}));
},
addToolItem : function(item){
this.toolItems.add(item);
if(this.ul){
var li = document.createElement("li");
li.className = "x-menu-list-item";
this.ul.dom.appendChild(li);
item.render(li, this);
this.delayAutoWidth();
}
return item;
},
addToolMenuItem : function(config){
if(!(config instanceof Ext.menu.Item)){
if(typeof config.checked == "boolean"){ // must be check menu item config?
config = new Ext.menu.CheckItem(config);
}else{
config = new Ext.menu.Item(config);
}
}
return this.addToolItem(config);
},
setTitle : function(title, iconCls){
this.title = title;
this.header.child('span').update(title);
return this;
}
});
TaskBar.js
/*!
* Ext JS Library 3.0.3
* Copyright(c) 2006-2009 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
/**
* @class Ext.ux.TaskBar
* @extends Ext.util.Observable
*/
/*--------------------------------------------------*/
//定義工作列物件
Ext.ux.TaskBar = function(app){
this.app = app;
this.init();
}
/*--------------------------------------------------*/
//子類別Ext.ux.TaskBar,繼承父類別Ext.util.Observable。(3-argument)
Ext.extend(Ext.ux.TaskBar, Ext.util.Observable, {
//新增初始化成員函數
init : function(){
//建立開始功能表物件
this.startMenu = new Ext.ux.StartMenu(Ext.apply({//複製開始功能表組態
iconCls: 'user',
height: 300,
shadow: true,
title: 'Web Desktop',
width: 300
}, this.app.startConfig));
this.startBtn = new Ext.Button({
text: '開始',
id: 'ux-startbutton',
iconCls:'start',
menu: this.startMenu,//設定開始選單
menuAlign: 'bl-tl',//對齊buttom left corner + top left corner
renderTo: 'ux-taskbar-start',
clickEvent: 'mousedown',
template: new Ext.Template(
'<table cellspacing="0" class="x-btn {3}"><tbody><tr>',
'<td class="ux-startbutton-left"><i> </i></td>',
'<td class="ux-startbutton-center"><em class="{5} unselectable="on">',
'<button class="x-btn-text {2}" type="{1}" style="height:30px;">{0}</button>',
'</em></td>',
'<td class="ux-startbutton-right"><i> </i></td>',
"</tr></tbody></table>")
});
var width = this.startBtn.getEl().getWidth()+10;
//開始功能表容器
var sbBox = new Ext.BoxComponent({
el: 'ux-taskbar-start',
id: 'TaskBarStart',
minWidth: width,
region:'west',
split: true,
width: width
});
//工作列按鈕容器
this.tbPanel = new Ext.ux.TaskButtonsPanel({
el: 'ux-taskbuttons-panel',
id: 'TaskBarButtons',
region:'center'
});
//工作列配置容器,使用border配置,包含sbBox與tbPanel兩元素
var container = new Ext.ux.TaskBarContainer({
el: 'ux-taskbar',
layout: 'border',
items: [sbBox,this.tbPanel]
});
return this;
},
//新增成員函數
addTaskButton : function(win){
return this.tbPanel.addButton(win, 'ux-taskbuttons-panel');
},
//新增成員函數
removeTaskButton : function(btn){
this.tbPanel.removeButton(btn);
},
//新增成員函數
setActiveButton : function(btn){
this.tbPanel.setActiveButton(btn);
}
});
/*--------------------------------------------------*/
/**
* @class Ext.ux.TaskBarContainer
* @extends Ext.Container
*/
//子類別Ext.ux.TaskBarContainer,繼承父類別Ext.Container。(2-argument)
Ext.ux.TaskBarContainer = Ext.extend(Ext.Container, {
//新增成員函數
initComponent : function() {
Ext.ux.TaskBarContainer.superclass.initComponent.call(this);
this.el = Ext.get(this.el) || Ext.getBody();
this.el.setHeight = Ext.emptyFn;
this.el.setWidth = Ext.emptyFn;
this.el.setSize = Ext.emptyFn;
this.el.setStyle({
overflow:'hidden',
margin:'0',
border:'0 none'
});
this.el.dom.scroll = 'no';
this.allowDomMove = false;
this.autoWidth = true;
this.autoHeight = true;
Ext.EventManager.onWindowResize(this.fireResize, this);
this.renderTo = this.el;
},
//新增成員函數
fireResize : function(w, h){
this.fireEvent('resize', this, w, h, w, h);
}
});
/*--------------------------------------------------*/
/**
* @class Ext.ux.TaskButtonsPanel
* @extends Ext.BoxComponent
*/
//子類別Ext.ux.TaskBarContainer,繼承父類別Ext.Container。(2-argument)
Ext.ux.TaskButtonsPanel = Ext.extend(Ext.BoxComponent, {//工作列按鈕容器
activeButton: null,
enableScroll: true,
scrollIncrement: 0,
scrollRepeatInterval: 400,
scrollDuration: .35,
animScroll: true,
resizeButtons: true,
buttonWidth: 168,
minButtonWidth: 118,
buttonMargin: 2,
buttonWidthSet: false,
initComponent : function() {
Ext.ux.TaskButtonsPanel.superclass.initComponent.call(this);
this.on('resize', this.delegateUpdates);
this.items = [];
this.stripWrap = Ext.get(this.el).createChild({
cls: 'ux-taskbuttons-strip-wrap',
cn: {
tag:'ul', cls:'ux-taskbuttons-strip'
}
});
this.stripSpacer = Ext.get(this.el).createChild({
cls:'ux-taskbuttons-strip-spacer'
});
this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
this.edge = this.strip.createChild({
tag:'li',
cls:'ux-taskbuttons-edge'
});
this.strip.createChild({
cls:'x-clear'
});
},
addButton : function(win){
var li = this.strip.createChild({tag:'li'}, this.edge); // insert before the edge
var btn = new Ext.ux.TaskBar.TaskButton(win, li);
this.items.push(btn);
if(!this.buttonWidthSet){
this.lastButtonWidth = btn.container.getWidth();
}
this.setActiveButton(btn);
return btn;
},
removeButton : function(btn){
var li = document.getElementById(btn.container.id);
btn.destroy();
li.parentNode.removeChild(li);
var s = [];
for(var i = 0, len = this.items.length; i < len; i++) {
if(this.items[i] != btn){
s.push(this.items[i]);
}
}
this.items = s;
this.delegateUpdates();
},
setActiveButton : function(btn){
this.activeButton = btn;
this.delegateUpdates();
},
delegateUpdates : function(){
/*if(this.suspendUpdates){
return;
}*/
if(this.resizeButtons && this.rendered){
this.autoSize();
}
if(this.enableScroll && this.rendered){
this.autoScroll();
}
},
autoSize : function(){
var count = this.items.length;
var ow = this.el.dom.offsetWidth;
var aw = this.el.dom.clientWidth;
if(!this.resizeButtons || count < 1 || !aw){ // !aw for display:none
return;
}
var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.buttonMargin, this.buttonWidth), this.minButtonWidth); // -4 for float errors in IE
var btns = this.stripWrap.dom.getElementsByTagName('button');
this.lastButtonWidth = Ext.get(btns[0].id).findParent('li').offsetWidth;
for(var i = 0, len = btns.length; i < len; i++) {
var btn = btns[i];
var tw = Ext.get(btns[i].id).findParent('li').offsetWidth;
var iw = btn.offsetWidth;
btn.style.width = (each - (tw-iw)) + 'px';
}
},
autoScroll : function(){
var count = this.items.length;
var ow = this.el.dom.offsetWidth;
var tw = this.el.dom.clientWidth;
var wrap = this.stripWrap;
var cw = wrap.dom.offsetWidth;
var pos = this.getScrollPos();
var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
if(!this.enableScroll || count < 1 || cw < 20){ // 20 to prevent display:none issues
return;
}
wrap.setWidth(tw); // moved to here because of problem in Safari
if(l <= tw){
wrap.dom.scrollLeft = 0;
//wrap.setWidth(tw); moved from here because of problem in Safari
if(this.scrolling){
this.scrolling = false;
this.el.removeClass('x-taskbuttons-scrolling');
this.scrollLeft.hide();
this.scrollRight.hide();
}
}else{
if(!this.scrolling){
this.el.addClass('x-taskbuttons-scrolling');
}
tw -= wrap.getMargins('lr');
wrap.setWidth(tw > 20 ? tw : 20);
if(!this.scrolling){
if(!this.scrollLeft){
this.createScrollers();
}else{
this.scrollLeft.show();
this.scrollRight.show();
}
}
this.scrolling = true;
if(pos > (l-tw)){ // ensure it stays within bounds
wrap.dom.scrollLeft = l-tw;
}else{ // otherwise, make sure the active button is still visible
this.scrollToButton(this.activeButton, true); // true to animate
}
this.updateScrollButtons();
}
},
createScrollers : function(){
var h = this.el.dom.offsetHeight; //var h = this.stripWrap.dom.offsetHeight;
// left
var sl = this.el.insertFirst({
cls:'ux-taskbuttons-scroller-left'
});
sl.setHeight(h);
sl.addClassOnOver('ux-taskbuttons-scroller-left-over');
this.leftRepeater = new Ext.util.ClickRepeater(sl, {
interval : this.scrollRepeatInterval,
handler: this.onScrollLeft,
scope: this
});
this.scrollLeft = sl;
// right
var sr = this.el.insertFirst({
cls:'ux-taskbuttons-scroller-right'
});
sr.setHeight(h);
sr.addClassOnOver('ux-taskbuttons-scroller-right-over');
this.rightRepeater = new Ext.util.ClickRepeater(sr, {
interval : this.scrollRepeatInterval,
handler: this.onScrollRight,
scope: this
});
this.scrollRight = sr;
},
getScrollWidth : function(){
return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
},
getScrollPos : function(){
return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
},
getScrollArea : function(){
return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
},
getScrollAnim : function(){
return {
duration: this.scrollDuration,
callback: this.updateScrollButtons,
scope: this
};
},
getScrollIncrement : function(){
return (this.scrollIncrement || this.lastButtonWidth+2);
},
/* getBtnEl : function(item){
return document.getElementById(item.id);
}, */
scrollToButton : function(item, animate){
item = item.el.dom.parentNode; // li
if(!item){ return; }
var el = item; //this.getBtnEl(item);
var pos = this.getScrollPos(), area = this.getScrollArea();
var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;
var right = left + el.offsetWidth;
if(left < pos){
this.scrollTo(left, animate);
}else if(right > (pos + area)){
this.scrollTo(right - area, animate);
}
},
scrollTo : function(pos, animate){
this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
if(!animate){
this.updateScrollButtons();
}
},
onScrollRight : function(){
var sw = this.getScrollWidth()-this.getScrollArea();
var pos = this.getScrollPos();
var s = Math.min(sw, pos + this.getScrollIncrement());
if(s != pos){
this.scrollTo(s, this.animScroll);
}
},
onScrollLeft : function(){
var pos = this.getScrollPos();
var s = Math.max(0, pos - this.getScrollIncrement());
if(s != pos){
this.scrollTo(s, this.animScroll);
}
},
updateScrollButtons : function(){
var pos = this.getScrollPos();
this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-left-disabled');
this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-right-disabled');
}
});
/*--------------------------------------------------*/
/**
* @class Ext.ux.TaskBar.TaskButton
* @extends Ext.Button
*/
Ext.ux.TaskBar.TaskButton = function(win, el){
this.win = win;
Ext.ux.TaskBar.TaskButton.superclass.constructor.call(this, {
iconCls: win.iconCls,
text: Ext.util.Format.ellipsis(win.title, 12),
renderTo: el,
handler : function(){
if(win.minimized || win.hidden){
win.show();
}else if(win == win.manager.getActive()){
win.minimize();
}else{
win.toFront();
}
},
clickEvent:'mousedown',
template: new Ext.Template(
'<table cellspacing="0" class="x-btn {3}"><tbody><tr>',
'<td class="ux-taskbutton-left"><i> </i></td>',
'<td class="ux-taskbutton-center"><em class="{5} unselectable="on">',
'<button class="x-btn-text {2}" type="{1}" style="height:28px;">{0}</button>',
'</em></td>',
'<td class="ux-taskbutton-right"><i> </i></td>',
"</tr></tbody></table>")
});
};
/*--------------------------------------------------*/
//子類別Ext.ux.TaskBar.TaskButton,繼承父類別Ext.Button。(2-argument)
Ext.extend(Ext.ux.TaskBar.TaskButton, Ext.Button, {
onRender : function(){
Ext.ux.TaskBar.TaskButton.superclass.onRender.apply(this, arguments);
this.cmenu = new Ext.menu.Menu({
items: [{
text: '還原',
handler: function(){
if(!this.win.isVisible()){
this.win.show();
}else{
this.win.restore();
}
},
scope: this
},{
text: '最小化',
handler: this.win.minimize,
scope: this.win
},{
text: '最大化',
handler: this.win.maximize,
scope: this.win
}, '-', {
text: '關閉',
handler: this.closeWin.createDelegate(this, this.win, true),
scope: this.win
}]
});
this.cmenu.on('beforeshow', function(){
var items = this.cmenu.items.items;
var w = this.win;
items[0].setDisabled(w.maximized !== true && w.hidden !== true);
items[1].setDisabled(w.minimized === true);
items[2].setDisabled(w.maximized === true || w.hidden === true);
}, this);
this.el.on('contextmenu', function(e){
e.stopEvent();
if(!this.cmenu.el){
this.cmenu.render();
}
var xy = e.getXY();
xy[1] -= this.cmenu.el.getHeight();
this.cmenu.showAt(xy);
}, this);
},
closeWin : function(cMenu, e, win){
if(!win.isVisible()){
win.show();
}else{
win.restore();
}
win.close();
}
});

您好,我最近在研究ExtJS,想請教您,若要將這五個JS引入Html的話,那html的語法該怎麼寫,可否麻煩您提供小弟原始碼呢,打擾您實在非常抱歉,感謝您的回覆
回覆刪除