jQuery Validate - เปิดใช้งานการตรวจสอบสำหรับเขตข้อมูลที่ซ่อนอยู่


186

ในเวอร์ชันใหม่ของการตรวจสอบ jQuery ปลั๊กอิน 1.9 โดยค่าเริ่มต้นการตรวจสอบของเขตซ่อนละเว้น ฉันใช้ CKEditor เพื่อป้อนข้อความ textarea และมันซ่อนฟิลด์และแทนที่ด้วย iframe มีฟิลด์ แต่การตรวจสอบความถูกต้องถูกปิดใช้งานสำหรับเขตข้อมูลที่ซ่อนอยู่ ด้วยปลั๊กอินการตรวจสอบความถูกต้องเวอร์ชัน 1.8.1 ทุกอย่างทำงานตามที่คาดไว้

ดังนั้นคำถามของฉันคือวิธีการเปิดใช้งานการตรวจสอบความถูกต้องสำหรับเขตข้อมูลที่ซ่อนอยู่ด้วยปลั๊กอินการตรวจสอบความถูกต้อง v1.9

การตั้งค่านี้ไม่ทำงาน:

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


ลิงก์สำหรับ "การตรวจสอบความถูกต้องของเขตข้อมูลที่ถูกละเว้น" นั้นตายไปแล้ว
Beepye

<input type="text" name="myfield" id="myfield" required="required" style="display: none;">การตรวจสอบคือการทำงานโดยเริ่มต้นสำหรับผมด้วย ฉันไม่ต้องเปลี่ยนการตั้งค่าหรือทำอะไรเป็นพิเศษ
squarecandy

คำตอบ:


329

ผู้เขียนปลั๊กอินกล่าวว่าคุณควรใช้"วงเล็บไม่ทราบราคา" ,[]

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

Release: ปลั๊กอินการตรวจสอบความถูกต้อง 1.9.0: "... การเปลี่ยนแปลงอื่นควรทำให้การตั้งค่ารูปแบบที่มีองค์ประกอบที่ซ่อนอยู่ง่ายขึ้นตอนนี้สิ่งเหล่านี้จะถูกละเว้นโดยค่าเริ่มต้น (ตัวเลือก" ละเว้น "มี": ซ่อน "ตอนนี้เป็นค่าเริ่มต้น) อาจทำลายการตั้งค่าที่มีอยู่ในกรณีที่ไม่น่าเป็นไปได้จริงคุณสามารถแก้ไขได้โดยการตั้งค่าตัวเลือกละเว้นเป็น“ []” (วงเล็บเหลี่ยมที่ไม่มีเครื่องหมายคำพูด) "

วิธีเปลี่ยนการตั้งค่านี้สำหรับทุกรูปแบบ:

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

(ไม่จำเป็นว่า .setDefaults()อยู่ในdocument.readyฟังก์ชั่น)

หรือสำหรับหนึ่งรูปแบบเฉพาะ:

$(document).ready(function() {

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

});

แก้ไข :

ดูคำตอบนี้สำหรับวิธีการเปิดใช้งานการตรวจสอบความถูกต้องในบางฟิลด์ที่ซ่อนอยู่ แต่ยังคงไม่สนใจฟิลด์อื่น


แก้ไข 2 :

ก่อนที่จะแสดงความคิดเห็นว่า"สิ่งนี้ใช้ไม่ได้"โปรดทราบว่า OP กำลังถามเกี่ยวกับปลั๊กอินตรวจสอบ jQueryและคำถามของเขาไม่มีอะไรเลยเกี่ยวข้องกับวิธีการ ASP.NET, MVC หรือกรอบงาน Microsoft อื่น ๆ ที่สามารถเปลี่ยนแปลงปลั๊กอินนี้ได้ตามปกติ พฤติกรรมที่คาดหวัง หากคุณใช้เฟรมเวิร์ก Microsoft การทำงานเริ่มต้นของปลั๊กอิน jQuery Validate จะถูกเขียนทับโดยunobtrusive-validationปลั๊กอินของ Microsoft

หากคุณกำลังดิ้นรนกับunobtrusive-validationปลั๊กอินโปรดอ้างอิงคำตอบนี้แทน: https://stackoverflow.com/a/11053251/594235


