Firefox中实现表单未更新则禁用提交功能求助
解决Firefox中textarea未改变时禁用提交按钮失效的问题
嘿,我来帮你搞定这个Firefox适配的问题!你的代码核心逻辑没问题,但Firefox在textarea事件触发和表单序列化的细节上和Chrome有差异,咱们一步步调整:
原代码存在的几个关键问题
- 事件回调里未声明
event参数:Firefox对全局变量的处理更严格,直接使用event会抛出错误,而Chrome因为全局event对象的存在能正常运行。 - Firefox和Chrome对textarea空白的序列化不一致:你的初始textarea里有换行和空格,两边序列化后的值可能不同,导致初始状态判断错误。
- 跳过了select的变化判断:原代码里忽略了select的change事件,但用户选择用户后应该启用提交按钮,这个逻辑不合理。
- 初始禁用状态设置太绝对:直接把提交按钮设为
disabled=true,如果是编辑场景(表单已有内容)会导致不合理的禁用。
修改后的适配Firefox的代码
JS代码
$(function() { $('form').each(function() { const $form = $(this); // 先统一处理textarea的空白,避免跨浏览器序列化差异 $form.find('textarea').each(function() { $(this).val($(this).val().trim()); }); // 存储初始序列化值 $form.data('serialized', $form.serialize()); }).on('change input', function(event) { const $form = $(this); // 对比当前和初始的序列化值,决定是否禁用提交按钮 const isUnchanged = $form.serialize() === $form.data('serialized'); $form.find('input:submit, button:submit').attr('disabled', isUnchanged); }).find('input:submit, button:submit') // 初始状态根据序列化值动态判断,而不是强制禁用 .attr('disabled', function() { const $form = $(this).closest('form'); return $form.serialize() === $form.data('serialized'); }); });
优化后的HTML代码(规范格式,可选)
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.0.js"></script> <form action="page.php" method="post"> <textarea name="update" cols="50" rows="20"></textarea> Updation By<span style="font-weight: bold; color: rgb(204, 0, 0);">*</span> : <select required aria-required="true" name="user"> <option value="" selected disabled> - Select - </option> <option value="user1">User 1</option> <option value="user2">User 2</option> <option value="user3">User 3</option> </select><br><br> <input name="Submit" type="submit" value="Update"> </form>
关键修改点说明
- 声明
event参数:在事件回调函数里显式传入event,避免Firefox的报错。 - 统一textarea空白处理:用
trim()去掉textarea的首尾空白,保证Chrome和Firefox的初始序列化值一致。 - 取消select的特殊判断:现在所有表单元素(textarea、select)的变化都会触发按钮状态更新,符合用户预期。
- 动态初始状态:根据表单初始序列化值判断是否禁用按钮,适配编辑场景的需求。
内容的提问来源于stack exchange,提问作者Cody Coderson
相关产品推荐
相关产品推荐

