lu2
Version:
Simple and flexible UI component library based on native HTML and JavaScript
221 lines (185 loc) • 6.25 kB
JavaScript
/**
* @ErrorTip.js
* @author zhangxinxu
* @version
* Created: 15-07-01
*/
(function (global, factory) {
if (typeof define === 'function' && (define.amd || define.cmd)) {
define(factory);
} else {
global.ErrorTip = factory();
}
}(this, function (require) {
if (typeof require == 'function') {
require('common/ui/Follow');
} else if (!$().follow) {
if (window.console) {
window.console.error('need Follow.js');
}
return {};
}
/**
* 红色的tips错误提示效果
* 支持jQuery包装器调用以及模块化调用
* @example
* $().tips(options);
* new Tips(el, options)
**/
// 类名变量
var CL = 'ui-tips';
var prefixTips = CL + '-';
// 同时支持jQuery链式调用
$.fn.errorTip = function(content, options) {
return $(this).each(function() {
new ErrorTip($(this), content, options);
});
};
/**
* 红色的tips错误提示效果
* @param {Object} el 红色tips显示在哪个元素上
* @param {String} content tips里面显示的内容
* @param {Object} options 可选参数
*/
var ErrorTip = function(el, content, options) {
var defaults = {
unique: true,
align: 'center',
onShow: $.noop,
onHide: $.noop
};
var params = $.extend({}, defaults, options || {});
// 要显示的字符内容
if ($.isFunction(content)) {
content = content();
}
if (typeof content != 'string') {
return this;
}
var self = this;
// 一些元素
var trigger = el;
var tips, before, after;
if (params.unique == true && window.errorTip) {
tips = window.errorTip.data('trigger', trigger);
} else if (params.unique == false && trigger.data('errorTip')) {
tips = trigger.data('errorTip');
} else {
tips = $('<div class="' + prefixTips + 'x ' + prefixTips + 'error"></div>');
before = $('<span></span>').addClass(prefixTips + 'before');
after = $('<i></i>').addClass(prefixTips + 'after');
$(document.body).append(tips.append(before).append(after));
// 如果是唯一模式,全局存储
if (params.unique == true) {
window.errorTip = tips.data('trigger', trigger);
} else {
trigger.data('errorTip', tips);
}
// 任何键盘操作,点击,或者拉伸都会隐藏错误提示框
$(document).bind({
keydown: function(event) {
// ctrl/shift键等不隐藏
if (event.keyCode != 16 && event.keyCode != 17) {
self.hide();
}
},
mousedown: function(event) {
var activeElement = document.activeElement;
var activeTrigger = tips.data('trigger');
var activeTarget = event.target;
if (activeElement && activeTrigger && activeElement == activeTarget &&
activeElement == activeTrigger.get(0) &&
// 这个与Datalist.js关联
activeTrigger.data('focus') == false
) {
return;
}
self.hide();
}
});
$(window).bind({
resize: function () {
self.hide();
}
});
}
this.el = {
trigger: el,
tips: tips,
before: before || tips.find('span'),
after: after || tips.find('i')
};
this.callback = {
show: params.onShow,
hide: params.onHide
};
this.cl = CL;
this.align = params.align;
this.show(content);
return this;
};
/**
* 错误tips提示显示方法
* @param {String} content 错误显示的文字内容
* @return {Object} 返回当前实例对象
*/
ErrorTip.prototype.show = function (content) {
var el = this.el;
// 触发元素和提示元素
var tips = el.tips;
var trigger = el.trigger;
// 两个元素
var before = el.before;
var after = el.after;
// 修改content内容
before.html(content);
var align = this.align;
// 水平偏移大小
var offsetX = 0;
if (align == 'left') {
offsetX = -0.5 * before.width() + parseInt(before.css('padding-left')) || 0;
} else if (align == 'right') {
offsetX = 0.5 * before.width() - parseInt(before.css('padding-right')) || 0;
} else if (typeof align == 'number') {
offsetX = align;
}
after.css({
// 尖角的位置永远对准元素
left: offsetX
});
// 定位
tips.follow(trigger, {
align: align,
// trigger-target
position: '5-7',
// 边界溢出不自动修正
edgeAdjust: false
});
tips.show();
// aria提示
trigger.attr('aria-label', '错误提示:' + content);
// 显示的回调
if (this.callback && this.callback.show) {
this.callback.show.call(trigger.addClass('error valided'), tips);
}
return this;
};
/**
* 错误tips提示隐藏方法
* @return {Object} 返回当前实例对象
*/
ErrorTip.prototype.hide = function () {
var tips = this.el.tips;
var trigger = this.el.trigger;
trigger.removeAttr('aria-label');
if (tips.css('display') != 'none') {
tips.hide();
// 隐藏的回调
if (this.callback && this.callback.hide) {
this.callback.hide.call((tips.data('trigger') || trigger).removeClass('error'), tips);
}
}
return this;
};
return ErrorTip;
}));