问题描述

以下代码在 Safari 中运行良好,但在 Chrome 和 Firefox 中,表单将不会提交。 Chrome 控制台记录错误 An invalid form control with name='' is not focusable 。有任何想法吗?

请注意,虽然下面的控件没有名称,但它们在提交时应该有名称,由下面的 Javascript 填充。表单 DOES 在 Safari 中工作。

<form method="POST" action="/add/bundle"> 
<p> 
    <input type="text" name="singular" placeholder="Singular Name" required> 
    <input type="text" name="plural" placeholder="Plural Name" required> 
</p> 
<h4>Asset Fields</h4> 
<div class="template-view" id="template_row" style="display:none"> 
    <input type="text" data-keyname="name" placeholder="Field Name" required> 
    <input type="text" data-keyname="hint" placeholder="Hint"> 
    <select data-keyname="fieldtype" required> 
        <option value="">Field Type...</option> 
        <option value="Email">Email</option> 
        <option value="Password">Password</option> 
        <option value="Text">Text</option> 
    </select>    
    <input type="checkbox" data-keyname="required" value="true"> Required
    <input type="checkbox" data-keyname="search" value="true"> Searchable
    <input type="checkbox" data-keyname="readonly" value="true"> ReadOnly
    <input type="checkbox" data-keyname="autocomplete" value="true"> AutoComplete
    <input type="radio" data-keyname="label" value="label" name="label"> Label
    <input type="radio" data-keyname="unique" value="unique" name="unique"> Unique
    <button class="add" type="button">+</button> 
    <button class="remove" type="button">-</button> 
</div> 

<div id="target_list"></div> 
    <p><input type="submit" name="form.submitted" value="Submit" autofocus></p> 
</form>

<script> 
function addDiv()
{
    var pCount = $('.template-view', '#target_list').length;
    var pClone = $('#template_row').clone();
    $('select, input, textarea', pClone).each(function(idx, el){
        $el = $(this);
        if ((el).type == 'radio'){
            $el.attr('value', pCount + '_' + $el.data('keyname'));
        }
        else {
            $el.attr('name', pCount + '_' + $el.data('keyname'));
        };
    });
    $('#target_list').append(pClone);
    pClone.show();
}

function removeDiv(elem){
    var pCount = $('.template-view', '#target_list').length;
    if (pCount != 1)
    {
        $(elem).closest('.template-view').remove();
    }
};

$('.add').live('click', function(){
    addDiv();
});

$('.remove').live('click', function(){
    removeDiv(this);
});

$(document).ready(addDiv);

</script>

最佳解决方案

Chrome 想要专注于必需的控件,但仍然为空,以便它可以弹出消息 「请填写此字段」 。但是,如果控件隐藏在 Chrome 想要弹出邮件的位置,那就是在提交表单时,Chrome 不能专注于控件,因为它是隐藏的,因此表单将不会提交。

所以,为了解决这个问题,当一个控件被 javascript 隐藏时,我们也必须从该控件中删除’required’ 属性。

次佳解决方案

如果您不关心 HTML5 验证 (也许您在 JS 或服务器上验证),您可以尝试将”novalidate” 添加到表单或输入元素。

第三种解决方案

它会显示该消息,如果你有这样的代码:

<form>
  <div style="display: none;">
    <input name="test" type="text" required/>
  </div>

  <input type="submit"/>
</form>

解决这个问题的方式取决于网站应该如何工作

例如,如果您不希望表单提交,除非此字段是必需的,您应该禁用提交按钮

所以显示 div 的 js 代码也应该启用 submit 按钮

你也可以隐藏按钮 (应该被禁用和隐藏,因为如果它被隐藏但没有禁用,用户可以用其他方式提交表单,例如在任何其他字段中按 enter,但如果按钮被禁用,则不会发生

如果您希望表单提交,如果 div 被隐藏,您应该禁用其中所需的任何输入,并在显示 div 时启用输入

如果有人需要这样做的代码,你应该告诉我你需要什么

第四种方案

尝试为 HTML5 控件使用适当的标签像数字 (整数)

<input type='number' min='0' pattern ='[0-9]*' step='1'/>

小数或浮点数

 <input type='number' min='0' step='Any'/>

step = ‘Any’ 如果没有,您不能在上述字段中提交您的表单输入任何小数或浮点值,如 3.5 或 4.6 。

尝试修复模式,键入 HTML5 控件来解决此问题。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