mdui
Version:
a CSS Framework based on material design
148 lines (147 loc) • 5.25 kB
JavaScript
import $ from 'mdui.jq/es/$';
import extend from 'mdui.jq/es/functions/extend';
import 'mdui.jq/es/methods/addClass';
import 'mdui.jq/es/methods/appendTo';
import 'mdui.jq/es/methods/attr';
import 'mdui.jq/es/methods/each';
import 'mdui.jq/es/methods/find';
import 'mdui.jq/es/methods/is';
import 'mdui.jq/es/methods/on';
import 'mdui.jq/es/methods/outerHeight';
import 'mdui.jq/es/methods/parent';
import 'mdui.jq/es/methods/parents';
import 'mdui.jq/es/methods/remove';
import 'mdui.jq/es/methods/removeClass';
import 'mdui.jq/es/methods/text';
import 'mdui.jq/es/methods/trigger';
import 'mdui.jq/es/methods/val';
import { isUndefined } from 'mdui.jq/es/utils';
import mdui from '../../mdui';
import '../../global/mutation';
import { $document } from '../../utils/dom';
const defaultData = {
reInit: false,
domLoadedEvent: false,
};
/**
* 输入框事件
* @param event
* @param data
*/
function inputEvent(event, data = {}) {
data = extend({}, defaultData, data);
const input = event.target;
const $input = $(input);
const eventType = event.type;
const value = $input.val();
// 文本框类型
const inputType = $input.attr('type') || '';
if (['checkbox', 'button', 'submit', 'range', 'radio', 'image'].indexOf(inputType) > -1) {
return;
}
const $textfield = $input.parent('.mdui-textfield');
// 输入框是否聚焦
if (eventType === 'focus') {
$textfield.addClass('mdui-textfield-focus');
}
if (eventType === 'blur') {
$textfield.removeClass('mdui-textfield-focus');
}
// 输入框是否为空
if (eventType === 'blur' || eventType === 'input') {
value
? $textfield.addClass('mdui-textfield-not-empty')
: $textfield.removeClass('mdui-textfield-not-empty');
}
// 输入框是否禁用
input.disabled
? $textfield.addClass('mdui-textfield-disabled')
: $textfield.removeClass('mdui-textfield-disabled');
// 表单验证
if ((eventType === 'input' || eventType === 'blur') &&
!data.domLoadedEvent &&
input.validity) {
input.validity.valid
? $textfield.removeClass('mdui-textfield-invalid-html5')
: $textfield.addClass('mdui-textfield-invalid-html5');
}
// textarea 高度自动调整
if ($input.is('textarea')) {
// IE bug:textarea 的值仅为多个换行,不含其他内容时,textarea 的高度不准确
// 此时,在计算高度前,在值的开头加入一个空格,计算完后,移除空格
const inputValue = value;
let hasExtraSpace = false;
if (inputValue.replace(/[\r\n]/g, '') === '') {
$input.val(' ' + inputValue);
hasExtraSpace = true;
}
// 设置 textarea 高度
$input.outerHeight('');
const height = $input.outerHeight();
const scrollHeight = input.scrollHeight;
if (scrollHeight > height) {
$input.outerHeight(scrollHeight);
}
// 计算完,还原 textarea 的值
if (hasExtraSpace) {
$input.val(inputValue);
}
}
// 实时字数统计
if (data.reInit) {
$textfield.find('.mdui-textfield-counter').remove();
}
const maxLength = $input.attr('maxlength');
if (maxLength) {
if (data.reInit || data.domLoadedEvent) {
$('<div class="mdui-textfield-counter">' +
`<span class="mdui-textfield-counter-inputed"></span> / ${maxLength}` +
'</div>').appendTo($textfield);
}
$textfield
.find('.mdui-textfield-counter-inputed')
.text(value.length.toString());
}
// 含 帮助文本、错误提示、字数统计 时,增加文本框底部内边距
if ($textfield.find('.mdui-textfield-helper').length ||
$textfield.find('.mdui-textfield-error').length ||
maxLength) {
$textfield.addClass('mdui-textfield-has-bottom');
}
}
$(() => {
// 绑定事件
$document.on('input focus blur', '.mdui-textfield-input', { useCapture: true }, inputEvent);
// 可展开文本框展开
$document.on('click', '.mdui-textfield-expandable .mdui-textfield-icon', function () {
$(this)
.parents('.mdui-textfield')
.addClass('mdui-textfield-expanded')
.find('.mdui-textfield-input')[0]
.focus();
});
// 可展开文本框关闭
$document.on('click', '.mdui-textfield-expanded .mdui-textfield-close', function () {
$(this)
.parents('.mdui-textfield')
.removeClass('mdui-textfield-expanded')
.find('.mdui-textfield-input')
.val('');
});
/**
* 初始化文本框
*/
mdui.mutation('.mdui-textfield', function () {
$(this).find('.mdui-textfield-input').trigger('input', {
domLoadedEvent: true,
});
});
});
mdui.updateTextFields = function (selector) {
const $elements = isUndefined(selector) ? $('.mdui-textfield') : $(selector);
$elements.each((_, element) => {
$(element).find('.mdui-textfield-input').trigger('input', {
reInit: true,
});
});
};