如何正确检查所有表单元素是不是都用 JavaScript 填充

Posted

技术标签:

【中文标题】如何正确检查所有表单元素是不是都用 JavaScript 填充【英文标题】:How to properly check if all form elements are filled with JavaScript如何正确检查所有表单元素是否都用 JavaScript 填充 【发布时间】:2015-07-18 21:35:24 【问题描述】:

我有一个表格:

<form action="process.php" method="POST" enctype="multipart/form-data" id="add_prod_form">
Item Name: <input type="text" name="add_prod_name" id="add_prod_name"/><br /><br />
Image 1: <input type="file" name="add_prod_image[]" id="add_prod_image"/><br /><br />
Image 2: <input type="file" name="add_prod_image[]" /><br /><br />
Image 3: <input type="file" name="add_prod_image[]" /><br /><br />
Image 4: <input type="file" name="add_prod_image[]" /><br /><br />
Image 5: <input type="file" name="add_prod_image[]" /><br /><br />
Short description:<br />
<textarea rows="7" cols="50" name="add_prod_description_short" id="add_prod_description_short"/></textarea><br />
Long description:<br />
<textarea rows="7" cols="50" name="add_prod_description_long" id="add_prod_description_long"/></textarea><br /><br />
Price: <input type="text" name="add_prod_price" id="add_prod_price"/><br /><br />
<input type="hidden" name="action" value="add_product" />
<input type="submit" name="submit" id="add_prod_submit" disabled="disabled">

我有一个小脚本:

<script>
$('#add_prod_name, #add_prod_image, #add_prod_description_short, #add_prod_description_long, #add_prod_price').keyup(function() 
    if(allFilled())
         $('#add_prod_submit').removeAttr('disabled');
    
);

function allFilled() 
    var filled = true;
    $('#add_prod_form input, #add_prod_form textarea').each(function() 
        if($(this).val() == '') filled = false;
    );
    return filled;


</script>

