Extjs日期控件(date),文本框(textfield)和下拉(combo)的清空控件
来源:互联网 发布:手机gps软件下载 编辑:程序博客网 时间:2024/04/29 06:29
第一步:ClearButton.css
.ext-ux-clearbutton { width: 12px; height: 12px; background-image: url(../images/clear-text-icon.gif); background-position: 0 0; background-repeat: no-repeat; -moz-user-focus: ignore; /* https://developer.mozilla.org/en/CSS/-moz-user-focus */ cursor: pointer; position: absolute; overflow: hidden; /* IE 6 :-( */ margin-top: 4px; background-color: white;}.ext-ux-clearbutton-mouse-over-input { background-position: 0 -12px;}.ext-ux-clearbutton-mouse-over-button { background-position: 0 -24px;}.ext-ux-clearbutton-mouse-down { background-position: 0 -36px;}.ext-ux-clearbutton-on { opacity: 1; visibility: visible; transition: opacity .35s linear; -webkit-transition: opacity .35s linear; -moz-transition: opacity .35s linear; -o-transition: opacity .35s linear; -ms-transition: opacity .35s linear; -khtml-transition: opacity .35s linear;}.ext-ux-clearbutton-off { opacity: 0; visibility: hidden; transition: opacity .35s linear, visibility .0s linear .35s; -webkit-transition: opacity .35s linear, visibility .0s linear .35s; -moz-transition: opacity .35s linear, visibility .0s linear .35s; -o-transition: opacity .35s linear, visibility .0s linear .35s; -ms-transition: opacity .35s linear, visibility .0s linear .35s; -khtml-transition: opacity .35s linear, visibility .0s linear .35s;}第二步:ClearButton.js
(function() { /** * @class Ext.ux.form.field.ClearButton * * Plugin for text components that shows a "clear" button over the text field. * When the button is clicked the text field is set empty. * Icon image and positioning can be controlled using CSS. * Works with Ext.form.field.Text, Ext.form.field.TextArea, Ext.form.field.ComboBox and Ext.form.field.Date. * * Plugin alias is 'clearbutton' (use "plugins: 'clearbutton'" in GridPanel config). * * @author <a href="mailto:stephen.friedrich@fortis-it.de">Stephen Friedrich</a> * @author <a href="mailto:fabian.urban@fortis-it.de">Fabian Urban</a> * * @copyright (c) 2011 Fortis IT Services GmbH * @license Ext.ux.form.field.ClearButton is released under the * <a target="_blank" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>. * */ Ext.define('Ext.ux.form.field.ClearButton', { alias: 'plugin.clearbutton', /** * @cfg {Boolean} Hide the clear button when the field is empty (default: true). */ hideClearButtonWhenEmpty: true, /** * @cfg {Boolean} Hide the clear button until the mouse is over the field (default: true). */ hideClearButtonWhenMouseOut: true, /** * @cfg {Boolean} When the clear buttons is hidden/shown, this will animate the button to its new state (using opacity) (default: true). */ animateClearButton: true, /** * @cfg {Boolean} Empty the text field when ESC is pressed while the text field is focused. */ clearOnEscape: true, /** * @cfg {String} CSS class used for the button div. * Also used as a prefix for other classes (suffixes: '-mouse-over-input', '-mouse-over-button', '-mouse-down', '-on', '-off') */ clearButtonCls: 'ext-ux-clearbutton', /** * The text field (or text area, combo box, date field) that we are attached to */ textField: null, /** * Will be set to true if animateClearButton is true and the browser supports CSS 3 transitions * @private */ animateWithCss3: false, ///////////////////////////////////////////////////////////////////////////////////////////////////// // // Set up and tear down // ///////////////////////////////////////////////////////////////////////////////////////////////////// constructor: function(cfg) { Ext.apply(this, cfg); this.callParent(arguments); }, /** * Called by plug-in system to initialize the plugin for a specific text field (or text area, combo box, date field). * Most all the setup is delayed until the component is rendered. */ init: function(textField) { this.textField = textField; if (!textField.rendered) { textField.on('afterrender', this.handleAfterRender, this); } else { // probably an existing input element transformed to extjs field this.handleAfterRender(); } }, /** * After the field has been rendered sets up the plugin (create the Element for the clear button, attach listeners). * @private */ handleAfterRender: function(textField) { this.isTextArea = (this.textField.inputEl.dom.type.toLowerCase() == 'textarea'); this.createClearButtonEl(); this.addListeners(); this.repositionClearButton(); this.updateClearButtonVisibility(); this.addEscListener(); }, /** * Creates the Element and DOM for the clear button */ createClearButtonEl: function() { var animateWithClass = this.animateClearButton && this.animateWithCss3; this.clearButtonEl = this.textField.bodyEl.createChild({ tag: 'div', cls: this.clearButtonCls }); if(this.animateClearButton) { this.animateWithCss3 = this.supportsCssTransition(this.clearButtonEl); } if(this.animateWithCss3) { this.clearButtonEl.addCls(this.clearButtonCls + '-off'); } else { this.clearButtonEl.setStyle('visibility', 'hidden'); } }, /** * Returns true iff the browser supports CSS 3 transitions * @param el an element that is checked for support of the "transition" CSS property (considering any * vendor prefixes) */ supportsCssTransition: function(el) { var styles = ['transitionProperty', 'WebkitTransitionProperty', 'MozTransitionProperty', 'OTransitionProperty', 'msTransitionProperty', 'KhtmlTransitionProperty']; var style = el.dom.style; for(var i = 0, length = styles.length; i < length; ++i) { if(style[styles[i]] !== 'undefined') { // Supported property will result in empty string return true; } } return false; }, /** * If config option "clearOnEscape" is true, then add a key listener that will clear this field */ addEscListener: function() { if (!this.clearOnEscape) { return; } // Using a KeyMap did not work: ESC is swallowed by combo box and date field before it reaches our own KeyMap this.textField.inputEl.on('keydown', function(e) { if (e.getKey() == Ext.EventObject.ESC) { if (this.textField.isExpanded) { // Let combo box or date field first remove the popup return; } // No idea why the defer is necessary, but otherwise the call to setValue('') is ignored Ext.Function.defer(this.textField.setValue, 1, this.textField, ['']); e.stopEvent(); } }, this); }, /** * Adds listeners to the field, its input element and the clear button to handle resizing, mouse over/out events, click events etc. */ addListeners: function() { // listeners on input element (DOM/El level) var textField = this.textField; var bodyEl = textField.bodyEl; bodyEl.on('mouseover', this.handleMouseOverInputField, this); bodyEl.on('mouseout', this.handleMouseOutOfInputField, this); // listeners on text field (component level) textField.on('destroy', this.handleDestroy, this); textField.on('resize', this.repositionClearButton, this); textField.on('change', function() { this.repositionClearButton(); this.updateClearButtonVisibility(); }, this); // listeners on clear button (DOM/El level) var clearButtonEl = this.clearButtonEl; clearButtonEl.on('mouseover', this.handleMouseOverClearButton, this); clearButtonEl.on('mouseout', this.handleMouseOutOfClearButton, this); clearButtonEl.on('mousedown', this.handleMouseDownOnClearButton, this); clearButtonEl.on('mouseup', this.handleMouseUpOnClearButton, this); clearButtonEl.on('click', this.handleMouseClickOnClearButton, this); }, /** * When the field is destroyed, we also need to destroy the clear button Element to prevent memory leaks. */ handleDestroy: function() { this.clearButtonEl.destroy(); }, ///////////////////////////////////////////////////////////////////////////////////////////////////// // // Mouse event handlers // ///////////////////////////////////////////////////////////////////////////////////////////////////// /** * Tada - the real action: If user left clicked on the clear button, then empty the field */ handleMouseClickOnClearButton: function(event, htmlElement, object) { if (!this.isLeftButton(event)) { return; } this.textField.setValue(''); this.textField.focus(); }, handleMouseOverInputField: function(event, htmlElement, object) { this.clearButtonEl.addCls(this.clearButtonCls + '-mouse-over-input'); if (event.getRelatedTarget() == this.clearButtonEl.dom) { // Moused moved to clear button and will generate another mouse event there. // Handle it here to avoid duplicate updates (else animation will break) this.clearButtonEl.removeCls(this.clearButtonCls + '-mouse-over-button'); this.clearButtonEl.removeCls(this.clearButtonCls + '-mouse-down'); } this.updateClearButtonVisibility(); }, handleMouseOutOfInputField: function(event, htmlElement, object) { this.clearButtonEl.removeCls(this.clearButtonCls + '-mouse-over-input'); if (event.getRelatedTarget() == this.clearButtonEl.dom) { // Moused moved from clear button and will generate another mouse event there. // Handle it here to avoid duplicate updates (else animation will break) this.clearButtonEl.addCls(this.clearButtonCls + '-mouse-over-button'); } this.updateClearButtonVisibility(); }, handleMouseOverClearButton: function(event, htmlElement, object) { event.stopEvent(); if (this.textField.bodyEl.contains(event.getRelatedTarget())) { // has been handled in handleMouseOutOfInputField() to prevent double update return; } this.clearButtonEl.addCls(this.clearButtonCls + '-mouse-over-button'); this.updateClearButtonVisibility(); }, handleMouseOutOfClearButton: function(event, htmlElement, object) { event.stopEvent(); if (this.textField.bodyEl.contains(event.getRelatedTarget())) { // will be handled in handleMouseOverInputField() to prevent double update return; } this.clearButtonEl.removeCls(this.clearButtonCls + '-mouse-over-button'); this.clearButtonEl.removeCls(this.clearButtonCls + '-mouse-down'); this.updateClearButtonVisibility(); }, handleMouseDownOnClearButton: function(event, htmlElement, object) { if (!this.isLeftButton(event)) { return; } this.clearButtonEl.addCls(this.clearButtonCls + '-mouse-down'); }, handleMouseUpOnClearButton: function(event, htmlElement, object) { if (!this.isLeftButton(event)) { return; } this.clearButtonEl.removeCls(this.clearButtonCls + '-mouse-down'); }, ///////////////////////////////////////////////////////////////////////////////////////////////////// // // Utility methods // ///////////////////////////////////////////////////////////////////////////////////////////////////// /** * Repositions the clear button element based on the textfield.inputEl element * @private */ repositionClearButton: function() { var clearButtonEl = this.clearButtonEl; if (!clearButtonEl) { return; } var clearButtonPosition = this.calculateClearButtonPosition(this.textField); clearButtonEl.dom.style.right = clearButtonPosition.right + 'px'; clearButtonEl.dom.style.top = clearButtonPosition.top + 'px'; }, /** * Calculates the position of the clear button based on the textfield.inputEl element * @private */ calculateClearButtonPosition: function(textField) { var positions = textField.inputEl.getBox(true, true); var top = positions.y; var right = positions.x; if (this.fieldHasScrollBar()) { right += Ext.getScrollBarWidth(); } if (this.textField.triggerWrap) { right += this.textField.getTriggerWidth(); } return { right: right, top: top }; }, /** * Checks if the field we are attached to currently has a scrollbar */ fieldHasScrollBar: function() { if (!this.isTextArea) { return false; } var inputEl = this.textField.inputEl; var overflowY = inputEl.getStyle('overflow-y'); if (overflowY == 'hidden' || overflowY == 'visible') { return false; } if (overflowY == 'scroll') { return true; } //noinspection RedundantIfStatementJS if (inputEl.dom.scrollHeight <= inputEl.dom.clientHeight) { return false; } return true; }, /** * Small wrapper around clearButtonEl.isVisible() to handle setVisible animation that may still be in progress. */ isButtonCurrentlyVisible: function() { if (this.animateClearButton && this.animateWithCss3) { return this.clearButtonEl.hasCls(this.clearButtonCls + '-on'); } // This should not be necessary (see Element.setVisible/isVisible), but else there is confusion about visibility // when moving the mouse out and _quickly_ over then input again. var cachedVisible = Ext.core.Element.data(this.clearButtonEl.dom, 'isVisible'); if (typeof(cachedVisible) == 'boolean') { return cachedVisible; } return this.clearButtonEl.isVisible(); }, /** * Checks config options and current mouse status to determine if the clear button should be visible. */ shouldButtonBeVisible: function() { if (this.hideClearButtonWhenEmpty && Ext.isEmpty(this.textField.getValue())) { return false; } var clearButtonEl = this.clearButtonEl; //noinspection RedundantIfStatementJS if (this.hideClearButtonWhenMouseOut && !clearButtonEl.hasCls(this.clearButtonCls + '-mouse-over-button') && !clearButtonEl.hasCls(this.clearButtonCls + '-mouse-over-input')) { return false; } return true; }, /** * Called after any event that may influence the clear button visibility. */ updateClearButtonVisibility: function() { var oldVisible = this.isButtonCurrentlyVisible(); var newVisible = this.shouldButtonBeVisible(); var clearButtonEl = this.clearButtonEl; if (oldVisible != newVisible) { if(this.animateClearButton && this.animateWithCss3) { this.clearButtonEl.removeCls(this.clearButtonCls + (oldVisible ? '-on' : '-off')); clearButtonEl.addCls(this.clearButtonCls + (newVisible ? '-on' : '-off')); } else { clearButtonEl.stopAnimation(); clearButtonEl.setVisible(newVisible, this.animateClearButton); } // Set background-color of clearButton to same as field's background-color (for those browsers/cases // where the padding-right (see below) does not work) clearButtonEl.setStyle('background-color', this.textField.inputEl.getStyle('background-color')); // Adjust padding-right of the input tag to make room for the button // IE (up to v9) just ignores this and Gecko handles padding incorrectly with textarea scrollbars if (!(this.isTextArea && Ext.isGecko) && !Ext.isIE) { // See https://bugzilla.mozilla.org/show_bug.cgi?id=157846 var deltaPaddingRight = clearButtonEl.getWidth() - this.clearButtonEl.getMargin('l'); var currentPaddingRight = this.textField.inputEl.getPadding('r'); var factor = (newVisible ? +1 : -1); this.textField.inputEl.dom.style.paddingRight = (currentPaddingRight + factor * deltaPaddingRight) + 'px'; } } }, isLeftButton: function(event) { return event.button === 0; } });})();第三步:引用。做了一个demo:
{ xtype: 'datefield', fieldLabel: 'Best Before', plugins: ['clearbutton'], value: new Date() }
加入
plugins: ['clearbutton']
就可以了
第四步:删除图标要放到image文件夹下
上传图片中的clear-text-icon.gif
源码有,可以留言给大家共享
0 0
- Extjs日期控件(date),文本框(textfield)和下拉(combo)的清空控件
- Extjs Combo控件 下拉选择之后的事件触发
- 递归清空窗体上 所有文本框,下拉框中的文本。(修改封装成控件)
- 递归清空窗体上 所有文本框,下拉框中的文本。(修改封装成控件)
- 日期控件增加清空按钮
- bootstrap datetimepicker 日期控件清空问题
- 清空控件的值
- VB清空窗体内所有文本框(其他控件同理)
- Struts2里面 s:textfield标签 Date类型的格式化以及日期时间控件使用
- easyui 中日期控件清空文本框的值之后,获取仍有值
- 清空所有控件的文字信息 和MD5加密
- dropdownlist textbox 结合,下拉框和文本框结合的控件
- easyui月份控件和清空按钮
- 清空 重置 控件
- 设置Combo box控件的下拉列表的长度
- 关于Combo控件下拉框自动弹出的问题
- 清空File控件的内容
- 清空panel的edit控件文字
- iOS设计模式:观察者
- 关于Windows Media Services的几个问题
- Consumers shopping in the flagship store
- my debut twelve years
- Ubuntu 12.04 root用户登录设置
- Extjs日期控件(date),文本框(textfield)和下拉(combo)的清空控件
- Server at localhost was unable to start within 45 seconds解决办法
- KVO 接收变更通知 observeValueForKeyPath:ofObject:change:context:
- QuartusII 调用ModelSim_Altera仿真步骤
- 设备文件 和 udev
- Xcode 5.1安装插件:规范注释生成器VVDocumenter
- mark 博客的搭建
- android之android:layout_weight详解
- [SGU 102] Coprimes [欧拉函数]