"Kontrol formulir tidak valid" hanya di Google Chrome

106

Kode di bawah ini berfungsi dengan baik di Safari tetapi di Chrome dan Firefox formulir tidak akan dikirim. Konsol Chrome mencatat kesalahan tersebut An invalid form control with name='' is not focusable. Ada ide?

Perhatikan bahwa meskipun kontrol di bawah tidak memiliki nama, kontrol tersebut harus memiliki nama pada saat pengiriman, diisi oleh Javascript di bawah. Formulir TIDAK berfungsi di 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>
MFB
sumber
Hanya kontrol yang berhasil yang akan dikirim. Agar berhasil, sebuah kontrol harus memiliki nama. Ada persyaratan lain juga (lihat tautan).
RobG
Tombol radio memiliki nama. Yang lainnya mendapat nama melalui JavaScript.
MFB

Jawaban:

247

Chrome ingin fokus pada kontrol yang diperlukan namun masih kosong sehingga dapat memunculkan pesan 'Harap isi kolom ini'. Namun, jika kontrol disembunyikan pada saat Chrome ingin memunculkan pesan, yaitu pada saat pengiriman formulir, Chrome tidak dapat fokus pada kontrol karena tersembunyi, sehingga formulir tidak dapat dikirim.

Jadi, untuk mengatasi masalah tersebut, ketika sebuah kontrol disembunyikan oleh javascript, kita juga harus menghapus atribut 'required' dari kontrol itu.

MFB
sumber
9
Ah, itu menyebalkan. Masuk akal meskipun saya kira, browser tidak mungkin bisa menebak bagaimana ia ingin antarmuka Anda menangani pesan kesalahan validasi jika field disembunyikan (mungkin formulir tab ...).
Wesley Murch
12
Terima kasih, ini berhasil. Sayangnya Chrome melakukan ini, itu hanya harus melewati bidang.
472084
Saya mengalami masalah ini di Chrome untuk textarea ketika panjang teks di textarea lebih dari 4100 huruf, tidak ada bidang wajib yang tersembunyi. Ketika panjang teks <4000 semuanya bekerja, jika tidak di konsol saya dapat melihat pesan itu dan tidak dapat mengirimkan formulir
ikos23
Jika bidang tidak diperlukan saat disembunyikan, bukankah lebih masuk akal untuk menonaktifkannya? ( stackoverflow.com/a/22753533/421243 )
David Cook
3
Bagaimana jika kesalahan ini masih terjadi di Chrome tetapi bidangnya tidak kosong? Apakah Anda tahu cara mengatasi ini?
Leah
12

Ini akan menunjukkan pesan itu jika Anda memiliki kode seperti ini:

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

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

solusi untuk masalah ini akan tergantung pada bagaimana situs tersebut harus bekerja

misalnya jika Anda tidak ingin formulir dikirim kecuali bidang ini diperlukan, Anda harus menonaktifkan tombol kirim

jadi kode js untuk menampilkan div harus mengaktifkan tombol kirim juga

Anda juga dapat menyembunyikan tombol (harus dinonaktifkan dan disembunyikan karena jika disembunyikan tetapi tidak dinonaktifkan pengguna dapat mengirimkan formulir dengan cara lain seperti tekan enterdi bidang lain tetapi jika tombol dinonaktifkan, ini tidak akan terjadi)

jika Anda ingin formulir dikirim jika div tersembunyi, Anda harus menonaktifkan masukan yang diperlukan di dalamnya dan mengaktifkan masukan saat Anda menampilkan div

jika seseorang membutuhkan kode untuk melakukannya, Anda harus memberi tahu saya apa yang Anda butuhkan

Robert
sumber
Ya .. dapatkah Anda memberi tahu solusi untuk ini?
Rex Rex
@RexRex saya mengedit jawabannya, lihat apakah ini membantu Anda atau beri tahu saya apa yang sebenarnya Anda butuhkan
Robert
@AziMasumBillah gak ngerti bapak bisa kasih contoh di jawaban tolong
Robert
9

Jika Anda tidak peduli dengan validasi HTML5 (mungkin Anda memvalidasi di JS atau di server), Anda dapat mencoba menambahkan "novalidate" ke formulir atau elemen masukan.

