所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

html中form提交如何排除某些input?超实用技巧秒会

html中form提交如何排除某些input?超实用技巧秒会 一

文章目录CloseOpen

别慌!这篇文章就聚焦「html中form提交如何排除某些input」的核心问题,给你讲透3种超实用、好上手的技巧。从最基础的「disabled属性怎么用才对」,到「name属性的隐藏小窍门」,再到「JS动态控制的简单方法」,全是能直接抄的「落地技巧」——不用记复杂代码,跟着步骤走,分分钟让form只提交你想要的数据。

不管你是刚学HTML的小白,还是常做表单的开发者,这些技巧都能帮你解决“想排除input却无从下手”的痛点,快往下看,轻松搞定表单提交的「精准控制」!

做网页开发的朋友,肯定都碰过这么个糟心事儿——写form表单的时候,总有几个input是“辅助选手”:比如隐藏的计算字段、临时显示的“其他选项”输入框,或者用来存临时状态的隐藏域。这些input留着吧,提交的时候会把多余数据发去后端,搞不好还让后端接口报错;删了吧,页面的交互逻辑直接乱套,比如计算总价的隐藏框删了,总价就不显示了。别急,今天我给你分享3个亲测有效、不用写复杂代码的技巧,不管你是刚学HTML的新手,还是做了几年开发的老鸟,看完就能直接用,分分钟搞定“form提交排除input”的问题!

最基础的「属性控制法」:用disabled和readonly帮你「过滤」input

很多人第一次碰到“排除input”的问题,第一反应是“找属性”——没错,HTML自带的disabled和readonly属性,就能帮你搞定基础场景。但我发现,80%的新手都会混淆这两个属性的作用,比如去年帮朋友小宇做他的美食博客订单表单时,他把不想提交的“优惠券码”输入框加了readonly,结果提交的时候还是带过去了,急得他找我求助。后来我告诉他,要排除input,得用disabled,不是readonly——这俩的区别大了去了!

我先给你讲清楚原理:根据HTML标准(MDN Web Docs明确提到过),form在提交时,会自动“忽略”两种表单元素:一种是被disabled的,另一种是没有name属性的。而readonly的元素呢?它只是让input不能编辑,但依然会被包含在提交数据里。比如你给一个输入框加了readonly,用户不能改里面的内容,但点提交的时候,这个input的值还是会发过去。

举个具体的例子:假设你有个“临时备注”输入框,是给用户临时写提醒用的,不想提交到后端。这时候你只需要给这个input加个disabled属性,比如:——这样不管用户写没写内容,提交的时候这个input都不会出现在form数据里。而如果用readonly,比如,那提交的时候还是会带temp_note这个字段,只是值不能改而已。

为了让你更清楚,我做了个表格对比disabled和readonly的核心区别

属性 是否允许编辑内容 是否会被form提交 适用场景
disabled 否(灰显,不可交互) 完全不需要提交的input,如临时辅助字段
readonly 否(可选中,不可修改) 需要保留值但不允许修改的input,如订单编号

看完这个表格,你应该能分清了吧?下次再想排除input,先别急着写JS,先试试加disabled——这是最基础也是最省心的方法,适合那些“固定不需要提交”的input。比如小宇的优惠券输入框,后来我让他改成disabled,结果提交的时候再也没出现过多余的优惠券字段,他还跟我说“原来这么简单,之前绕了大弯”。

更灵活的「name属性法」:让input「隐身」在提交数据里

如果说“属性控制法”适合固定场景,那“name属性法”就是应对动态场景的“神器”——比如有些input是“条件显示”的:用户选了某个选项才显示,不选的时候不想提交。这时候用disabled可能不够灵活,因为你得动态加删disabled属性,而控制name属性会更方便。

我先问你个问题:你知道form提交的数据里,每个字段的“key”是什么吗?对,就是input的name属性。比如,提交的时候会变成username=张三。反过来,如果一个input没有name属性,哪怕它没被disabled,form也不会提交它——这是HTML的“潜规则”,很多人用了几年form都没注意到。

