【问题标题】:Validate fields with the same name验证具有相同名称的字段
【发布时间】:2022-01-09 08:12:01
【问题描述】:

我正在尝试验证具有相同名称的多个字段。这是我正在使用的视觉表示:

如果我不点击“请求另一个样品”按钮,我的验证当前有效,该按钮会生成另一组“制造商”、“SKU”等。如果我点击“请求另一个样品”,那就是表单绕过的地方验证并提交。

“制造商”字段 HTML 如下所示:

<tr class="product-sample-field">
  <td width="25"></td>
  <td align="left" class="formLabel"><font color="red">*</font><label id="manufacturerLabel"><%=eclSystem.translate(silver.getLanguage(), "Manufacturer")%>&nbsp;</label></td>                      
  <td>
      <input class="inputFieldBody" type="text" name="manufacturer" id="manufacturer" placeholder="Fishman" size="30" value="<%=manufacturer%>">
  </td>
</tr>

这是验证 JS 的样子:

<script type="text/javascript">

var submitcount=0;
function checkForm(form) {
var ok = true, msg = "", tempmsg;

resetLabels();

if ( (tempmsg = checkEmail(form)) != "") {
    document.getElementById('emailLabel').style.color = "red";
    document.getElementById('confirmEmailLabel').style.color = "red";
    form.email.focus();
    form.confirmEmail.focus();
    msg += tempmsg;
    ok = false;
}
// pre-format the phone number
form.phone.value = phoneFormat(form.phone.value);
result = phoneRXP.exec(form.phone.value);
// phone #'s may contain ext number
if (!result) { 
    document.getElementById('phoneLabel').style.color = "red";
    if (form.phone.value)
        msg += "\r\n<%=eclSystem.translateJS(silver.getLanguage(), "Please enter a valid telephone number")%>";
    form.phone.focus();
    ok = false;
}
if (!form.firstName.value) {
    document.getElementById('nameLabel').style.color = "red";
    form.firstName.focus();
    ok = false;
}
if (!form.lastName.value) {
    document.getElementById('nameLabel').style.color = "red";
    form.lastName.focus();
    ok = false;
}
if (!form.company.value) {
    document.getElementById('companyLabel').style.color = "red";
    form.company.focus();
    ok = false;
}
if (!form.address.value) {
    document.getElementById('addressLabel').style.color = "red";
    form.address.focus();
    ok = false;
}
if (!form.city.value) {
    document.getElementById('cityStateZipLabel').style.color = "red";
    form.city.focus();
    ok = false;
}
if (!form.state.value) {
    document.getElementById('cityStateZipLabel').style.color = "red";
    form.state.focus();
    ok = false;
}
if (!form.zip.value) {
    document.getElementById('cityStateZipLabel').style.color = "red";
    form.zip.focus();
    ok = false;
}
if (!form.manufacturer.value) {
    document.getElementById('manufacturerLabel').style.color = "red";
    form.manufacturer.focus();
    ok = false;
}
if (!form.sku.value) {
    document.getElementById('skuLabel').style.color = "red";
    form.sku.focus();
    ok = false;
}
if (!form.description.value) {
    document.getElementById('descriptionLabel').style.color = "red";
    form.description.focus();
    ok = false;
}
if (!form.size.value) {
    document.getElementById('sizeLabel').style.color = "red";
    form.size.focus();
    ok = false;
}
if (!form.quantity.value) {
    document.getElementById('quantityLabel').style.color = "red";
    form.quantity.focus();
    ok = false;
}

if (!ok) {
    // error message
    var finalmsg = "<%=eclSystem.translateJS(silver.getLanguage(), "Please correct the fields marked in red.")%>\r\n";
    if (msg) finalmsg += msg;
    alert(finalmsg);

    return false;
}

if (submitcount==0) {
    submitcount++;
    return true;
} else {
    alert('<%=eclSystem.translateJS(silver.getLanguage(), "This form has already been submitted. Thanks!")%>');
    return false;
    }
}

function resetLabels() {
document.getElementById('nameLabel').style.color = "#000000";
document.getElementById('companyLabel').style.color = "#000000";
document.getElementById('addressLabel').style.color = "#000000";
document.getElementById('cityStateZipLabel').style.color = "#000000";
document.getElementById('phoneLabel').style.color = "#000000";
document.getElementById('emailLabel').style.color = "#000000";
document.getElementById('confirmEmailLabel').style.color = "#000000";
document.getElementById('manufacturerLabel').style.color = "#000000";
document.getElementById('skuLabel').style.color = "#000000";
document.getElementById('descriptionLabel').style.color = "#000000";
document.getElementById('sizeLabel').style.color = "#000000";
document.getElementById('quantityLabel').style.color = "#000000";
}

function checkEmail(form) {
var msg = "";
var email = document.getElementById('email');
var confirmEmail = document.getElementById('confirmEmail');

if (form.email.value == "" || form.confirmEmail.value == "") 
    msg = "    "; // will flag error w/o msg
else if (email.value != confirmEmail.value)
    msg = "\r\n<%=eclSystem.translateJS(silver.getLanguage(), "Please confirm email addresses match.")%>";
else if (!emailRXP.exec(form.email.value) || !emailRXP.exec(form.confirmEmail.value))
    msg = "\r\n<%=eclSystem.translateJS(silver.getLanguage(), "Email address should use the following format: john@mycompany.com")%>";
   
return msg;
}

</script>

任何帮助将不胜感激!如果您还需要更多信息,请告诉我。

【问题讨论】:

  • 多个元素不能有相同的id。如果要复制,则必须使用名称字段并遍历元素集合。
  • 此外,多个表单字段不能具有相同的名称,除非 1)您将使用 javascript 循环它们并按 DOM 层次结构组装表单数据或 2)您使用数组括号 [] 来表示元素将作为数组进入后端,如name="manufacturer[]"
  • 你能包括你所有的验证码吗?根据我的经验,如果有未处理的错误,它无论如何都会提交。
  • @user1599011 添加了所有验证码。抱歉格式化...
  • checkForm() 是从哪里调用的?控制台有错误吗?

标签: javascript html validation input field


【解决方案1】:

由于它仅在您单击 Request Another Sample 按钮时提交,我看到两种可能的解决方案:1)不要使用按钮元素,而不是按钮元素,您可以使用设计的跨度作为一个按钮。或 2)如果您更愿意使用按钮元素,那么您需要阻止它在任何时候单击它时提交表单。请参阅下面的 JS 以防止提交:

const
    request_btn = document.querySelector('#request-btn')

request_btn.addEventListener('click', function(event) {
    event.preventDefault()
    // The anything the button needs to here
})

当涉及到表单验证时,请考虑将 required 属性添加到 input 和 select 元素中,这将为您节省宝贵的时间。

【讨论】:

  • 因此,当我单击“请求另一个样品”按钮时,没有提交表单。如果有多个具有相同名称的字段,那么当我单击“提交”时,表单不会验证。
  • 你可以使用 &lt;button&gt; 元素而不提交它,方法是指定 button type ... &lt;button type="button"&gt; — 使用跨度 bad 可访问性。
  • @StephenP 是绝对正确的。 Span 不利于可访问性,因此您可能应该将按钮类型设置为 button
  • @Marc name 属性不应影响您的表单验证或提交。这可能是您编写验证代码的方式有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多