26
บางทีผู้ลงคะแนนเสียงสามารถให้ข้อเสนอแนะที่สร้างสรรค์กับฉันได้บ้าง มิฉะนั้นคำตอบนั้นมีอยู่ในตัวเองอย่างสมบูรณ์แหล่งที่มาอย่างถูกต้องให้ตัวอย่างรหัสและมีความถูกต้องทางเทคนิคตามที่ผู้เขียนปลั๊กอิน
ปาร์ก

1
@StijnVanBael ไม่นั่นเป็นเท็จ ดู: jsfiddle.net/F4w92/1และยังเห็นความคิดเห็นที่สองของฉันในคำตอบของ jerick
Sparky

4
@ Sparky พูดดี ลงคะแนนเสียงอาจชนิดของการแก้แค้นฉันได้พบเดียวกัน ..
โอมาร์

1
JSFiddle ไม่ทำงานอีกต่อไปเพราะโหลดไลบรารีใน HTTP แทน HTTPS รุ่นที่อัปเดตแล้ว: jsfiddle.net/F4w92/31
hotips

1
ฉันลงคะแนนเนื่องจากยังใช้งานไม่ได้กับรุ่นล่าสุดต้องใช้: $ ("form"). data ("validator"). settings.ignore = ""; เช่นเดียวกับคำตอบอื่น ๆ จาก @James bellow
Mark Homer

73

สิ่งนี้ใช้ได้กับฉันภายในไซต์ ASP.NET MVC3 ที่ฉันออกจากกรอบการตั้งค่าการตรวจสอบที่ไม่สร้างความรำคาญ ฯลฯ ในกรณีที่เป็นประโยชน์กับทุกคน:

$("form").data("validator").settings.ignore = "";

2
ฉันชอบสิ่งนี้เพราะมันหมายความว่าฉันสามารถทำได้ในบางสถานการณ์แทนที่จะเปลี่ยนพฤติกรรมเริ่มต้น
Steve Owen

5
ฉันต้องทำอย่างนี้เพราะใช้. validate () เพื่อเปลี่ยนตัวเลือกที่ไม่ทำงาน
Farinha

1
นี่เป็นทางออกที่ถูกต้องสำหรับการตรวจสอบที่ไม่เป็นการรบกวนฉันลองใช้วิธีแก้ไขอื่น ๆ ทั้งหมดพวกเขาสามารถทำงานได้ในกรณีที่ไม่ได้ใช้งานโดยไม่เป็นการรบกวน หากคุณใช้การไม่สร้างความรำคาญที่นี่เป็นสถานที่ที่เหมาะสม
Hakan Fıstık

มีการใช้วิธีการนี้ยังไม่สร้างความรำคาญสำหรับการตรวจสอบการทำงานที่มีเงินทุนหีบเพลง
bsod_

เมื่อฉันเปลี่ยนเป็นแบบฟอร์มนี้จะไม่ได้รับการตรวจสอบความถูกต้อง ฉันใช้. net หลักที่ไม่สร้างความรำคาญ
Offir Pe'er

64

ตรวจสอบให้แน่ใจที่จะใส่

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

ไม่ได้อยู่ข้างใน$(document).ready


2
คำตอบที่ยอดเยี่ยม ลิงก์ไปยังเอกสารเป็นสิ่งที่ดีสำหรับคนที่จะเรียนรู้ แต่คำตอบที่ตรงคือ imo ที่มีค่ามากกว่า เขา OP อยู่ในเส้นทางที่ถูกต้อง แต่วางไว้นอก $ (เอกสาร). ready เป็นกลอุบาย
Kevin Zych

3
@KevinZych เห็นได้ชัดว่ามันไม่ทำให้เกิดความแตกต่างอย่างแน่นอนไม่ว่า$.validator.setDefaults()จะอยู่ภายในหรือภายนอกตัวจัดการพร้อม DOM เปรียบเทียบjsFiddle นี้จะjsFiddle นี้
ปาร์ก

@Sparky ที่น่าสนใจปริศนาของคุณเป็นหลักฐานที่ยอดเยี่ยม ฉันต้องย้อนกลับไปดูรหัสที่ฉันแก้ไขโดยใช้โซลูชันนี้และหาสาเหตุที่ฉันสรุปว่าต้องอยู่ในตัวจัดการ DOM พร้อม ต้องมีเหตุผลอื่นบ้าง
เควิน Zych