所以,要让某个input不提交,还有个办法:去掉它的name属性。比如,你有个“其他原因”的输入框,只有当用户在下拉框里选了“其他”的时候才显示,这时候你可以用JS做这么一件事:

  • 当用户选“其他”时,给“其他原因”输入框加上name属性(比如name=”other_reason”);
  • 当用户选其他选项时,去掉这个input的name属性(比如把name改成空字符串,或者直接移除name属性)。
  • 这样一来,只有当用户需要的时候,“其他原因”的input才会有name,才会被提交;否则它就是“无name”的input,form根本不会理它——是不是很灵活?

    我去年做一个教育类问卷表单的时候,就用了这个方法。当时问卷里有个问题:“你选择这门课的原因”,下拉选项里有“兴趣”“就业”“其他”。“其他”对应的输入框,只有用户选了“其他”才显示。我用JS写了个监听事件:

    // 监听下拉框变化
    

    document.getElementById('reason-select').addEventListener('change', function() {

    const otherInput = document.getElementById('other-reason');

    if (this.value === 'other') {

    // 显示输入框并加name

    otherInput.style.display = 'block';

    otherInput.setAttribute('name', 'other_reason');

    } else {

    // 隐藏输入框并删name

    otherInput.style.display = 'none';

    otherInput.removeAttribute('name');

    }

    });

    结果怎么样?提交的时候,只有用户选了“其他”,“other_reason”字段才会出现在数据里;否则完全看不到这个字段——后端同事收到数据后,还跟我说“你们前端处理得真干净,省了我好多过滤的活儿”。

    为什么这个方法有效?其实还是回到HTML的规则:form提交的是“有name属性且未被disabled”的元素。所以,控制name属性的“存在与否”,就相当于给input加了个“开关”——想开就开,想关就关,比disabled灵活多了。比如有些input是“时有时无”的,用name属性法就能完美解决,不用每次都改disabled状态。

    再举个例子:我之前做过一个电商购物车的表单,里面有个“凑单商品”的输入框,只有当用户的订单金额不够满减时才显示,鼓励用户凑单。这时候我就用了name属性法:当订单金额满减时,去掉“凑单商品”输入框的name,这样提交的时候就不会带这个字段;当金额不够时,加上name,让用户输入凑单商品——这样既不影响用户体验,又不会提交多余数据。

    JS动态控制:应对复杂场景的「终极方案」

    如果前面两个方法还满足不了你,比如你需要更精细的控制:比如根据用户输入的内容,动态决定哪些input提交,那就要用到JS动态控制了。这是“终极方案”,适合那些“复杂到没朋友”的表单场景,比如需要验证+过滤的情况。

    我之前帮一个酒店预订小程序做表单的时候,碰到过这么个需求:用户选了“加床”选项,才需要提交“加床数量”的input;没选的话,这个input不能提交。而且,“加床数量”的输入框还要做验证——不能超过2张,也不能是0。这时候,只用disabled或name属性就不够了,得用JS在提交前“筛选+验证”input。

    具体怎么做呢?其实很简单,就是监听form的submit事件,在提交前处理input

  • 给form加一个submit事件监听器;
  • 在事件里,先阻止form的默认提交行为(防止直接发数据);
  • 遍历所有input,把不需要提交的input“排除”掉(比如disabled它们,或者去掉name);
  • 做必要的验证,如果验证不通过,阻止提交;
  • 验证通过后,手动触发form的提交。
  • 比如下面这个例子,就是我当时写的代码:

    const form = document.getElementById('booking-form');
    

    form.addEventListener('submit', function(e) {

    e.preventDefault(); // 阻止默认提交,先处理数据

    const addBedCheckbox = document.getElementById('add-bed'); // 加床 checkbox

    const bedCountInput = document.getElementById('bed-count'); // 加床数量 input

    // 第一步:处理加床数量的input

    if (!addBedCheckbox.checked) {

    // 没选加床,去掉name,这样不会提交

    bedCountInput.removeAttribute('name');

    } else {

    // 选了加床,加name并验证数量

    bedCountInput.setAttribute('name', 'bed_count');

    const count = parseInt(bedCountInput.value);

    // 验证数量:1-2张

    if (isNaN(count) || count 2) {

    alert('加床数量只能是1或2张,请修改后再提交');

    return; // 验证不通过,不提交

    }

    }

    // 第二步:其他验证(比如姓名、电话是否填写)

    const nameInput = document.getElementById('name');

    const phoneInput = document.getElementById('phone');

    if (!nameInput.value.trim()) {

    alert('请填写姓名');

    return;

    }

    if (!/^1[3-9]d{9}$/.test(phoneInput.value)) {

    alert('请填写正确的手机号');

    return;

    }

    // 第三步:所有验证通过,手动提交form

    this.submit();

    });

    你猜结果怎么样?用户没选加床的时候,“bed_count”字段根本不会出现在提交数据里;选了加床但数量不对的话,会弹出提示阻止提交;只有一切符合要求,才会提交正确的数据——酒店的后端开发说,这个表单的数据“比之前干净10倍”,处理起来效率高多了。

    为什么这个方法是“终极方案”?因为它突破了“属性控制”的限制,把控制权完全交给了你——你可以在提交前做任何你想做的事:过滤input、验证数据、甚至和后端接口交互(比如查库存)。比如上面的例子,不仅排除了不需要的input,还做了数量和必填项的验证,一举两得。

    我再给你讲个更复杂的场景:我之前做过一个旅游报名表单,里面有个“同行人信息”的部分,用户可以点击“添加同行人”按钮,动态增加同行人的姓名、身份证号输入框。但提交的时候,只需要提交“已填写”的同行人信息——空的输入框不能提交。这时候我就用了JS动态控制:在提交前,遍历所有同行人输入框,把空值的input去掉name属性,这样提交的时候就只会带已填写的同行人数据。

    具体来说,我写了个函数filterEmptyInputs,用来过滤空值的input:

    function filterEmptyInputs(container) {
    

    // container是同行人信息的父容器

    const inputs = container.querySelectorAll('input');

    inputs.forEach(input => {

    if (!input.value.trim()) {

    input.removeAttribute('name'); // 空值的input去掉name,不提交

    } else {

    input.setAttribute('name', input.dataset.name); // 非空的input加name(用dataset存原始name)

    }

    });

    }

    然后在form的submit事件里调用这个函数:

    form.addEventListener('submit', function(e) {
    

    e.preventDefault();

    const companionContainer = document.getElementById('companion-container');

    filterEmptyInputs(companionContainer); // 过滤空的同行人input

    // 其他验证...

    this.submit();

    });

    这样一来,不管用户加了多少个同行人输入框,提交的时候只会带已填写的——是不是特别方便?

    其实,JS动态控制的核心思想就是“在提交前干预form的数据”,不管你的场景多复杂,只要抓住这个核心,总能找到解决办法。比如你需要根据用户的地理位置过滤input,或者根据后端返回的结果决定提交哪些字段,都可以用这个方法——它是最灵活的,也是最能应对复杂场景的。

    怎么样?这三个技巧是不是都很实用?我帮过的几个开发者朋友,用了这些方法后,都跟我说“表单提交再也不闹心了”。其实HTML的form规则没那么复杂,只要摸清楚“disabled、name、submit事件”这几个关键点,就能轻松控制提交的数据。比如小宇的美食博客表单、教育问卷的“其他原因”输入框、酒店预订的加床数量,都是用这些技巧解决的——没有复杂的代码,只有“用对方法”的智慧。

    如果你按这些方法试了,欢迎在评论区告诉我效果,或者有其他不懂的问题也可以问我——我帮你一起想想办法!毕竟做开发这么多年,踩过的坑比走过的路还多,能帮到你就好~


    disabled和readonly都能让input不能编辑,为什么一个能排除提交一个不行?

    因为HTML的规则里,form提交时会直接“忽略”被disabled的input,但readonly的input只是不能修改内容,依然会被包含在提交数据里。打个比方,disabled像给input贴了“禁止入内”的标签,不让它进提交的“队伍”;readonly是让input“站在队伍里但不说话”,所以还是会被算进去。去年我帮朋友做美食博客的订单表单时,他把不想提交的优惠券输入框加了readonly,结果提交时还是带过去了,后来改成disabled才解决。

    具体来说,disabled的input会变成灰显的不可交互状态,完全不会出现在提交的数据里;readonly的input可以选中但不能改,提交时依然会带着它的值。所以想排除input,优先用disabled,别用readonly。

    为什么去掉input的name属性就能让它不提交?

    因为form提交的数据里,每个字段的“key”就是input的name属性。比如会变成“username=张三”,要是input没有name属性,form根本不知道这个字段该叫什么,自然不会把它放进提交数据里。

    这招特别适合动态场景,比如“其他原因”的输入框——只有用户选了“其他”才显示,这时候用JS动态加name属性,不选就去掉,这样只有需要的时候才会提交。我去年做教育问卷时,就用这方法解决了“其他原因”的提交问题,比写复杂的disabled切换省心多了。

    什么时候需要用JS动态控制form提交的input?

    当你碰到复杂场景,比如input是“条件显示”的(比如选了“加床”才显示数量输入框)、需要“动态验证”的(比如加床数量不能超过2张),或者要“过滤动态增加的input”(比如同行人输入框,只提交已填写的),这时候JS动态控制就是“终极方案”。

    JS的核心是“在提交前干预数据”——比如监听form的submit事件,先阻止默认提交,处理完input(比如去掉不需要的name、验证数量)再手动提交。我帮酒店做预订表单时,就用这招解决了“加床数量”的问题,既验证了数量,又排除了没选加床时的input;做旅游问卷的同行人输入框时,还用来过滤空值的input,效果特别好。

    固定不需要提交的input,用什么方法最省心?

    直接给input加disabled属性!比如临时辅助的计算字段、不需要的提示输入框,加个disabled就行,不用写JS,简单又省心。去年我帮朋友小宇做美食博客的优惠券输入框,他之前用了readonly,结果提交时还是带过去,后来改成disabled,立马就解决了——disabled是“一劳永逸”的方法,适合那些“永远不需要提交”的input。

    记住,要是你碰到固定不需要提交的input,先别急着写JS,先试试加disabled,90%的情况都能解决,比readonly靠谱多了。

    原文链接:https://www.mayiym.com/50570.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码