我期望的是,一旦所有字段都填写完毕,提交按钮就会变得可用。它没有。不幸的是,我不能只检查所有“正文输入”元素,因为同一页面上还有另一个表单。我感觉我的问题出在 $('#add_prod_form input, #add_prod_form textarea').each(function() 部分的某个地方,但我尝试了大约 100 种方法,但没有任何效果。

我目前正在修改我找到的代码 here

【问题讨论】:

您可能并不总是有五张产品图片,因此如果至少有一张是空的也可以理解。 给你的表单一个id(比如myForm),然后将选择器限制为只有该表单的孩子 @btquanto 他已经这样做了#add_prod_form 是的,我现在看到了,然后限制为add_prod_form 然后:D 是的,但是当您使用 #add_prod_form input 选择器时,您会检查它们。 【参考方案1】:

这是因为:

<input type="submit" name="submit" id="add_prod_submit" disabled="disabled">

它的 val() 总是为空,

改变它:

<button type="submit" name="submit" id="add_prod_submit" disabled="disabled">submit</button>

jsfiddle

【讨论】:

这不正是我所做的吗?我不明白为什么将它放在两条线上会更好。除非当然必须……这就是你推荐它的原因吗? 我发现了这个bug,它是提交也使用输入标签,你可以像上面更新的代码一样用按钮标签来改变它。【参考方案2】:

当您搜索inputs 时,它还将包括没有valuenullsubmit 按钮。应该是——

$('#add_prod_form input, textarea').not('#add_prod_submit').each(function() ...

Working Demo

【讨论】:

那么他的问题不是他所说的。不错 @btquanto 你是对的。问题是别的。 @btquanto 不,你不对。他知道自己的问题出在哪里,而且他知道自己在选择元素时过于笼统。他只是不知道如何正确选择【参考方案3】:

您的表单中有一些字段可能为空,例如剩余的四个文件输入元素。

由于您已经有一个固定的字段列表,您可以在其中附加一个事件处理程序,您也可以在执行检查时重复使用它:

jQuery(function($) 
  var $fields = $('#add_prod_name, #add_prod_image, #add_prod_description_short, #add_prod_description_long, #add_prod_price');
  
  $fields.on('keyup change', function() 
    if (allFilled($fields)) 
       $('#add_prod_submit').removeAttr('disabled');
    
  );

  function allFilled($fields) 
  
    return $fields.filter(function() 
      return this.value === ''; 
    ).length == 0;
  
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="process.php" method="POST" enctype="multipart/form-data" id="add_prod_form">
Item Name: <input type="text" name="add_prod_name" id="add_prod_name"/><br /><br />
Image 1: <input type="file" name="add_prod_image[]" id="add_prod_image"/><br /><br />
Image 2: <input type="file" name="add_prod_image[]" /><br /><br />
Image 3: <input type="file" name="add_prod_image[]" /><br /><br />
Image 4: <input type="file" name="add_prod_image[]" /><br /><br />
Image 5: <input type="file" name="add_prod_image[]" /><br /><br />
Short description:<br />
<textarea rows="7" cols="50" name="add_prod_description_short" id="add_prod_description_short"/></textarea><br />
Long description:<br />
<textarea rows="7" cols="50" name="add_prod_description_long" id="add_prod_description_long"/></textarea><br /><br />
Price: <input type="text" name="add_prod_price" id="add_prod_price"/><br /><br />
<input type="hidden" name="action" value="add_product" />
<input type="submit" name="submit" id="add_prod_submit" disabled="disabled">

可以通过向每个必填字段添加一个类来进一步改进,这样可以减小选择器的大小,并且可以更轻松地在以后添加字段而无需编辑代码。

【讨论】:

这是一个很好的答案,我唯一要改变的就是在所有需要检查的元素上简单地使用一个类。 @azium 是的,这可能是对 OP 代码的改进 :) 我喜欢 azium 的想法。我要去清理它。谢谢你们! @杰克。如果我在 last 上传图片,这会起作用吗? &lt;input type="file"&gt; 是否有 keyup 事件? @Ja͢ck Thnks :) 如果用户最后选择上传图片(只是说),那么这是 Matthew Goulart 的代码将失败的场景。【参考方案4】:

谢谢大家。

正如杰克指出的那样,我的问题是我正在循环遍历所有 #add_prod_form input

我变了

function allFilled() 
    var filled = true;
    $('#add_prod_form input, #add_prod_form textarea').each(function() 
        if($(this).val() == '') filled = false;
    );
    return filled;

function allFilled() 
    var filled = true;
    $('#add_prod_name, #add_prod_image, #add_prod_description_short, #add_prod_description_long, #add_prod_price').each(function() 
        if($(this).val() == '') filled = false;
        console.log($(this).val())
    );
    return filled;

谢谢!!!

【讨论】:

祝你好运。我的一个建议是将validate 之类的类添加到您要检查的所有输入中,然后只需使用$('.validate').each(..) 进行选择,否则如果您继续添加输入,您当前的选择器将变得太长【参考方案5】:

不要使用 javascript 来验证表单,将所有输入放在里面,表单标签将验证它的元素。但重要的是表单验证仅在提交按钮上完成。没有按钮类型的提交表单将不会被验证。并且此验证是此html表单中的客户端首先验证然后提交表单。

这是我的代码,我删除了您的 javascript,删除了禁用的表单提交按钮并将价格的输入类型更改为数字。将需要验证的所有元素包装在元素内,并将所需属性放在每个应在提交之前填充的元素上。

<form action="process.php" method="POST" enctype="multipart/form-data" id="add_prod_form">
    Item Name: <input type="text" name="add_prod_name" id="add_prod_name" required/><br />
    Image 1: <input type="file" name="add_prod_image[]" id="add_prod_image" required/><br />
    Image 2: <input type="file" name="add_prod_image[]" required/><br />
    Image 3: <input type="file" name="add_prod_image[]" required/><br />
    Image 4: <input type="file" name="add_prod_image[]" required/><br />
    Image 5: <input type="file" name="add_prod_image[]" required/><br />
    Short description:<br />
    <textarea rows="7" cols="50" name="add_prod_description_short" id="add_prod_description_short"required/></textarea><br />
    Long description:<br />
    <textarea rows="7" cols="50" name="add_prod_description_long" id="add_prod_description_long"required/></textarea><br />
    Price: <input type="number" name="add_prod_price" id="add_prod_price"required/><br />
    <input type="hidden" name="action" value="add_product" required/>
    <input type="submit" name="submit" id="add_prod_submit">
</form>

【讨论】:

如果所有浏览器都积极支持,那就太好了;也许再过几年;-) 我已经在 chrome、firefox、IE 上测试过了。大多数用户只使用这些浏览器,因此验证工作正常。 遗憾的是,您自己的设置并不能代表所有互联网用户;也就是说,现在添加这些属性绝对值得。

以上是关于如何正确检查所有表单元素是不是都用 JavaScript 填充的主要内容,如果未能解决你的问题,请参考以下文章

如何检查表单域是不是使用 capybara 正确预填?

单击时检查表单中是不是存在不显示的元素

如何检查Mysql中是不是存在数组元素?

检查用户是不是提交表单的正确方法

使用 jQuery 检查表单是不是有输入元素

JavaScript&jQuery.DOM事件