จัสตินอธิบายว่าทำไมการทำงานใน doc doc ทำให้เกิดปัญหา อย่างไรก็ตามคำตอบนี้ไม่ใช่ตัวเลือกที่ดีเพราะมันยากที่จะรับประกันว่าบางสิ่งที่อยู่นอกเอกสารพร้อมจะเรียกใช้ก่อนที่เอกสารพร้อม Doc.ready จะไม่รอให้สคริปต์จากภายนอกทำงาน ไม่มีข้อมูลส่วนบุคคล แต่นี่ไม่ใช่คำตอบที่เชื่อถือได้
AaronLS

ในที่สุดฉันก็มีคำตอบ
.. ขอบคุณ

29

ดังนั้นฉันจะไปลึกลงไปอีกเล็กน้อยว่าทำไมถึงไม่ได้ผลเพราะฉันเป็นคนประเภทที่นอนไม่หลับตอนกลางคืนโดยที่ไม่รู้ว่าฮ่าฮ่า ฉันใช้ jQuery validate 1.10 และ Microsoft jQuery ไม่ผ่านการตรวจสอบความถูกต้อง 2.0.20710.0 ซึ่งเผยแพร่เมื่อ 1/29/2013

ฉันเริ่มต้นด้วยการค้นหาวิธี setDefaults ใน jQuery Validate และพบในบรรทัดที่ 261 ของไฟล์ที่ไม่ระบุ ฟังก์ชั่นทั้งหมดนี้ทำจริงๆคือรวมการตั้งค่า json ของคุณเข้ากับที่มีอยู่$.validator.defaultsซึ่งเริ่มต้นด้วยคุณสมบัติการเพิกเฉยที่ถูกตั้งค่าเป็น ": hidden" พร้อมกับค่าเริ่มต้นอื่น ๆ ที่กำหนดไว้ใน jQuery Validate ดังนั้นเมื่อถึงจุดนี้เราก็ไม่สนใจเลย ตอนนี้เรามาดูกันว่าคุณสมบัติค่าเริ่มต้นนี้อยู่ที่ไหน

เมื่อฉันตรวจสอบรหัสเพื่อดูว่า$.validator.defaultsมีการอ้างอิง ฉันสังเกตเห็นว่าตัวสร้างถูกใช้โดยตัวตรวจสอบความถูกต้องของฟอร์มเท่านั้นบรรทัดที่ 170 ใน jQuery จะตรวจสอบความถูกต้องของไฟล์ที่ไม่ได้ระบุ

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

ณ จุดนี้เครื่องมือตรวจสอบจะรวมการตั้งค่าเริ่มต้นใด ๆ ที่ตั้งค่าไว้และแนบไปกับเครื่องมือตรวจสอบความถูกต้องของฟอร์ม เมื่อคุณดูรหัสที่ใช้ในการตรวจสอบความถูกต้องการไฮไลต์การไฮไลต์ ฯลฯ พวกเขาทั้งหมดใช้วัตถุ validator.settings เพื่อดึงคุณสมบัติการเพิกเฉย ดังนั้นเราต้องตรวจสอบให้แน่ใจว่าเราจะตั้งค่าการเพิกเฉยด้วยเมธอด setDefaults มันจะต้องเกิดขึ้นก่อนที่จะมีการเรียกใช้ $ ("form") validate ()

หากคุณกำลังใช้ Asp.net MVC และปลั๊กอินที่ไม่สร้างความรำคาญคุณจะรู้ว่าหลังจากใช้จาวาสคริปต์ที่ตรวจสอบความถูกต้องแล้วจะถูกเรียกใช้ใน document.ready ฉันยังเรียกว่า setDefaults ของฉันใน document.ready block ซึ่งจะดำเนินการหลังจากสคริปต์ตรวจสอบ jQuery และไม่เป็นการรบกวนเพราะฉันได้กำหนดสคริปต์เหล่านั้นใน html ก่อนที่จะมีการเรียกใช้ ดังนั้นการโทรของฉันจึงไม่มีผลกระทบต่อการทำงานเริ่มต้นของการข้ามองค์ประกอบที่ซ่อนอยู่ในระหว่างการตรวจสอบความถูกต้อง มีตัวเลือกสองสามตัวที่นี่

ตัวเลือกที่ 1 - คุณอาจทำตามที่ Juan Mellado ชี้ให้เห็นว่ามีการโทรออกนอกเอกสารซึ่งจะดำเนินการทันทีที่โหลดสคริปต์ ฉันไม่แน่ใจเกี่ยวกับช่วงเวลานี้เนื่องจากเบราว์เซอร์สามารถทำการโหลดสคริปต์แบบขนานได้แล้ว หากฉันเป็นเพียงความระมัดระวังโปรดแก้ไขให้ถูกต้อง นอกจากนี้ยังอาจมีวิธีการรอบนี้ แต่สำหรับความต้องการของฉันฉันไม่ได้ลงเส้นทางนี้

