Nonaktifkan validasi elemen formulir HTML5

418

Di formulir saya, saya ingin menggunakan tipe formulir HTML5 baru, misalnya <input type="url" />( info lebih lanjut tentang jenis di sini ).

Masalahnya adalah Chrome ingin menjadi sangat membantu dan memvalidasi elemen-elemen ini untuk saya, kecuali bahwa itu menyebalkan. Jika gagal validasi bawaan, tidak ada pesan atau indikasi selain elemen mendapatkan fokus. Saya lebih suka elemen URL "http://", dan validasi khusus saya sendiri hanya memperlakukan nilai-nilai itu sebagai string kosong, namun Chrome menolaknya. Jika saya bisa mengubah aturan validasinya, itu akan berhasil juga.

Saya tahu saya bisa saja kembali menggunakan type="text"tetapi saya ingin perangkat tambahan yang bagus menggunakan penawaran jenis baru ini (mis.: Secara otomatis beralih ke tata letak keyboard khusus pada perangkat seluler):

Jadi, apakah ada cara untuk mematikan atau menyesuaikan validasi otomatis?

nickf
sumber
8
Draf HTML 5.1 spesifikasi menyebutkan inputmodeatribut , yang - jika saya memahami apa yang saya baca dengan benar - dapat digunakan untuk menentukan jenis keyboard apa yang harus ditawarkan kepada pengguna ketika mereka berinteraksi dengan bidang, tanpa juga menyiratkan aturan validasi apa pun. Di beberapa titik di masa depan, menggunakan inputmodeatribut sebagai ganti typeatribut mungkin akan menjadi solusi yang tepat untuk masalah ini - tetapi belum.
Mark Amery
@MarkAmery Meskipun tidak akan terlalu sulit untuk mendapatkan masa depan sekarang:$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
Marnen Laibow-Koser
1
@ MarnenLaibow-Koser Sementara apa yang telah Anda jelaskan berfungsi jika semua yang ingin Anda lakukan adalah mematikan validasi (seperti yang ditentukan oleh penanya pertanyaan), itu tidak cukup mencapai hasil yang sama seperti inputmodeakan. Melakukan hal-hal dengan cara Anda, Anda masih tidak bisa (misalnya) membaca nilai-nilai non-numerik yang diketik pengguna ke dalam kotak input jenis number. Misalnya, coba ketikkan sesuatu yang bukan angka ke dalam kotak teks di biola ini dan klik tombolnya.
Mark Amery
@MarkAmery Menarik. Apakah itu karena sama <input type='number'>sekali tidak menerima nilai non-numerik?
Marnen Laibow-Koser
@ MarnenLaibow-Koser Saya kira begitu. Jawaban yang diterima pada pertanyaan ini tentang masalah termasuk tautan ke spec yang diklaim penjawab mengamanatkan perilaku ini.
Mark Amery

Jawaban:

752

Jika Anda ingin menonaktifkan validasi sisi klien untuk formulir di HTML5, tambahkan atribut novalidate ke elemen formulir. Ex:

<form method="post" action="/foo" novalidate>...</form>

Lihat https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-form-novalidate

Jakob S
sumber
83
novalidate="novalidate"dan novalidate=""juga sintaks yang valid.
bassim
9
@bassim Sintaks yang valid tetapi terlalu bertele-tele — mengapa mengetik lebih dari yang Anda butuhkan?
user1569050
11
@ user1569050 Misalnya dalam kerangka kerja seperti CakePHP, itu akan menggunakan novalidate="novalidate"metode ketika Anda mengatur novalidate => truedalam $optionsarray dari FormHelper::create(). Terima kasih bassim untuk info tambahan :)
Jelmer
12
@ rybo111 Ini adalah validasi sisi klien, yang bagus untuk menurunkan jumlah permintaan ke server. Bukan alasan untuk memudahkan validasi di sisi server.
martti
11
@martti saya merujuk pada fakta bahwa jika saya menguji beberapa validasi PHP baru saya dapat dengan cepat menonaktifkan validasi JavaScript untuk satu formulir itu untuk menghindari keharusan mengisi seluruh formulir dengan benar. Saya seharusnya menulis "lebih mudah untuk diuji".
rybo111
31

Saya telah membaca spesifikasi dan melakukan beberapa pengujian di Chrome, dan jika Anda menangkap peristiwa "tidak valid" dan mengembalikan false yang tampaknya memungkinkan pengiriman formulir.

Saya menggunakan jquery, dengan HTML ini.

