请求解析压缩JavaScript代码并将其展开为可读格式,同时验证自行展开版本的正确性
解析压缩的jQuery表单交互代码
没问题!我来帮你把这段压缩的jQuery代码彻底展开、梳理清楚,还会帮你检查你自己写的展开版本是否正确。
首先,这段代码的核心功能是:给带有.input-required类的容器内的输入框、下拉框、文本域绑定事件,用来控制容器内<span>元素的样式——这个<span>大概率是作为输入提示/placeholder使用的。
一、完全展开且保留原逻辑的代码
先把两段压缩代码完整展开,还原原逻辑:
// 给目标输入元素绑定聚焦(focusin)和按键抬起(keyup)事件 $('.input-required input, .input-required select, .input-required textarea').on('focusin keyup', function () { // 获取当前输入元素父容器内span的文本内容 var inputSpanText = $(this).parent().find('span').text(); // 缓存当前输入元素和对应的span,减少重复DOM查询 var $currentInput = $(this); var $spanLabel = $currentInput.parent().find('span'); // 条件1:输入值不等于span的提示文本,且输入值不为空 if ($currentInput.val() !== inputSpanText && $currentInput.val() !== '') { $spanLabel.addClass('input-style-1-active').removeClass('input-style-1-inactive'); } // 条件2:输入值为空 if ($currentInput.val() === '') { $spanLabel.removeClass('input-style-1-inactive input-style-1-active'); } }); // 给目标输入元素绑定失焦(focusout)事件 $('.input-required input, .input-required select, .input-required textarea').on('focusout', function () { var $currentInput = $(this); var $spanLabel = $currentInput.parent().find('span'); // 条件:输入值为空 if ($currentInput.val() === '') { $spanLabel.removeClass('input-style-1-inactive input-style-1-active'); } // 无论输入值是否为空,都添加失效样式 $spanLabel.addClass('input-style-1-inactive'); });
二、检查你自行展开的代码
你给出的第一段展开代码如下:
$('.input-required input, .input-required select, .input-required textarea').on('focusin keyup', function () { var inputSpan = $(this).parent().find('span').text(); if(($(this).val() != inputSpan) && ('' != $(this).val())){ $(this).parent().find('span').addClass('input-style-1-active').removeClass('input-style-1-inactive'); }else{ $(this).parent().find('span').removeClass('input-style-1-inactive input-style-1-active'); } });
这里存在一个逻辑偏差:原压缩代码中的两个操作是独立的条件判断,而非if-else的互斥关系。原代码用逗号分隔了两个表达式:
$(this).val() != inputSpan && '' != $(this).val() && 操作1, '' === $(this).val() && 操作2
它的意思是:
- 满足第一个条件时执行操作1;
- 满足第二个条件(输入为空)时执行操作2;
- 两个条件不会同时触发,但也不是“非此即彼”——比如如果输入值等于span的提示文本但不为空,原逻辑不会执行任何操作,而你的
else分支会直接移除所有样式,这就改变了原逻辑。
三、更优化的可读性版本
我再整理一个更易读、性能更优的版本:缓存DOM元素避免重复查询,用清晰的变量名,统一条件写法:
// 提前缓存目标元素,避免重复书写选择器和DOM查询 const $formElements = $('.input-required input, .input-required select, .input-required textarea'); // 聚焦/输入时的处理逻辑 $formElements.on('focusin keyup', function() { const $currentInput = $(this); const $spanLabel = $currentInput.parent().find('span'); const spanHintText = $spanLabel.text(); const inputValue = $currentInput.val(); // 输入有效(非空且不等于提示文本):激活提示样式 if (inputValue !== '' && inputValue !== spanHintText) { $spanLabel.addClass('input-style-1-active').removeClass('input-style-1-inactive'); } // 输入为空:移除所有状态样式 else if (inputValue === '') { $spanLabel.removeClass('input-style-1-active input-style-1-inactive'); } // 输入值等于提示文本:不做操作(保留原有样式) }); // 失焦时的处理逻辑 $formElements.on('focusout', function() { const $currentInput = $(this); const $spanLabel = $currentInput.parent().find('span'); const inputValue = $currentInput.val(); if (inputValue === '') { $spanLabel.removeClass('input-style-1-active input-style-1-inactive'); } // 失焦后统一添加失效样式 $spanLabel.addClass('input-style-1-inactive'); });
四、整体逻辑总结
- 聚焦/输入时:
- 用户输入了有效内容(非空且和提示文本不同)→ 给提示
<span>加激活样式,移除失效样式; - 用户清空输入→ 移除提示
<span>的所有状态样式; - 输入值等于提示文本→ 不改变样式。
- 用户输入了有效内容(非空且和提示文本不同)→ 给提示
- 失焦时:
- 输入为空→ 移除所有状态样式;
- 无论输入内容如何,最终给提示
<span>加上失效样式。
内容的提问来源于stack exchange,提问作者NovaYear
相关产品推荐
相关产品推荐

