From a9a2b24f49eb9fd6a0cbfbf730b67b8e12ff6789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B4=A4=E5=BF=83?= <3277200+sentsim@users.noreply.github.com> Date: Fri, 13 Jan 2023 03:44:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=A1=86=E5=8A=A8=E6=80=81=E7=82=B9=E7=BC=80=20=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/form.js | 123 ++++++++++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 45 deletions(-) diff --git a/src/modules/form.js b/src/modules/form.js index 1d60d670..bf288d99 100644 --- a/src/modules/form.js +++ b/src/modules/form.js @@ -158,73 +158,106 @@ layui.define(['layer', 'util'], function(exports){ // 初始化全局的 autocomplete options.autocomplete && inputs.attr('autocomplete', options.autocomplete); - // 初始化 input 套件 + // 初始化输入框动态点缀 elemForm.find('input[lay-affix],textarea[lay-affix]').each(function(){ var othis = $(this); var affix = othis.attr('lay-affix'); var CLASS_SUFFIX = 'layui-input-suffix'; - var elemNext = othis.next('.'+ CLASS_SUFFIX); + var CLASS_AFFIX = 'layui-input-affix'; var disabled = othis.is('[disabled]') || othis.is('[readonly]'); - var hideElem = function(elem, value){ - if(!elem) return; + + // 根据是否空值来显示或隐藏元素 + var showAffix = function(elem, value){ + elem = $(elem); + if(!elem[0]) return; elem[$.trim(value) ? 'removeClass' : 'addClass'](HIDE); }; - var renderSuffix = function(type, _disabled){ - elemNext.remove(); - elemNext = $(['
' - ,'' - ,'
'].join('')); + + // 渲染动态点缀内容 + var renderAffix = function(){ + var opts = affixOptions[affix] || { + value: affix + }; + var elemAffix = $('
'); + var elemIcon = $(''); - othis.after(elemNext); - hideElem(elemNext, othis.val()); + elemAffix.append(elemIcon); + + // 移除旧的元素 + var hasElemAffix = othis.next('.'+ CLASS_AFFIX); + if(hasElemAffix[0]) hasElemAffix.remove(); + + // 是否已经存在后缀元素 + var hasElemSuffix = othis.next('.'+ CLASS_SUFFIX); + if(hasElemSuffix[0]){ + hasElemAffix = hasElemSuffix.find('.'+ CLASS_AFFIX); + if(hasElemAffix[0]) hasElemAffix.remove(); + + hasElemSuffix.prepend(elemAffix); + + othis.css('padding-right', function(){ + var paddingRight = othis.closest('.layui-input-group')[0] + ? 0 + : hasElemSuffix.outerWidth(); + return paddingRight + elemAffix.outerWidth() + }); + } else { + elemAffix.addClass(CLASS_SUFFIX); + othis.after(elemAffix); + } + + opts.show === 'auto' && showAffix(elemAffix, othis.val()); // 输入事件 othis.on('input propertychange', function(){ var value = this.value; - hideElem(elemNext, value); + opts.show === 'auto' && showAffix(elemAffix, value); }); - // 点击后缀套件事件 - elemNext.on('click', function(){ - var filter = othis.attr('lay-filter'); - if($(this).is('[disabled]')) return; - obj[affix] && obj[affix][1].call(this); + // 点击动态后缀事件 + elemIcon.on('click', function(){ + var inputFilter = othis.attr('lay-filter'); + if($(this).hasClass(DISABLED)) return; + + typeof opts.click === 'function' && opts.click.call(this, othis, opts); // 对外事件 - layui.event.call(this, MOD_NAME, 'input-affix('+ filter +')', { - elem: othis[0] - ,affix: affix + layui.event.call(this, MOD_NAME, 'input-affix('+ inputFilter +')', { + elem: othis[0], + affix: affix, + options: opts }); }); }; - // 渲染内置套件 - var obj = { - // 清空 - clear: [function(){ // 渲染 - renderSuffix('clear', disabled); - }, function(){ // 事件 - othis.val('').focus(); - hideElem(elemNext, null); - }] - - // 密码显隐 - ,eye: [function(){ // 渲染 - renderSuffix('eye-invisible'); - }, function(){ // 事件 - var SHOW_NAME = 'LAY_FORM_INPUT_AFFIX_SHOW'; - var isShow = othis.data(SHOW_NAME); - - othis.attr('type', isShow ? 'password' : 'text').data(SHOW_NAME, !isShow); - renderSuffix(isShow ? 'eye-invisible' : 'eye'); - }] + // 动态点缀配置项 + var affixOptions = { + eye: { // 密码显隐 + value: 'eye-invisible', + click: function(elem, opts){ // 事件 + var SHOW_NAME = 'LAY_FORM_INPUT_AFFIX_SHOW'; + var isShow = elem.data(SHOW_NAME); + + elem.attr('type', isShow ? 'password' : 'text').data(SHOW_NAME, !isShow); + + opts.value = isShow ? 'eye-invisible' : 'eye'; + renderAffix(); + } + }, + clear: { // 内容清除 + value: 'clear', + click: function(elem){ + elem.val('').focus(); + showAffix($(this).parent(), null); + }, + show: 'auto', // 根据输入框值是否来显示或隐藏点缀图标 + disabled: disabled // 跟随输入框禁用状态 + } }; - obj[affix] && obj[affix][0](); + renderAffix(); }); }