// suppress "invalid" events on URL inputs
$('input[type="url"]').bind('invalid', function() {
  alert('invalid');
  return false;
});

document.forms[0].onsubmit = function () {
  alert('form submitted');
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input type="url" value="http://" />
  <button type="submit">Submit</button>
</form>

Saya belum menguji ini di browser lain.

Ben Boyle
sumber
Luar biasa - Saya akan mencobanya besok dan memberi tahu Anda bagaimana hasilnya. Terima kasih.
nickf
Wow! Saya benar-benar mengalami kesulitan dalam mencari tahu ke mana acara pengiriman saya pergi. Terima kasih Pak!
Gipsy King
2
FireFox memvalidasi perubahan input. Maka acara 'tidak valid' tidak dipecat. Jadi, tidak ada solusi untuk saya.
Niels Steenbeek
7
besok tidak pernah datang :)
Lucky Soni
4
Tidak bekerja Saya telah membuat kode cuplikan. Menangkap invalidacara dan mengembalikan false tidak membiarkan formulir dikirimkan.
Dan Dascalescu
23

Saya hanya ingin menambahkan bahwa menggunakan atribut novalidate di formulir Anda hanya akan mencegah browser mengirim formulir. Browser masih mengevaluasi data dan menambahkan kelas pseudo: valid dan: tidak valid.

Saya menemukan ini karena kelas pseudo yang valid dan tidak valid adalah bagian dari stylesheet boilerplate HTML5 yang telah saya gunakan. Saya baru saja menghapus entri dalam file CSS yang terkait dengan kelas pseudo. Jika ada yang menemukan solusi lain, beri tahu saya.

BFTrick
sumber
Apa yang disebut entri?
tm_forthefuture
1
Haha - Saya tidak tahu lagi maaf. Ini 3 tahun yang lalu sekarang. :(
BFTrick
1
Maksud Anda:; <form action="" method="" class="" id="" novalidate>)
Muhammad Shahzad
15

Solusi terbaik adalah dengan menggunakan input teks dan menambahkan atribut inputmode = "url" untuk menyediakan fasilitas keyboard URL. Spesifikasi HTML5 dianggap untuk tujuan ini. Jika Anda tetap mengetik = "url" Anda mendapatkan validasi sintaks yang tidak berguna dalam setiap kasus (lebih baik untuk memeriksa apakah ia mengembalikan kesalahan 404 daripada sintaks yang cukup permisif dan tidak banyak membantu).

Anda juga memiliki kemungkinan untuk mengganti pola default dengan pola atribut = "https?: //.+" misalnya menjadi lebih permisif.

Menempatkan atribut novalidate ke formulir bukan jawaban yang tepat untuk pertanyaan yang diajukan karena menghapus validasi untuk semua bidang dalam formulir dan Anda mungkin ingin tetap validasi untuk bidang email misalnya.

Menggunakan jQuery untuk menonaktifkan validasi juga merupakan solusi buruk karena harus benar-benar berfungsi tanpa JavaScript.

