Validasi jQuery - Mengaktifkan validasi untuk bidang tersembunyi

186

Dalam versi baru plugin validasi jQuery 1.9 dengan validasi default bidang tersembunyi diabaikan . Saya menggunakan CKEditor untuk bidang input textarea dan menyembunyikan bidang dan menggantinya dengan iframe. Field ada di sana, tetapi validasi dinonaktifkan untuk field tersembunyi. Dengan validasi plugin versi 1.8.1 semuanya berfungsi seperti yang diharapkan.

Jadi pertanyaan saya adalah bagaimana mengaktifkan validasi untuk bidang tersembunyi dengan plugin validasi v1.9.

Pengaturan ini tidak berfungsi:

$.validator.setDefaults({ ignore: '' });
Dukun
sumber
Tautan untuk "validasi bidang tersembunyi diabaikan" sudah mati.
Beepye
Validasi bekerja secara default untuk saya dengan <input type="text" name="myfield" id="myfield" required="required" style="display: none;">. Saya tidak perlu mengubah pengaturan atau melakukan sesuatu yang istimewa.
squarecandy

Jawaban:

329

Penulis plugin mengatakan Anda harus menggunakan "tanda kurung kotak tanpa tanda kutip" ,[]

http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/

Rilis: Validasi Plugin 1.9.0: "... Perubahan lain akan membuat pengaturan formulir dengan elemen tersembunyi lebih mudah, ini sekarang diabaikan secara default (opsi" abaikan "memiliki": tersembunyi "sekarang sebagai default). Secara teori, ini dapat merusak pengaturan yang ada. Dalam kasus yang tidak mungkin benar-benar terjadi, Anda dapat memperbaikinya dengan mengatur opsi abaikan ke “[]” (kurung kotak tanpa tanda kutip). "

Untuk mengubah pengaturan ini untuk semua bentuk:

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(Tidak harus .setDefaults()berada dalam document.readyfungsi)

ATAU untuk satu bentuk spesifik:

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

EDIT :

Lihat jawaban ini untuk cara mengaktifkan validasi pada beberapa bidang tersembunyi tetapi masih mengabaikan yang lain.


EDIT 2 :

Sebelum meninggalkan komentar bahwa "ini tidak berfungsi" , perlu diingat bahwa OP hanya bertanya tentang plugin jQuery Validate dan pertanyaannya tidak ada hubungannya dengan bagaimana ASP.NET, MVC, atau kerangka kerja Microsoft lainnya dapat mengubah normal plugin ini. perilaku yang diharapkan. Jika Anda menggunakan kerangka Microsoft, fungsi default plugin jQuery Validate ditulis berlebihan oleh unobtrusive-validationplugin Microsoft .

Jika Anda kesulitan dengan unobtrusive-validationplugin, silakan lihat jawaban ini sebagai gantinya: https://stackoverflow.com/a/11053251/594235

Sparky
sumber
26
Mungkin pemilih bawah dapat memberi saya umpan balik yang konstruktif. Kalau tidak, jawabannya sepenuhnya mandiri, bersumber dengan benar, memberikan contoh kode, dan secara teknis benar sesuai penulis pengaya.
Sparky
1
@StijnVanBael, tidak, itu salah. Lihat: jsfiddle.net/F4w92/1 dan juga lihat komentar kedua saya tentang jawaban jerick .
Sparky
4
Kata baik @parky. Pemungutan suara mungkin semacam balas dendam, saya pernah mengalami hal yang sama ..
Omar
1
JSFiddle tidak berfungsi lagi karena pustaka dimuat dalam HTTP, bukan HTTPS. Versi terbaru: jsfiddle.net/F4w92/31
hotips
1
Saya downvoted juga karena ini tidak berfungsi untuk saya menggunakan versi terbaru, harus menggunakan: $ ("form"). Data ("validator"). Settings.ignore = ""; sebagai jawaban lain dari @James di bawah
Mark Homer
73

Ini bekerja untuk saya, di dalam situs ASP.NET MVC3 tempat saya meninggalkan kerangka kerja untuk menyiapkan validasi yang tidak mencolok, dll., Jika berguna bagi siapa pun:

