"Недійсне керування формою" лише в Google Chrome


106

Код нижче добре працює в Safari, але в Chrome і Firefox форма не надсилатиметься. Консоль Chrome записує помилку An invalid form control with name='' is not focusable. Якісь ідеї?

Зауважте, що, хоча в наведених нижче елементах управління немає імен, вони повинні мати імена під час подання, заповнені Javascript нижче. Форма працює в Сафарі.

<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>

Буде надіслано лише успішне керування. Щоб досягти успіху, елемент керування повинен мати ім’я. Є й інші вимоги (див. Посилання).
RobG

Перемикачі мають назви. Все інше отримує назву через JavaScript.
MFB

Відповіді:


247

Chrome хоче зосередити увагу на контролі, який необхідний, але все ще порожній, щоб він міг з’являтись повідомлення "Будь ласка, заповніть це поле". Однак якщо елемент керування приховано у той момент, коли Chrome хоче спливати повідомлення, тобто під час подання форми, Chrome не може зосередитись на контролі, оскільки він прихований, тому форма не надсилатиметься.

Отже, щоб вирішити проблему, коли контроль приховано JavaScript, ми також повинні видалити з цього елемента атрибут 'необхідний'.


9
Ах, це смокче. Має сенс, хоча я здогадуюсь, браузер не може здогадатися, як він хоче, щоб ваш інтерфейс мав справу з повідомленнями про помилки перевірки, якщо поле приховане (можливо форма з вкладками ...).
Веслі Мерч

12
Дякую, це працює. Прикро, що Chrome це робить, він повинен просто пропустити поле.
472084

У мене виникла ця проблема в Chrome для textarea, коли довжина тексту в текстовій області перевищувала 4100 букв, без прихованих необхідних полів. Коли довжина тексту становить <4000, все працює, інакше в консолі я бачу це повідомлення і не можу надіслати форму
ikos23

Якщо це поле не потрібне, коли воно приховане, чи не було б ще більше сенсу його відключати? ( stackoverflow.com/a/22753533/421243 )
Девід Кук

3
Що робити, якщо ця помилка все-таки виникає в Chrome, але поле не порожнє? Чи маєте ви якесь уявлення, як це вирішити?
Лія

12

Це повідомлення покаже, якщо у вас є такий код:

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

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

рішення цієї проблеми буде залежати від того, як сайт повинен працювати

наприклад, якщо ви не хочете, щоб форма надсилалася, якщо це поле не обов'язково, вам слід відключити кнопку надсилання

тож код js для відображення div повинен також включати кнопку для надсилання

Ви також можете приховати кнопку (має бути відключена та прихована, тому що якщо вона прихована, але не відключена, користувач може надіслати форму іншим способом, наприклад, натиснути enterв будь-якому іншому полі, але якщо кнопку вимкнено, це не відбудеться

якщо ви хочете, щоб форма надіслала, якщо div прихований, вам слід вимкнути будь-який необхідний ввід всередині нього та включити введення під час показу дзвінка

якщо комусь потрібні коди для цього, ви повинні сказати мені саме те, що вам потрібно


Так ..може скажіть, будь ласка, рішення для цього?
Рекс Рекс

@RexRex я редагую відповідь, дивіться, чи допоможе вам це чи скажіть, що саме вам потрібно
Роберт

@KaziMasumBillah я не розумію, ви можете написати приклад у відповідь, будь ласка
Роберт

9

Якщо вас не хвилює перевірка HTML5 (можливо, ви перевіряєте в JS або на сервері), ви можете спробувати додати "novalidate" до форми або елементів вводу.


1
люди ніколи не повинні робити такі речі, як він повинен змусити його js-код працювати з html5, а не просто закривати html5, тому що він не може з цим впоратися
Роберт

Я не згоден. Вам просто потрібна вагома причина робити щось інакше. Є ще багато потужних бібліотек перевірки. Перевірка HTML5 проста та швидка. І перш за все добре слідувати стандартам. Але це не означає, що це "найкраще" рішення. Ніколи не кажи ніколи. Це завжди залежить. Хоча я згоден, що вам слід ніколи не пропускати перевірку клієнта повністю. ;-)

5

спробуйте використовувати належні теги для елементів керування HTML5, як для числа (цілі числа)

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

для десяткових знаків або поплавця

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

step = "Будь-який" Без цього ви не можете надіслати форму, вводячи будь-яке десяткове чи плаваюче значення, наприклад, 3,5 або 4,6 у вищевказаному полі.

Спробуйте виправити шаблон, введіть елементи керування HTML5, щоб виправити цю проблему.


ти вирішив мою проблему. Але зверніть увагу, що pattern, здається, не є загальноприйнятним у цій type="number"галузі
Жоао Піментел Феррейра,

3

Я отримував цю помилку і визначив, що це насправді на полі, яке не було приховано.

У цьому випадку це було type="number"поле, яке потрібно. Коли в це поле ніколи не було введено жодне значення, на консолі відображається повідомлення про помилку, а форма не подається. Введення значення та видалення його означає, що помилка перевірки відображається як очікувалося.

Я вважаю, що це помилка в Chrome: наразі моєму вирішенню було придумати початкове значення / значення за замовчуванням.


Можлива помилка в Chrome. Зі мною теж трапилось. +1
gamliela

1

У мене виникла помилка:

Недійсний елемент форми з ім'ям = "телефон" не фокусується.

Це сталося тому, що я неправильно використовував потрібне поле, яке ввімкнено та вимкнено при натисканні на чекбок. Рішення полягало в тому, щоб видалити requiredатрибут кожного разу, коли прапорець не позначений, і позначити його як потрібно, коли прапорець був позначений.

var telefono = document.getElementById("telefono");  
telefono.removeAttribute("required");

1

Я повинен зробити щось подібне, щоб виправити помилку, оскільки у мене є деякі type="number"з min="0.00000001":

HTML:

<input type="number" min="0.00000001" step="0.00000001" name="price" value="[%price%]" />

JS:

$('input[type="submit"]').click(function(e) {
    //prevent chrome bug
    $("input:hidden").val(null);
});

Якщо я не встановлю все поле прихованого введення для nullchrome, все одно спробую перевірити введення.


1

Жоден валідант не зробить роботу.

<form action="whatever" method="post" novalidate>

0

У мене виникла ця проблема, коли на полях введення було клас = "приховано", тому що я використовував кнопки замість радіопультів - і змінював "активний" стан через JS.

Я просто додав додаткову частину поля введення радіо тієї ж групи, де я хотів, щоб повідомлення з'являлося:

<input type="radio" id="thenorm" name="ppoption" value=""  required style="opacity:0"/>

інші 2 активні кулі невидимі, ця не є, і це запускає повідомлення про перевірку і не має помилок консолі - біт хака, але що не буває в ці дні ..



0

Я отримав це повідомлення про помилку, коли я ввів число (999999), яке було поза діапазоном, який я встановив для форми.

<input type="number" ng-model="clipInMovieModel" id="clipInMovie" min="1" max="10000">

-2
$("...").attr("required"); and $("...").removeAttr("required"); 

не працювало для мене, поки я не поставив між собою весь свій код jQuery:

$(document).ready(function() {
    //jQuery code goes here
});

-5

замінити requiredна обов’язкове = "обов'язково"


2
Обов’язковий атрибут HTML5, і "обов'язковий" має те саме значення, що і обов'язковий = "обов'язково", оскільки інших атрибутів немає.
ilter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.