Dalam kasus saya, saya meletakkan elemen pilih dengan 2 opsi (http: // atau https: //) sebelum input URL karena saya hanya perlu situs web (dan tidak ada ftp: // atau hal lainnya). Dengan cara ini saya menghindari mengetikkan awalan aneh ini (penyesalan terbesar dari Tim Berners-Lee dan mungkin sumber utama kesalahan sintaksis URL) dan saya menggunakan input teks sederhana dengan inputmode = "url" dengan placeholder (tanpa HTTP). Saya menggunakan jQuery dan skrip sisi server untuk memvalidasi keberadaan nyata situs web (no 404) dan untuk menghapus awalan HTTP jika dimasukkan (saya menghindari menggunakan pola seperti pola = "^ ((? Http).) * $" untuk mencegah menempatkan awalan karena saya pikir lebih baik menjadi lebih permisif)

Plancton
sumber
13

Alih-alih mencoba melakukan penghentian di sekitar validasi browser, Anda bisa menjadikan http://in sebagai teks placeholder. Ini dari halaman yang Anda tautkan:

Teks Placeholder

Perbaikan pertama yang dibawa HTML5 ke formulir web adalah kemampuan untuk mengatur teks placeholder di bidang input . Teks placeholder ditampilkan di dalam bidang input selama bidang tersebut kosong dan tidak fokus. Segera setelah Anda mengklik (atau tab untuk) bidang input, teks placeholder menghilang.

Anda mungkin pernah melihat teks placeholder sebelumnya. Misalnya, Mozilla Firefox 3.5 sekarang menyertakan teks placeholder di bilah lokasi yang bertuliskan "Cari Bookmark dan Riwayat":

masukkan deskripsi gambar di sini

Saat Anda mengklik (atau tab untuk) bilah lokasi, teks placeholder menghilang:

masukkan deskripsi gambar di sini

Ironisnya, Firefox 3.5 tidak mendukung penambahan teks placeholder ke formulir web Anda sendiri. C'est la vie.

Dukungan Placeholder

IE  FIREFOX SAFARI  CHROME  OPERA   IPHONE  ANDROID
·   3.7+    4.0+    4.0+    ·       ·       ·

Inilah cara Anda bisa menyertakan teks placeholder dalam formulir web Anda sendiri:

<form>
  <input name="q" placeholder="Search Bookmarks and History">
  <input type="submit" value="Search">
</form>

Browser yang tidak mendukung placeholderatribut hanya akan mengabaikannya. Tidak ada salahnya, tidak busuk. Lihat apakah browser Anda mendukung teks placeholder .

Ini tidak akan persis sama karena tidak akan memberikan "titik awal" bagi pengguna, tapi setidaknya setengah jalan.

John Kugelman
sumber
5
+1 untuk tip, tetapi sayangnya itu tidak akan menjadi solusi bagi saya. Saya masih tidak ingin validasi dilakukan, terutama karena UX untuk itu sangat buruk.
nickf
10

Saya menemukan solusi untuk Chrome dengan CSS pemilih berikut ini tanpa melewati formulir verifikasi asli yang bisa sangat berguna.

form input::-webkit-validation-bubble-message, 
form select::-webkit-validation-bubble-message,
form textarea::-webkit-validation-bubble-message {
    display:none;
} 

Dengan cara ini, Anda juga dapat menyesuaikan pesan Anda ...

Saya mendapat solusinya di halaman ini: http://trac.webkit.org/wiki/Styling%20Form%20Controls

Val Entin
sumber
1
Ini tidak berfungsi dalam versi terbaru dari chrome (29), saya ingin tahu apakah itu karena blink
Blowsie
5

Cukup gunakan novalidate di formulir Anda.

<form name="myForm" role="form" novalidate class="form-horizontal" ng-hide="formMain">

Bersulang!!!

brainSquezer
sumber
1
bagaimana dengan menonaktifkan validasi untuk satu tag input?
Tobias Kolb
0

Berikut adalah fungsi yang saya gunakan untuk mencegah chrome dan opera menampilkan dialog input yang tidak valid bahkan ketika menggunakan novalidate.

window.submittingForm = false;
$('input[novalidate]').bind('invalid', function(e) {
    if(!window.submittingForm){
        window.submittingForm = true;
        $(e.target.form).submit();
        setTimeout(function(){window.submittingForm = false;}, 100);
    }
    e.preventDefault();
    return false;
});
Tony Brix
sumber
0

Anda dapat menambahkan beberapa javascript untuk mengatasi gelembung validasi yang menjengkelkan dan menambahkan validator Anda sendiri.

document.addEventListener('invalid', (function(){
    return function(e) {
      //prevent the browser from showing default error bubble / hint
      e.preventDefault();
      // optionally fire off some custom validation handler
      // myValidation();
    };
})(), true);
Tobias Kolb
sumber
0

Jika Anda menandai elemen formulir required=""saat novalidate=""itu tidak membantu.

Cara untuk menghindari requiredvalidasi adalah dengan menonaktifkan elemen .

cweiske
sumber
-5

Anda dapat memasang ekstensi krom sederhana dan cukup menonaktifkan validasi dengan cepat https://chrome.google.com/webstore/detail/html5-form-validation-err/dcpagcgkpeflhhampddilklcnjdjlmlb/related

secara default semuanya akan berfungsi sebagai default, tetapi Anda akan dapat menonaktifkan validasi HTML5 dengan satu klik pada ikon ekstensi pada toolbar

Andrew Zhilin
sumber
Tidak yakin mengapa banyak orang tidak menyukai solusi ini, ini memungkinkan untuk menguji validasi server untuk formulir HTML5 tanpa menggunakan kode HTML yang sebenarnya
Andrew Zhilin
3
Saya percaya ini tidak disukai karena pertanyaannya berfokus pada pembuatan formulir HTML5 dan mematikan validasi otomatis untuk semua pengguna. Meminta semua pengguna Anda untuk A) menggunakan chrome dan B) menginstal ekstensi sebelum menggunakan situs Anda bukanlah solusi yang dapat dipertahankan.
Kallmanation