John Velonis
sumber
1
orang tidak boleh melakukan hal-hal seperti itu, dia harus membuat kode js-nya berfungsi dengan html5 bukan hanya menutup html5 karena dia tidak bisa menghadapinya
Robert
Saya tidak setuju. Anda hanya perlu alasan yang bagus untuk melakukan sesuatu secara berbeda. Masih banyak perpustakaan validasi yang kuat di luar sana. Validasi HTML5 mudah, cepat disiapkan. Dan yang terpenting adalah mengikuti standar. Tetapi itu tidak berarti bahwa itu adalah solusi "terbaik". Jangan pernah bilang tidak akan pernah. Itu selalu tergantung. Meskipun saya setuju bahwa Anda harus "tidak pernah" melewatkan validasi klien sepenuhnya. ;-)
5

coba gunakan tag yang tepat untuk kontrol HTML5 Seperti untuk Angka (bilangan bulat)

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

untuk Desimal atau float

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

step = 'Any' Tanpa ini, Anda tidak dapat mengirimkan formulir Anda dengan memasukkan nilai desimal atau float seperti 3.5 atau 4.6 di bidang di atas.

Coba perbaiki pola, ketikkan kontrol HTML5 untuk memperbaiki masalah ini.

sudhAnsu63
sumber
Anda memecahkan masalah saya. Tetapi perhatikan bahwa patterntampaknya tidak dapat diterima secara universal di type="number"lapangan
João Pimentel Ferreira
3

Saya mendapatkan kesalahan ini, dan memutuskan bahwa itu sebenarnya di bidang yang tidak disembunyikan.

Dalam hal ini, itu adalah type="number"bidang, yang wajib diisi. Jika tidak ada nilai yang pernah dimasukkan ke bidang ini, pesan kesalahan ditampilkan di konsol, dan formulir tidak dikirimkan. Memasukkan nilai, dan kemudian menghapusnya berarti kesalahan validasi ditampilkan seperti yang diharapkan.

Saya yakin ini adalah bug di Chrome: solusi saya untuk saat ini adalah menghasilkan nilai awal / default.

Matthew Schinckel
sumber
Kemungkinan bug di Chrome. Juga terjadi pada saya. +1
gamliela
1

Saya mengalami kesalahan:

Kontrol bentuk yang tidak valid dengan name = 'telefono' tidak dapat difokuskan.

Ini terjadi karena saya tidak menggunakan bidang wajib dengan benar, yang diaktifkan dan dinonaktifkan saat mengklik kotak centang. Solusinya adalah menghapus requiredatribut setiap kali kotak centang tidak ditandai dan menandainya sebagai diperlukan saat kotak centang ditandai.

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

Saya harus melakukan sesuatu seperti ini untuk memperbaiki bug, karena saya punya beberapa type="number"dengan 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);
});

Jika saya tidak menyetel semua bidang masukan tersembunyi ke nullchrome akan tetap mencoba memvalidasi masukan.

Dalin Huang
sumber
1

Tidak ada validasi yang akan melakukan pekerjaan itu.

<form action="whatever" method="post" novalidate>
Hassi
sumber
0

Saya mengalami masalah ini ketika saya memiliki class = "hidden" pada kolom input karena saya menggunakan tombol alih-alih peluru radio - dan mengubah status "aktif" melalui JS ..

Saya hanya menambahkan bagian bidang input radio tambahan dari grup yang sama tempat saya ingin pesan muncul:

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

2 peluru aktif lainnya tidak terlihat, yang satu ini tidak dan ini memicu pesan validasi dan tidak ada kesalahan konsol - sedikit peretasan tetapi apa yang tidak sekarang ini ..

Fstarocka Burns
sumber
0

kesalahan ini dapatkan jika menambahkan format desimal. saya hanya menambahkan

step="0.1"
Роман Зыков
sumber
0

Saya mendapat pesan kesalahan ini ketika saya memasukkan nomor (999999) yang berada di luar kisaran yang saya tetapkan untuk formulir.

<input type="number" ng-model="clipInMovieModel" id="clipInMovie" min="1" max="10000">
Thomas David Kehoe
sumber
-2
$("...").attr("required"); and $("...").removeAttr("required"); 

tidak berfungsi untuk saya sampai saya memasukkan semua kode jQuery saya di antara itu:

$(document).ready(function() {
    //jQuery code goes here
});
Fédi BELKACEM
sumber
-5

ganti requireddengan wajib = "wajib"

Webodrey
sumber
2
Diperlukan adalah atribut HTML5 dan dan "diperlukan" memiliki arti yang sama dengan required = 'diperlukan' karena tidak ada atribut lain yang tersedia.
ilter