$("form").data("validator").settings.ignore = "";
James Morcom
sumber
2
Saya juga suka yang ini karena itu berarti saya bisa melakukannya dalam keadaan tertentu, daripada mengubah perilaku default.
Steve Owen
5
Saya harus melakukannya dengan cara ini, karena menggunakan .validate () untuk mengubah opsi tidak berfungsi.
Farinha
1
ini adalah solusi yang benar untuk validasi tidak mencolok, saya mencoba semua solusi lain, mereka bisa bekerja jika TIDAK menggunakan tidak mengganggu. Jika Anda menggunakan tidak mengganggu di sini adalah tempat yang tepat.
Hakan Fıstık
Harus menggunakan metode ini juga untuk validasi yang tidak mencolok agar dapat bekerja dengan Bootstrap Accordion
bsod_
Ketika saya mengubahnya ke formulir ini tidak divalidasi. Saya menggunakan inti .net yang tidak mengganggu
Offir Pe'er
64

Pastikan untuk dimasukkan

 $.validator.setDefaults({ ignore: '' });

TIDAK di dalam$(document).ready

tersentak
sumber
2
Jawaban yang sangat bagus. Tautan ke dokumentasi itu baik untuk dipelajari orang, tetapi jawaban langsung lebih berharga. Dia OP berada di jalur yang benar, tetapi menempatkannya di luar $ (dokumen). Sudah triknya
Kevin Zych
3
@KevinZych, Ternyata, tidak ada bedanya apakah $.validator.setDefaults()ditempatkan di dalam atau di luar hander DOM. Bandingkan jsFiddle ini untuk jsFiddle ini .
Sparky
@Sparky menarik, biola Anda adalah bukti yang sangat baik. Saya harus kembali dan melihat kode yang saya perbaiki menggunakan solusi ini dan mencari tahu mengapa saya sampai pada kesimpulan bahwa itu harus di dalam handler DOM ready. Pasti ada alasan lain.
Kevin Zych
Justin menjelaskan mengapa menjalankan doc siap menyebabkan masalah. Namun, jawaban ini bukan pilihan yang baik karena sulit untuk menjamin bahwa sesuatu di luar doc ready akan berjalan SEBELUM doc ready. Doc.ready tidak akan menunggu skrip di luar untuk berjalan. Bukan masalah pribadi, tapi ini bukan jawaban yang bisa diandalkan.
AaronLS
Akhirnya saya punya jawaban .. Terima kasih banyak
sp9
29

Jadi saya akan membahas lebih dalam mengapa ini tidak berhasil karena saya adalah tipe orang yang tidak bisa tidur di malam hari tanpa mengetahui haha. Saya menggunakan jQuery memvalidasi 1.10 dan Microsoft jQuery Unobtrusive Validation 2.0.20710.0 yang diterbitkan pada 1/29/2013.

Saya mulai dengan mencari metode setDefaults di jQuery Validate dan menemukannya pada baris 261 dari file yang tidak ditentukan. Semua fungsi ini benar-benar dilakukan adalah menggabungkan pengaturan json Anda ke yang sudah ada $.validator.defaultsyang diinisialisasi dengan properti abaikan diatur ke ": disembunyikan" bersama dengan default lain yang didefinisikan dalam jQuery Validate. Jadi pada titik ini kita mengabaikan diabaikan. Sekarang mari kita lihat di mana properti default ini dirujuk.

Ketika saya menelusuri kode untuk melihat di mana $.validator.defaultsdireferensikan. Saya perhatikan bahwa itu hanya digunakan oleh konstruktor untuk validator formulir, baris 170 di jQuery memvalidasi file yang tidak ditentukan.

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

Pada titik ini validator akan menggabungkan pengaturan default apa pun yang ditetapkan dan melampirkannya ke form validator. Ketika Anda melihat kode yang melakukan validasi, penyorotan, penyorotan, dll mereka semua menggunakan objek validator.settings untuk menarik properti abaikan. Jadi kita perlu memastikan jika kita ingin mengatur abaikan dengan metode setDefaults maka itu harus terjadi sebelum $ ("form"). Validate () dipanggil.

