`
Rooock
  • 浏览: 36812 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Ext2中,toolbar中按钮过多时,使用左右拉键展示隐藏按钮.

阅读更多
Ext3已经出来.Ext3中已经实现了这种功能.
不过项目没有升级到ext3的打算,而且需求中也有类型的要求.
万般无奈,只要自己写一个实现了.

仍然有很多bug.不过功能基本实现了.

bug_1: toolbar中没有加 xtype:'tbseparator', 因为在我本机上'|'无法隐藏.
bug_2: toolbar中初始时,按钮是预先设置好哪些显示,哪些隐藏的.

注意事项: toolbar中的按钮必须小于等于toolbar的宽度--toolbar的宽度是除去'|<','<<','>>','>|'等之后的宽度.

首先,我们在ext中的toolbar上加上几个功能按钮:
	{pressed:true,text:'|<',handler:moveButton},
	{pressed:true,text:'<<',handler:moveButton}, 
	....		//	 其他按钮
	{pressed:true,text:'>>',handler:moveButton},
	{pressed:true,text:'>|',handler:moveButton}


随后,我们要定义moveButton的javascript函数:
/**
 * 保存toolbar上一些信息
 */
var toolbarConfig = new function()
{
	//	存储toolbar上按钮的数组
	this.buttonArray = new Array();
	//	存储toolbar上按钮长度的数组
	this.buttonLengthArray = new Array();
	//	buttonArray的当前下标
	this.buttonArrayIndex = 0;
	//	toolbar上状态是show的最左一个按钮
	this.firstShowButton;
	//	lastShowButton的下标
	this.firstShowButtonIndex;	        		
	//	toolbar上状态是show的最右一个按钮
	this.lastShowButton;
	//	lastShowButton的下标
	this.lastShowButtonIndex;
	
	//	右移按钮('>>')的长度
	this.rightMoveLength;
	//	左移按钮('<<')的长度
	this.leftMoveLength;
	//	右移至底按钮('>|')的长度
	this.rightToBottomLength; 
	//	左移至底按钮('|<')的长度
	this.leftToBottomLength;
	
	//	toolbar上状态为show的按钮长度之和
	this.showButtonLengthSum = 0;
}

/**
 * 左移,右移,左移至底,右移至底
 */
function moveButton()
{
	//	循环开始前,需重置showButtonLengthSum, firstShowButton, lastShowButton
	clearToolbarConfig(toolbarConfig);
	
	/**
	 * (1)遍历toolbar上组件,如果是按钮,则将其存进buttonArray中('<<','>>','|<','>|'除外);
	 * (2)将按钮长度存入buttonLengthArray中('<<','>>','|<','>|'除外);
	 * (3)检查button的状态,找到[状态是show的最左一个按钮]给firstShowButton, 计算长度并保存当前下标;
	 * (4)检查button的状态,找到[状态是show的最右一个按钮]给lastShowButton,  计算长度并保存当前下标;
	 * (5)计算状态是show的按钮长度之和
	 */
	for(var i = 0; i < Ext.getCmp("myTabs").items.length; i++)
	{
		//	遍历时的当前按钮
		var currentButton = Ext.getCmp("myTabs").items.items[i];
		
		//	遍历时的当前按钮的长度
		var currentButtonLength = getCurrentButtonLength(currentButton);
		
		//	对toolbar上的按钮保存信息
		buttonProcess(currentButton, currentButtonLength, i);
	}
	//	执行移动命令(>>,<<,>|,|<)
	move(this.text, toolbarConfig);
}

/**
 * 执行循环前,需清空的操作
 * @param {} toolbarConfig	toolbar的一些配置信息
 */
function clearToolbarConfig(toolbarConfig)
{
	//	循环前,清空显示按钮长度总和
	toolbarConfig.showButtonLengthSum = 0;
	//	循环前,buttonArrayIndex清空;
	toolbarConfig.buttonArrayIndex = 0;
	//	循环前,firstButton清空;
	toolbarConfig.firstShowButton = null;
	//	循环前,lastButton清空;
	toolbarConfig.lastShowButton = null;
	//	循环前,buttonArray清空
	toolbarConfig.buttonArray = new Array();
	//	循环前,buttonLengthArray清空
	toolbarConfig.buttonLengthArray = new Array();
}

/**
 * 对每一个button进行加工处理
 * @param {} currentButton			当前按钮
 * @param {} currentButtonLength	当前按钮的长度
 * @param {} index					     toolbar上元素的排列下标
 */
function buttonProcess(currentButton, currentButtonLength, index)
{
	//	仅对toolbar上的按钮做处理('>>','>|','<<','|<'除外)
	if(Ext.getCmp("myTabs").items.items[index].type == "button"  
			&& currentButton.text != ">>"  
			&& currentButton.text != "<<"
			&& currentButton.text != ">|"
			&& currentButton.text != "|<")
	{
		//	保存toolbar上按钮信息
		setNormalButtonConfig(currentButton, currentButtonLength);
		
	}else
	{
		//	保存命令按钮长度
		setMoveCommandLength(currentButton.text, currentButtonLength);
	}
}

/**
 * 保存toolbar上最左显示的按钮及其下标, 最右显示的按钮及其下标
 * @param {} button				按钮
 * @param {} buttonLength		按钮长度
 */
function setNormalButtonConfig(button, buttonLength)
{
	//	按钮数组
	toolbarConfig.buttonArray[toolbarConfig.buttonArrayIndex] = button;	
	
	//	按钮长度数组
	toolbarConfig.buttonLengthArray[toolbarConfig.buttonArrayIndex] = buttonLength;		
	
	if(button.hidden == false && !toolbarConfig.firstShowButton)
	{
		//	按钮是显示的最左一个按钮
		toolbarConfig.firstShowButton = button;
		//	lastHideButtonIndex保存当前下标
		toolbarConfig.firstShowButtonIndex = toolbarConfig.buttonArrayIndex;
		
	}else if(button.hidden == false)
	{ 
		//	按钮是显示的最右一个按钮
		toolbarConfig.lastShowButton = button;
		//	lastShowButtonIndex保存当前下标		
		toolbarConfig.lastShowButtonIndex = toolbarConfig.buttonArrayIndex;		
	}
	//	累计状态是show的按钮长度
	toolbarConfig.showButtonLengthSum += toolbarConfig.buttonLengthArray[toolbarConfig.buttonArrayIndex];
	//	按钮数组下标自增
	toolbarConfig.buttonArrayIndex++;
}

/**
 * 得到toolbar上'>>','<<','>|','|<'命令按钮的长度
 * @param {} text			命令名
 * @param {} buttonLength	按钮长度
 */
function setMoveCommandLength(text, buttonLength)
{
	if(text == ">>")
	{
		//	右移按钮的长度
		toolbarConfig.rightMoveLength = buttonLength;
	
	
	}else if(text == "<<")
	{
		//	左移按钮的长度
		toolbarConfig.leftMoveLength = buttonLength;
	
	
	}else if(text == ">|")
	{
		//	右移至底按钮的长度
		toolbarConfig.rightToBottomLength = buttonLength;
	
	
	}else if(text == "|<")
	{
		//	左移至底按钮的长度
		toolbarConfig.leftToBottomLength = buttonLength;
	}	
}

/**
 * 得到当前按钮的长度
 * <注>如果按钮是隐藏的,且没有设置宽度,则得到其宽度会为0
 * @param  {} 	currentButton		    当前按钮
 * @return {}  	currentButtonLength 当前按钮的长度
 */
function getCurrentButtonLength(currentButton)
{
	//	当前按钮的宽度
	var currentButtonLength;
	//	如果当前按钮没有指定宽度
	if(currentButton.el.dom == null ||currentButton.el.dom.width == "")
	{
		if(currentButton.el.dom == null)
		{	
			//	tbfill的宽度比较特别
			currentButtonLength = currentButton.el.offsetWidth;
									
		}else if(currentButton.el.dom.width == "")
		{
			//	得到按钮的实际宽度
			currentButtonLength = currentButton.el.dom.offsetWidth;
		}
	}else
	{
		//	得到按钮的指定宽度
		currentButtonLength = currentButton.el.dom.width;
	}
	return currentButtonLength;
}

/**
 * 得到工具条长度
 * <注>该工具条长度仅是存放按钮部分的长度(不包括'>>','<<','>|','|<')
 * @param  {} toolbarConfig 	toolbar的配置信息
 * @return {} toolbarWidth		toolbar工具条不带'<<','>>','|<','|>'的长度
 */
function getToolbarWidth(toolbarConfig)
{
	//	toolbar的长度,如果没有指定长度.就取其实际长度
	var toolbarWidth = (Ext.getCmp("myTabs").el.dom.width == null) 
			? Ext.getCmp("myTabs").el.dom.offsetWidth : Ext.getCmp("myTabs").el.dom.width;		        		
	//	toolbar工具条不带'<<','>>','|<','|>'的长度
	toolbarWidth = 
		toolbarWidth - toolbarConfig.rightMoveLength 
					 - toolbarConfig.leftMoveLength 
					 - toolbarConfig.rightToBottomLength 
					 - toolbarConfig.leftToBottomLength;
	return toolbarWidth;
}

/**
 * 执行toolbar上的移动命令
 * @param {} text 			移动命令
 * @param {} toolbarConfig	toolbar的一些配置信息
 */
function move(text, toolbarConfig)
{
	if(text == ">>")
	{
		moveRight(toolbarConfig);
	
	}else if(text == "<<")
	{
		moveLeft(toolbarConfig);
	
	}else if(text == ">|")
	{
		moveToRightBottom(toolbarConfig);
	
	}else if(text == "|<")
	{
		moveToLeftBottom(toolbarConfig);
	}
}

/**
 * 点击'>>'按钮
 * (1)先将最左边显示的按钮隐藏
 * (2)重新设置toolbarConfig.firstShowButton
 * (3)如果当前显示按钮的长度之和 - 隐藏的按钮长度 + 即将显示的按钮长度 <= toolbar宽度
 * (4)则显示这个[即将显示的按钮],且用lastShowButton指向它;否则,暂不显示;
 * @param {} toolbarConfig toolbar的一些配置信息
 */
function moveRight(toolbarConfig)
{
	//	仅当最右显示按钮的右边存在着隐藏的按钮的时候,才有效果
	if(toolbarConfig.buttonArray[toolbarConfig.lastShowButtonIndex + 1])
	{
		//	最左显示的按钮长度
		var firstShowButtonLength = toolbarConfig.buttonLengthArray[toolbarConfig.firstShowButtonIndex];
		//	最左边显示的按钮隐藏
		toolbarConfig.firstShowButton.hide();
				
		//	如果最左显示按钮的右边有按钮,则将firstShowButton指向它;
		if(toolbarConfig.buttonArray[toolbarConfig.firstShowButtonIndex + 1])
		{
			toolbarConfig.firstShowButton = toolbarConfig.buttonArray[toolbarConfig.firstShowButtonIndex + 1];
		}
		
		//	即将显示的按钮
		var lastShowButtonTemp = toolbarConfig.buttonArray[toolbarConfig.lastShowButtonIndex + 1];
		//	先将待显示的按钮显示,以得到它的长度
		lastShowButtonTemp.show();
		
		//	当前显示按钮长度 - 被隐藏按钮长度 + 即将显示按钮长度
		var result = toolbarConfig.showButtonLengthSum - firstShowButtonLength + lastShowButtonTemp.el.dom.offsetWidth;

		if(result <= getToolbarWidth(toolbarConfig))
		{
			//	用lastShowButton指向它;
			toolbarConfig.lastShowButton = toolbarConfig.buttonArray[toolbarConfig.lastShowButtonIndex + 1];
		}else
		{
			//	状态为隐藏
			toolbarConfig.buttonArray[toolbarConfig.lastShowButtonIndex + 1].hide();
		}
	}
}

/**
 * 点击'<<'按钮
 * (1)先将最右边显示的按钮隐藏
 * (2)重新设置toolbarConfig.lastShowButton
 * (3)如果当前显示按钮的长度之和 - 隐藏的按钮长度 + 即将显示的按钮长度 <= toolbar宽度
 * (4)则显示这个[即将显示的按钮],且用firstShowButton指向它;否则,暂不显示;
 * @param {} toolbarConfig toolbar的一些配置信息
 */
function moveLeft(toolbarConfig)
{
	//	仅当最左显示按钮的左边存在着隐藏的按钮的时候,才有效果
	if(toolbarConfig.buttonArray[toolbarConfig.firstShowButtonIndex - 1])
	{
		//	最右显示按钮的长度
		var lastShowButtonLength = toolbarConfig.buttonLengthArray[toolbarConfig.lastShowButtonIndex];
		//	最右显示的按钮隐藏
		toolbarConfig.lastShowButton.hide();
		
		//	如果最右显示按钮的左边有按钮,则将lastShowButton指向它;
		if(toolbarConfig.buttonArray[toolbarConfig.lastShowButtonIndex - 1])
		{
			toolbarConfig.lastShowButton = toolbarConfig.buttonArray[toolbarConfig.lastShowButtonIndex - 1];
		}
		
		//	即将显示的按钮
		var firstShowButtonTemp = toolbarConfig.buttonArray[toolbarConfig.firstShowButtonIndex - 1];
		//	先将待显示的按钮显示,以得到它的长度
		firstShowButtonTemp.show();
		
		//	当前显示按钮长度 - 被隐藏按钮长度 + 即将显示按钮的长度
		var result = toolbarConfig.showButtonLengthSum - lastShowButtonLength + firstShowButtonTemp.el.dom.offsetWidth;
		
		//	如果result <= toolbar长度
		if(result <= getToolbarWidth(toolbarConfig))
		{
			//	用firstShowButton指向该按钮
			toolbarConfig.firstShowButton = toolbarConfig.buttonArray[toolbarConfig.firstShowButtonIndex - 1];
			
		}else
		{
			//	该按钮暂不显示
			toolbarConfig.buttonArray[toolbarConfig.firstShowButtonIndex - 1].hide();
		}
	}
}

/**
 * 右移到最右端
 * (1)toolbar上按钮从右至于左遍历.累加其按钮长度
 * (2)如果按钮长度之和小于等于toolbar的宽度,累加继续.并设置按钮状态为显示
 * (3)如果按钮长度超过toolbar宽度,跳出循环.
 * @param {} toolbarConfig	toolbar的一些配置
 */
function moveToRightBottom(toolbarConfig)
{
	//	按钮长度之和
	var buttonLengthSum = 0;
	
	//	从右至左遍历.
	for(var i = toolbarConfig.buttonArray.length; i > 0; i--)
	{
		//	当前按钮
		var currentButton = toolbarConfig.buttonArray[i - 1];
		
		//	先将按钮显示,以得到其实际长度
		currentButton.show();
		
		//	按钮长度累加
		buttonLengthSum += currentButton.el.dom.offsetWidth;
		
		//	超过了toolbar长度的按钮全隐藏
		if(buttonLengthSum > getToolbarWidth(toolbarConfig))
		{	
			currentButton.hide();
		}
	}
}

/**
 * 左移到最左端
 * (1)toolbar上按钮从左至于右遍历.累加其按钮长度
 * (2)如果按钮长度之和小于等于toolbar的宽度,累加继续.并设置按钮状态为显示
 * (3)如果按钮长度超过toolbar宽度,跳出循环.
 * @param {} toolbarConfig	toolbar的一些配置
 */
function moveToLeftBottom(toolbarConfig)
{
	//	按钮长度之和
	var buttonLengthSum = 0;
	
	//	从右至左遍历.
	for(var i = 0; i < toolbarConfig.buttonArray.length; i++)
	{
		//	当前按钮
		var currentButton = toolbarConfig.buttonArray[i];
		
		//	先将按钮显示,以得到其实际长度
		currentButton.show();
		
		//	按钮长度累加
		buttonLengthSum += currentButton.el.dom.offsetWidth;
		
		//	超过了toolbar长度的按钮全隐藏
		if(buttonLengthSum > getToolbarWidth(toolbarConfig))
		{	
			currentButton.hide();
		}
	}
}
2
0
分享到:
评论

相关推荐

    ext Panel+toolbar+button 实作带注释

    在`panel.js`中,你可能会找到创建Toolbar的代码,例如`Ext.create('Ext.toolbar.Toolbar', {...})`,然后在其中添加各种工具按钮。 `EXT Button`是EXT JS中最常用的交互元素之一,它用于触发某个动作或者导航到...

    监听列表滚动来隐藏或显示Toolbar与浮动按钮

    在Android应用开发中,我们经常需要根据用户交互来动态调整界面元素的可见性,例如当用户滚动列表时,隐藏或显示顶部的ToolBar以及悬浮动作按钮(Floating Action Button, FAB)。这种效果能提供更好的用户体验,...

    EXT核心API详解

    65、Ext.Toolbar.Separator类 ……… 56 66、Ext.Toolbar.Spacer类 …………… 56 67、Ext.Toolbar.TextItem类 ……… 56 68、Ext.Toolbar.Fill类 ……………… 56 69、Ext.grid.ColumnModel类 ……… 58 70、Ext....

    Ext.js教程和Ext.js API

    6. **菜单和工具栏**:创建和使用菜单(Menu)和工具栏(Toolbar)。 7. **拖放(Drag & Drop)和DND**:如何实现元素的拖放操作。 8. **Ajax和数据通信**:使用Ajax请求进行后台通信,包括JsonP和ScriptTagProxy。 ...

    前端项目-leaflet.toolbar.js.zip

    以一个简单的示例来展示如何使用Leaflet.Toolbar.js。创建一个地图,添加一个绘制点的工具,当用户点击该工具并在地图上点击时,会在地图上生成一个标记点。 ```javascript var map = L.map('map').setView([51.505...

    Ext组件描述,各个组件含义

    ### Ext组件概述与详解 #### 一、Ext基础组件 **1.1 Box Component (Ext.BoxComponent)** - **xtype**: `box` - **功能描述**:Box Component 是一个非常基本的 Ext 组件,主要用于定义具有边框和其他布局属性的...

    Ext Js权威指南(.zip.001

    Ex4.0共2个压缩包特性,《ext js权威指南》 前 言 第1章 ext js 4开发入门 / 1 1.1 学习ext js必需的基础知识 / 1 1.2 json概述 / 3 1.2.1 认识json / 3 1.2.2 json的结构 / 3 1.2.3 json的例子 / 4 1.2.4 ...

    Android 动态的隐藏/显示Toolbar.rar

    本教程将探讨如何在Android应用中动态地隐藏和显示`Toolbar`,特别是在列表滚动时实现这一功能。我们将主要关注以下几个知识点: 1. **Toolbar的引入与设置** - `Toolbar`是`android.support.v7.widget.Toolbar`库...

    Toolbar.js-实用的tooltip样式jQuery工具栏插件

    1. **Tooltips样式**: Toolbar.js将工具栏的每个按钮设计成Tooltip样式,当鼠标悬停在按钮上时,会显示相关的提示信息或功能描述,提高了用户体验。 2. **Font Awesome集成**: Font Awesome是一套流行的Web字体图标...

    EXTJS3 Ext.PagingToolbar() 快捷键应用

    在EXTJS3中,`Ext.PagingToolbar()` 是一个非常重要的组件,用于在大量数据的网格或视图中实现分页功能。这个组件允许用户轻松地浏览和操作大量的记录,而不需要一次性加载所有数据,从而提高了应用程序的性能和用户...

    Android 仿Toolbar动画显示隐藏.zip

    首先,我们需要在布局文件中定义Toolbar,通常在activity的根布局如`CoordinatorLayout`中使用`AppBarLayout`来包含Toolbar。`AppBarLayout`是专门为配合`CollapsingToolbarLayout`和`ToolBar`设计的,可以实现类似...

    ToolBar按钮显示文字

    在`CMyToolBar`中添加组合框,并在需要时显示或隐藏。 8. **热点图像**: 热点图像指的是具有可交互区域的图像,当用户点击该区域时会触发特定动作。在工具栏上实现这一功能,可以通过在位图中定义热点区域,并在`...

    VC.control.design.code.toolbar.rar_control

    在“VC.control.design.code.toolbar.rar_control”这个压缩包中,包含的应该是关于如何在Visual C++中设计和实现自定义工具条控件的源代码。接下来,我们将深入探讨工具条控件的基本概念、设计原理以及相关的编程...

    MFC工具栏ToolBar按钮添加下拉菜单

    MFC 工具栏 ToolBar 按钮添加下拉菜单是指在 MFC 应用程序中,将工具栏按钮添加下拉菜单,以提供更多的功能选项。下面将详细介绍如何实现该功能。 首先,在 MainFrm.cpp 的 int CMainFrame::OnCreate...

    VB中ToolBar的使用

    通过上述步骤,我们可以看到在Visual Basic中使用Toolbar控件来创建工具条不仅功能强大而且操作简便。对于希望提高软件界面友好性的开发者来说,这是一个非常有用的工具。通过合理的布局和功能设计,可以显著提升...

    Ext-window属性

    可以是`Ext.Toolbar`对象、工具栏配置对象或按钮配置数组。一旦组件渲染完成,如果需要修改工具栏,应使用`getBottomToolbar`获取引用。 11. **bodyBorder**: 如果设置为`true`,会给组件的内部元素(`this.el`)...

    extjs4.2 动态生成toolbar

    我们还需要在 render 事件中使用 Ext.Ajax.request 方法来请求后台的工具栏数据,并将其添加到 Toolbar 中。 ```javascript Ext.define('Ext.zc.grid.Toolbar', { extend: 'Ext.toolbar.Toolbar', alias: 'widget...

    精彩编程与编程技巧-放一个Combo到Toolbar中...

    - 首先,使用`Toolbar1.Buttons.Add()`方法添加两个按钮到工具栏。 - 第一个按钮设置为`tbrSeparator`样式,表示一个分隔符。 - 第二个按钮设置为`tbrPlaceholder`样式,并指定其`Key`属性为“ComboBox”,这样就...

    ExtJs_xtype一览

    - `tbsplit`:`Ext.Toolbar.SplitButton`,工具栏的分隔按钮。 - `tbtext`:`Ext.Toolbar.TextItem`,在工具栏中添加文本。 4. **菜单组件** - `menu`:`Ext.menu.Menu`,创建下拉菜单。 - `colormenu`:`Ext....

    extjs帮助文档pdf版

    Ext 类 (P.2) - **概述**:`Ext` 是 ExtJS 的核心命名空间,包含了全局的方法和属性。 - **用途**:提供了一个统一的入口来访问 ExtJS 库的功能,如创建组件、管理事件等。 - **常用方法**: - `Ext.create()`: ...

Global site tag (gtag.js) - Google Analytics