ตัวเลือกที่ 2a - เดิมพันที่ปลอดภัยในสายตาของฉันเป็นเพียงการเปลี่ยน$.validator.setDefaults({ ignore: '' });ภายในของเหตุการณ์ document.ready $("form").data("validator").settings.ignore = "";กับ สิ่งนี้จะแก้ไขคุณสมบัติการเพิกเฉยที่ jQuery ใช้จริงตรวจสอบเมื่อทำการตรวจสอบแต่ละครั้งในองค์ประกอบของคุณสำหรับแบบฟอร์มที่กำหนด

ตัวเลือก 2b - หลังจากดูรหัสอีกเล็กน้อยคุณสามารถใช้$("form").validate().settings.ignore = "";เป็นวิธีการตั้งค่าคุณสมบัติการเพิกเฉยได้ เหตุผลก็คือเมื่อดูที่ฟังก์ชันตรวจสอบความถูกต้องมันจะตรวจสอบเพื่อดูว่าวัตถุตัวตรวจสอบความถูกเก็บไว้แล้วสำหรับองค์ประกอบของฟอร์มผ่าน$.data()ฟังก์ชั่น หากพบวัตถุตรวจสอบความถูกเก็บไว้กับองค์ประกอบแบบฟอร์มก็แค่ส่งกลับวัตถุตรวจสอบความถูกต้องแทนการสร้างอีกหนึ่ง


ขอบคุณสำหรับคำตอบโดยละเอียด!
davidallyoung

การทำงานที่ดีเนื่องจากคำตอบ OP ไม่ได้ผลสำหรับฉันใน MVC 5
Mark Homer

การวิเคราะห์ของคุณช่วยฉันได้มากในการแก้ไขปัญหาการตรวจสอบของฉัน +1
pgcan

15

สิ่งนี้ใช้ได้กับฉันภายในไซต์ ASP.NET ในการเปิดใช้งานการตรวจสอบความถูกต้องของฟิลด์ที่ซ่อนอยู่ให้ใช้รหัสนี้

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

หากต้องการเปิดใช้งานการตรวจสอบความถูกต้องสำหรับองค์ประกอบทั้งหมดของฟอร์มให้ใช้อันนี้ $("form").data("validator").settings.ignore = "";

ทราบว่าใช้พวกเขาภายใน $(document).ready(function() { })


8

เพิ่งเพิ่มignore: []ในหน้าเฉพาะสำหรับแบบฟอร์มเฉพาะโซลูชันนี้ใช้งานได้สำหรับฉัน

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


0

การตรวจสอบความถูกต้องใช้งานได้สำหรับฉันในการส่งแบบฟอร์ม แต่มันไม่ได้ทำการตรวจสอบความถูกต้องของเหตุการณ์ที่เกิดปฏิกิริยาเมื่อป้อนข้อมูลไปยังรายการที่เลือกที่เลือก

ในการแก้ไขปัญหานี้ฉันได้เพิ่มสิ่งต่อไปนี้เพื่อทริกเกอร์เหตุการณ์การตรวจสอบ jquery ด้วยตนเองที่เพิ่มโดยไลบรารี:

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

jquery.validate จะเพิ่ม.validคลาสในรายการเลือกต้นแบบ

Caveat: สิ่งนี้ต้องการรูปแบบ html ที่สอดคล้องกันสำหรับอินพุตของคุณ ในกรณีของการป้อนข้อมูลยื่นแต่ละห่อในและแต่ละอินพุตมีdiv.form-group.form-control


-15

เพียงแค่ค้นหาข้อความที่ไม่สนใจ: ": ซ่อนอยู่"ในไฟล์การตรวจสอบ jquery ของคุณและแสดงความคิดเห็น หลังจากแสดงความคิดเห็นแล้วจะไม่มีการสูญเสียองค์ประกอบที่ซ่อนอยู่เพื่อตรวจสอบความถูกต้อง ...

ขอบคุณ


5
เป็นความคิดที่ดีที่จะสุ่มใส่รหัสในห้องสมุดของบุคคลที่สาม
ฌาค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.