Jika Anda menggunakan Asp.net MVC dan plugin yang tidak mencolok, maka Anda akan menyadari setelah melihat javascript yang divalidasi disebut dalam document.ready. Saya juga telah memanggil setDefaults saya di dokumen. Sudah blok yang akan mengeksekusi setelah skrip, jquery memvalidasi dan tidak mengganggu karena saya telah mendefinisikan skrip-skrip tersebut dalam html sebelum yang memiliki panggilan di dalamnya. Jadi panggilan saya jelas tidak berdampak pada fungsionalitas default melewatkan elemen tersembunyi selama validasi. Ada beberapa opsi di sini.

Opsi 1 - Anda bisa sebagai Juan Mellado menunjukkan memiliki panggilan di luar dokumen. Sudah yang akan mengeksekusi segera setelah skrip telah dimuat. Saya tidak yakin tentang waktu ini karena browser sekarang mampu melakukan pemuatan skrip paralel. Jika saya hanya terlalu berhati-hati maka tolong perbaiki saya. Juga, mungkin ada cara untuk mengatasi ini tetapi untuk kebutuhan saya, saya tidak menempuh jalan ini.

Opsi 2a - Taruhan aman di mata saya adalah dengan hanya mengganti bagian $.validator.setDefaults({ ignore: '' });dalam dokumen $("form").data("validator").settings.ignore = "";. Sudah acara dengan . Ini akan mengubah properti abaikan yang sebenarnya digunakan oleh jQuery memvalidasi ketika melakukan setiap validasi pada elemen Anda untuk formulir yang diberikan.

Opsi 2b - Setelah melihat kode sedikit lebih lanjut, Anda juga dapat menggunakan $("form").validate().settings.ignore = "";cara mengatur properti abaikan. Alasannya adalah bahwa ketika melihat fungsi validasi ia memeriksa untuk melihat apakah objek validator telah disimpan untuk elemen form melalui $.data()fungsi. Jika ia menemukan objek validator yang disimpan dengan elemen form maka itu hanya mengembalikan objek validator daripada membuat yang lain.

JustinMichaels
sumber
Terima kasih atas jawaban terinci!
davidallyoung
Kerja bagus karena jawaban OP tidak bekerja untuk saya di MVC 5
Mark Homer
analisis Anda banyak membantu saya dalam memperbaiki satu masalah validasi saya. +1
pgcan
15

Ini bekerja untuk saya dalam situs ASP.NET. Untuk mengaktifkan validasi pada beberapa bidang tersembunyi gunakan kode ini

$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";

Untuk mengaktifkan validasi untuk semua elemen formulir gunakan yang ini $("form").data("validator").settings.ignore = "";

Perhatikan bahwa menggunakannya di dalam $(document).ready(function() { })

angela.mirjalili
sumber
8

Baru saja ditambahkan ignore: []di halaman spesifik untuk formulir spesifik, solusi ini berhasil untuk saya.

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });
Kiran
sumber
1

Ini bekerja untuk saya.

jQuery("#form_name").validate().settings.ignore = "";
Waqas Bukhary
sumber
0

Validasi bekerja untuk saya pada pengiriman formulir, tetapi tidak melakukan validasi yang didorong oleh peristiwa reaktif pada input ke daftar pilih yang dipilih.

Untuk memperbaikinya, saya menambahkan berikut ini untuk secara manual memicu acara validasi jquery yang ditambahkan oleh perpustakaan:

$(".chosen-select").each(function() {
  $(this).chosen().on("change", function() {
    $(this).parents(".form-group").find("select.form-control").trigger("focusout.validate");
  });
});

jquery.validate sekarang akan menambahkan .validkelas ke daftar pilih yang mendasarinya.

Peringatan: Ini memang membutuhkan pola html yang konsisten untuk input formulir Anda. Dalam kasus saya, setiap input yang diajukan dibungkus dengan div.form-group, dan setiap input memiliki .form-control.

Zze
sumber
-15

Cukup temukan teks abaikan: ": disembunyikan" di file validasi jquery Anda dan beri komentar. Setelah mengomentari ini, elemen tersembunyi tidak akan pernah hilang untuk memvalidasi ...

Terima kasih

pengguna835525
sumber
5
Tidak pernah merupakan ide yang bagus untuk hanya mengomentari kode secara acak di perpustakaan pihak ketiga.
Jacques