(function ($) { /** * 按钮控件。可以设置不同的按钮风格。 * * @example * var $div = $('<div>').appendTo('body'); * var button = new FR.QuickButton({ * renderEl : $div, * text : '按钮小学生', * decoration : 'line-through', * handler : function() {alert('我是一个小学生!')} * }); * * @class FR.QuickButton * @extends FR.Widget * * @cfg {JSON} options 配置属性 * @cfg {'center'/'left'/'right'} [options.alignment='center'] 文字对齐方式 * @cfg {String} options.text 按钮上的文字 * @cfg {String} [options.icon] 按钮的图标。形如: css:fr-btn-icon获取直接fr-btn-icon * @cfg {String} [options.iconPath] 按钮的图标路径 * @cfg {Number} [options.iconWidth=24] 图标的宽度 * @cfg {Number} [options.iconHeight=16] 图标的高度 * @cfg {Number} [options.width=80] 按钮的宽度 * @cfg {Number} [options.height=28] 按钮的高度 * @cfg {'blue'/'gray'/'green'} [options.style='blue'] 按钮的样式 * @cfg {String} [options.fontfamily] 字体类型 * @cfg {String} [options.fontstyle] 字体样式 * @cfg {String} [options.fontweight] 字体粗细 * @cfg {String} [options.fontsize] 字体大小,形如 12px * @cfg {'none'/'underline'/'overline'/'line-through'/'inherit'} [options.decoration] 文字的修饰类型 * @cfg {String} [options.color] 文字的颜色 */ FR.QuickButton = FR.extend(FR.Widget, /**@class FR.QuickButton*/{ /** * @private */ _defaultConfig: function () { return $.extend(FR.QuickButton.superclass._defaultConfig.apply(this, arguments), { baseCls: 'fr-core-btn', alignment: "center", text: null, icon: null, iconPath: null, width: 80, height: 28, iconWidth: 24, iconHeight : 16, style: null //可以有gray,green和blue共3种样式 }); }, /** * @private */ _init: function () { FR.QuickButton.superclass._init.apply(this, arguments); var opts = this.options; var self = this; // 默认样式为gray,如果设置了样式,检查其是否是合法样式 var defaultStyle = "gray"; $.each(["gray", "green", "blue"], function (i, item) { if (opts.style && item == opts.style.toLowerCase()) { defaultStyle = opts.style.toLowerCase(); } }); var hoverCls = 'fr-core-btn-hover' + '-' + defaultStyle; this.element.addClass("fr-core-btn-style-" + defaultStyle); this.$inner = $("<div class='fr-core-btn-inner'></div>").appendTo(this.element); /** * @property {jQuery} $text 显示按钮文字的dom对象 */ this.$text = $("<span class='fr-core-btn-text' onselectstart='return false'></span>").appendTo(this.$inner); this._initTextFont(); this.$text.css({textAlign: opts.alignment}); if (opts.text) { this.$text.text(opts.text); } opts.iconWidth = (opts.icon || opts.iconPath) ? opts.iconWidth : 0; if (opts.iconWidth > 0) { /** * @property {jQuery} $icon 显示按钮图标的dom对象 */ this.$icon = $("<span class='fr-core-btn-icon'></span>").css({ position: 'absolute', width: opts.iconWidth, height : opts.iconHeight, top: 0, left: 0}).appendTo(this.$inner); if (opts.icon) { if (opts.icon.indexOf("css:") != -1) { opts.icon = opts.icon.substring(4); } this.$icon.addClass(opts.icon); } else if (opts.iconPath) { this.$icon.css({ background : "url('" + opts.iconPath + "') no-repeat center" }); } } this.$text.css({left: opts.iconWidth}); this.doResize({width : opts.width, height: opts.height}); if ($.isFunction(opts.handler)) { this.on(FR.Events.CLICK, opts.handler.createDelegate(opts.scope || this)); } this.element.hover(function(){ $(this).addClass(hoverCls); }, function(){ $(this).removeClass(hoverCls); }); this.$inner.click(function(e){ self.fireEvent(FR.Events.CLICK, e); }); }, /** * 初始化按钮上的文字样式 * @private */ _initTextFont: function () { var opts = this.options; if (opts.color) { this.$text.css('color', opts.color); } if (opts.decoration) { this.$text.css("text-decoration", opts.decoration); } if (opts.fontsize) { this.$text.css('fontSize', opts.fontsize); } if (opts.fontweight) { this.$text.css('fontWeight', opts.fontweight); } if (opts.fontstyle) { this.$text.css('fontStyle', opts.fontstyle); } if (opts.fontfamily) { this.$text.css('fontFamily', opts.fontfamily); } }, setValue: function (v) { if (!FR.isEmpty(v)) { this.$text.text(v); } }, getValue: function () { return this.$text.text(); }, setText: function (t) { this.setValue(t); }, getText: function () { return this.getValue(); }, doResize: function (give) { var opts = this.options; if (give) { if (give.width) { opts.width = give.width; } if (give.height) { opts.height = give.height; } if (give.left != null) { opts.left = give.left; } if (give.top != null) { opts.top = give.top; } } if(opts.left || opts.top){ this.element.css({ position: 'absolute', left: opts.left, top: opts.top }); } if (!isNaN(opts.width)) { var width = opts.width; var fixWidth = 0; if ($.support.boxModel === true) { fixWidth = (this.element.outerWidth() - this.element.width()); } if (!give.hasIgnoredBounds) { width = width - fixWidth; } this.element.css({width: width}); this.$inner.css({width : width}); this.$text.css({width : width - opts.iconWidth}); } if (!isNaN(opts.height)) { var height = opts.height; var fixHeight = 0; if ($.support.boxModel === true) { fixHeight = this.element.outerHeight() - this.element.height(); this.$icon && this.$icon.css({ height : opts.iconHeight, top : (this.element.outerHeight() - this.$icon.outerHeight()) /2 -fixHeight }); } else { this.$icon && this.$icon.css({ height : opts.iconHeight, top : (opts.height - opts.iconHeight) /2 }) } if (!give.hasIgnoredBounds) { height = height - fixHeight; } this.element.css({height: height}); this.$text.css('line-height', height+'px'); this.$text.css('height',height); this.$inner.css('height',height); this.$text.css('display','block');//Sean:莫名其妙,IE7文本模式下不加这句话有时候按钮上的字会不显示,貌似要重新刷一下css } } }); $.shortcut("quickbutton", FR.QuickButton); })(jQuery);