/**
* ESUI (Enterprise Simple UI)
* Copyright 2013 Baidu Inc. All rights reserved.
*
* @ignore
* @file 提示信息控件
* @author lisijin, dbear, otakustay
*/
define(
function (require) {
var u = require('underscore');
var Control = require('./Control');
var ui = require('./main');
require('./TipLayer');
/**
* 提示信息控件
*
* `Tip`控件是一个小图标,当鼠标移到图标上时,会出现一个层显示提示信息
*
* @extends Control
* @requires TipLayer
* @constructor
*/
function Tip(options) {
Control.apply(this, arguments);
}
/**
* 控件类型,始终为`"Tip"`
*
* @type {string}
* @readonly
* @override
*/
Tip.prototype.type = 'Tip';
/**
* 初始化参数
*
* @param {Object} [options] 构造函数传入的参数
* @protected
* @override
*/
Tip.prototype.initOptions = function (options) {
// 默认选项配置
var properties = {
title: '',
content: '',
/**
* @property {boolean} arrow
*
* 是否需要箭头
*
* 为了方便从DOM生成,此属性在初始化时如果为字符串`"false"`,
* 将被认为是布尔值`false`处理
*
* 具体参考{@link TipLayer#arrow}属性
*/
arrow: true,
/**
* @property {string} showMode
*
* 指定信息浮层的显示方案,
* 具体参考{@link TipLayer#attachTo}方法的`showMode`参数的说明
*/
showMode: 'over',
/**
* @property {number} delayTime
*
* 指定信息浮层的显示的延迟时间,以毫秒为单位,
* 具体参考{@link TipLayer#attachTo}方法的`delayTime`参数的说明
*/
delayTime: 500
};
if (options.arrow === 'false') {
options.arrow = false;
}
extractDOMProperties(this.main, properties);
u.extend(properties, options);
this.setProperties(properties);
};
* 从DOM中抽取`title`和`content`属性,如果有的话优先级低于外部给定的
*
* @param {HTMLElement} 主元素
* @param {Object} options 构造函数传入的参数
* @ignore
*/
function extractDOMProperties(main, options) {
options.title = options.title || main.getAttribute('title');
main.removeAttribute('title');
options.content = options.content || main.innerHTML;
main.innerHTML = '';
}
/**
* 初始化DOM结构
*
* @protected
* @override
*/
Tip.prototype.initStructure = function () {
var main = document.createElement('div');
document.body.appendChild(main);
var tipLayer = ui.create(
'TipLayer',
{
main: main,
childName: 'layer',
content: this.content,
title: this.title,
arrow: this.arrow,
/**
* @property {number} [layerWidth=200]
*
* 指定信息浮层的宽度,具体参考{@link TipLayer#width}属性
*/
width: this.layerWidth || 200,
viewContext: this.viewContext
}
);
this.addChild(tipLayer);
tipLayer.render();
var attachOptions = {
showMode: this.mode,
delayTime: this.delayTime,
targetControl: this,
positionOpt: {top: 'top', right: 'left'}
};
tipLayer.attachTo(attachOptions);
};
/**
* 重渲染
*
* @method
* @protected
* @override
*/
Tip.prototype.repaint = require('./painters').createRepaint(
Control.prototype.repaint,
{
name: 'title',
paint: function (tip, value) {
var layer = tip.getChild('layer');
if (layer) {
layer.setTitle(value);
}
}
},
{
name: 'content',
paint: function (tip, value) {
var layer = tip.getChild('layer');
if (layer) {
layer.setContent(value);
}
}
}
);
require('./lib').inherits(Tip, Control);
ui.register(Tip);
return Tip;
}
);