ปิดใช้งานการตรวจสอบความถูกต้องขององค์ประกอบแบบฟอร์ม HTML5


418

ในรูปแบบของฉันฉันต้องการใช้รูปแบบ HTML5 ใหม่ตัวอย่างเช่น <input type="url" /> ( ข้อมูลเพิ่มเติมเกี่ยวกับประเภทที่นี่ )

ปัญหาคือ Chrome ต้องการที่จะเป็นประโยชน์และตรวจสอบองค์ประกอบเหล่านี้ให้ฉันยกเว้นว่ามันแย่มาก หากไม่ผ่านการตรวจสอบความถูกต้องภายในจะไม่มีข้อความหรือตัวบ่งชี้อื่นใดนอกจากองค์ประกอบที่ได้รับโฟกัส ฉันใส่องค์ประกอบ URL ไว้ล่วงหน้าด้วย"http://"ดังนั้นการตรวจสอบความถูกต้องที่กำหนดเองของฉันก็แค่ถือว่าค่าเหล่านั้นเป็นสตริงว่างเปล่า แต่ Chrome ก็ปฏิเสธสิ่งนั้น ถ้าฉันสามารถเปลี่ยนกฎการตรวจสอบของมันก็จะใช้ได้เช่นกัน

ฉันรู้ว่าฉันสามารถย้อนกลับไปใช้type="text"แต่ฉันต้องการการปรับปรุงที่ดีโดยใช้ข้อเสนอประเภทใหม่เหล่านี้ (เช่น: มันจะเปลี่ยนเป็นรูปแบบแป้นพิมพ์แบบกำหนดเองบนอุปกรณ์มือถือโดยอัตโนมัติ):

ดังนั้นมีวิธีปิดหรือปรับแต่งการตรวจสอบอัตโนมัติหรือไม่


8
ข้อมูลจำเพาะร่าง HTML 5.1 กล่าวถึงinputmodeคุณลักษณะซึ่ง - หากฉันเข้าใจสิ่งที่ฉันอ่านอย่างถูกต้องสามารถใช้เพื่อระบุประเภทของแป้นพิมพ์ที่ควรเสนอให้กับผู้ใช้เมื่อพวกเขาโต้ตอบกับเขตข้อมูลโดยไม่ต้องมีกฎการตรวจสอบใด ๆ ในบางจุดในอนาคตการใช้แอinputmodeททริบิวแทนแอtypeททริบิวต์น่าจะเป็นทางออกที่ถูกต้องสำหรับปัญหานี้ แต่ยังไม่มี
Mark Amery

@ MarkAmery แม้ว่ามันจะไม่ยากเกินไปที่จะได้รับอนาคตในขณะนี้:$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
Marnen Laibow-Koser

1
@ MarnenLaibow-Koser ในขณะที่สิ่งที่คุณได้อธิบายไว้ใช้งานได้หากสิ่งที่คุณต้องการทำคือปิดการตรวจสอบความถูกต้อง (ตามที่ระบุโดยผู้ถามคำถาม) แต่ก็ไม่ได้ผลตามที่inputmodeต้องการ ทำสิ่งที่ทางของคุณคุณยังคงไม่สามารถ (ตัวอย่าง) numberอ่านค่าที่ไม่ใช่ตัวเลขที่ผู้ใช้เป็นกล่องใส่ของประเภท ตัวอย่างเช่นลองพิมพ์สิ่งที่ไม่ใช่ตัวเลขลงในกล่องข้อความในซอนี้และคลิกที่ปุ่ม
Mark Amery

@ MarkAmery น่าสนใจ นั่นเป็นเพราะ<input type='number'>ไม่ยอมรับค่าที่ไม่ใช่ตัวเลขเลยใช่ไหม
Marnen Laibow-Koser

@ MarnenLaibow-Koser ฉันว่างั้น คำตอบที่ได้รับการยอมรับในคำถามนี้เกี่ยวกับปัญหานั้นมีลิงก์ไปยังข้อมูลจำเพาะที่ผู้ตอบคำถามอ้างว่าเป็นตัวกำหนดพฤติกรรมนี้
Mark Amery

คำตอบ:


752

หากคุณต้องการปิดการใช้งานการตรวจสอบด้านลูกค้าสำหรับรูปแบบใน HTML5 เพิ่มแอตทริบิวต์ novalidate ไปยังองค์ประกอบของรูปแบบ Ex:

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

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


83
novalidate="novalidate"และnovalidate=""เป็นไวยากรณ์ที่ถูกต้องเช่นกัน
bassim

9
@bassim ไวยากรณ์ที่ถูกต้อง แต่ verbose มากเกินไปทำไมต้องพิมพ์มากกว่าที่คุณต้องการ
user1569050

11
@ user1569050 ตัวอย่างเช่นในเฟรมเวิร์กเช่น CakePHP มันจะใช้ novalidate="novalidate"วิธีการเมื่อคุณตั้งค่าnovalidate => trueในอาร์เรย์ของ$options FormHelper::create()Bassim ขอบคุณสำหรับข้อมูลพิเศษ :)
Jelmer

12
@ rybo111 นี่เป็นการตรวจสอบฝั่งไคลเอ็นต์ซึ่งเป็นการดีที่จะลดจำนวนการร้องขอไปยังเซิร์ฟเวอร์ ไม่มีข้อแก้ตัวใด ๆ ที่จะช่วยให้การตรวจสอบบนฝั่งเซิร์ฟเวอร์ง่ายขึ้น
martti

11
@ smartti ฉันหมายถึงความจริงที่ว่าถ้าฉันทดสอบการตรวจสอบ PHP ใหม่ฉันสามารถปิดการใช้งานการตรวจสอบ JavaScript อย่างรวดเร็วสำหรับหนึ่งรูปแบบนั้นเพื่อหลีกเลี่ยงการกรอกแบบฟอร์มทั้งหมดให้ถูกต้อง ฉันควรจะเขียนว่า "ง่ายต่อการทดสอบ"
rybo111

31

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

ฉันใช้ jquery กับ HTML นี้

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

ฉันไม่ได้ทดสอบสิ่งนี้ในเบราว์เซอร์อื่น ๆ


ยอดเยี่ยม - ฉันจะลองใช้ในวันพรุ่งนี้และแจ้งให้คุณทราบว่ามันจะเป็นอย่างไร ขอบคุณ
nickf

ว้าว! ฉันมีเวลาที่ยากลำบากในการดูว่ากิจกรรมการส่งของฉันหายไปไหน ขอบคุณมาก!
กษัตริย์ยิปซี

2
FireFox กำลังตรวจสอบความถูกต้องของการเปลี่ยนแปลงอินพุต เหตุการณ์นั้น 'ไม่ถูกต้อง' จะไม่ถูกไล่ออก ดังนั้นไม่มีวิธีแก้ปัญหาสำหรับฉัน
Niels Steenbeek

7
พรุ่งนี้จะไม่มีวันมาถึง :)
โชคดี Soni

4
ใช้งานไม่ได้ ฉันทำโค้ดเป็นตัวอย่าง การจับinvalidเหตุการณ์และการส่งคืนค่าเท็จไม่อนุญาตให้ส่งแบบฟอร์ม
Dan Dascalescu

23

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

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


รายการที่เรียกว่าอะไร?
tm_forthefuture

1
ฮ่าฮ่า - ฉันไม่รู้อีกแล้วขอโทษ นี่คือ 3 ปีที่ผ่านมาในขณะนี้ :(
BFTrick

1
คุณหมายถึง: <form action="" method="" class="" id="" novalidate>;)
Muhammad Shahzad

15

ทางออกที่ดีที่สุดคือการใช้การป้อนข้อความและเพิ่ม attribute inputmode = "url" เพื่อจัดทำคีย์บอร์ด URL ข้อกำหนด HTML5 ถูกคิดเพื่อจุดประสงค์นี้ หากคุณเก็บ type = "url" คุณจะได้รับการตรวจสอบความถูกต้องทางไวยากรณ์ซึ่งไม่เป็นประโยชน์ในทุกกรณี (เป็นการดีกว่าที่จะตรวจสอบว่ามันส่งกลับข้อผิดพลาด 404 แทนที่จะเป็นไวยากรณ์ที่ค่อนข้างอนุญาตและไม่ใช่ความช่วยเหลือที่ดี)

นอกจากนี้คุณยังมีความเป็นไปได้ที่จะแทนที่รูปแบบเริ่มต้นด้วยรูปแบบของแอตทริบิวต์ = "https?: //.+" เพื่อให้อนุญาตมากขึ้น

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

การใช้ jQuery เพื่อปิดใช้งานการตรวจสอบความถูกต้องเป็นวิธีการแก้ปัญหาที่ไม่ดีเพราะมันจะทำงานได้โดยไม่ต้องใช้ JavaScript

ในกรณีของฉันฉันใส่องค์ประกอบที่เลือกมี 2 ตัวเลือก (http: // หรือ https: //) หน้าอินพุต URL เพราะฉันต้องการเว็บไซต์ (และไม่มี ftp: // หรือสิ่งอื่น ๆ ) ด้วยวิธีนี้ฉันหลีกเลี่ยงการพิมพ์คำนำหน้าแปลก ๆ (ความเสียใจที่ยิ่งใหญ่ที่สุดของ Tim Berners-Lee และอาจเป็นแหล่งที่มาหลักของข้อผิดพลาดทางไวยากรณ์ของ URL) และฉันใช้การป้อนข้อความอย่างง่ายด้วย inputmode = "url" กับตัวแทน (ไม่มี HTTP) ฉันใช้ jQuery และสคริปต์ฝั่งเซิร์ฟเวอร์เพื่อตรวจสอบการมีอยู่จริงของเว็บไซต์ (ไม่ใช่ 404) และเพื่อลบคำนำหน้า HTTP ถ้าใส่ (ฉันหลีกเลี่ยงการใช้รูปแบบเช่น pattern = "^ ((http)) * $" เพื่อป้องกันการใส่คำนำหน้าเพราะฉันคิดว่าเป็นการดีกว่าที่จะอนุญาตมากขึ้น)


13

แทนที่จะพยายามสิ้นสุดการตรวจสอบความถูกต้องของเบราว์เซอร์คุณสามารถใส่http://ข้อความเป็นตัวยึดตำแหน่ง นี่คือจากหน้าเว็บที่คุณเชื่อมโยง:

ข้อความตัวยึด

การปรับปรุงครั้งแรก HTML5 มีเว็บรูปแบบคือความสามารถในการตั้งค่าข้อความตัวยึดในช่องใส่ ข้อความตัวยึดจะปรากฏภายในช่องป้อนข้อมูลตราบเท่าที่ฟิลด์นั้นว่างเปล่าและไม่ได้โฟกัส ทันทีที่คุณคลิกที่ (หรือแท็บเพื่อ) ช่องป้อนข้อความตัวยึดตำแหน่งจะหายไป

คุณอาจเคยเห็นข้อความตัวยึดตำแหน่งมาก่อน ตัวอย่างเช่น Mozilla Firefox 3.5 ตอนนี้มีข้อความตัวยึดในแถบตำแหน่งที่อ่าน“ ค้นหาบุ๊กมาร์กและประวัติ”:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อคุณคลิกที่ (หรือแท็บเพื่อ) แถบตำแหน่งข้อความตัวยึดจะหายไป:

ป้อนคำอธิบายรูปภาพที่นี่

กระแทกแดกดัน Firefox 3.5 ไม่สนับสนุนการเพิ่มข้อความตัวยึดในเว็บฟอร์มของคุณเอง C'est la vie

การสนับสนุนตัวแทน

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

นี่คือวิธีที่คุณสามารถรวมข้อความตัวยึดตำแหน่งในเว็บฟอร์มของคุณเอง:

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

เบราว์เซอร์ที่ไม่รองรับplaceholderแอตทริบิวต์นั้นจะเพิกเฉย ไม่เป็นอันตรายไม่เหม็น ดูว่าเบราว์เซอร์ของคุณรองรับข้อความตัวยึดตำแหน่งหรือไม่

มันจะไม่เหมือนเดิมเพราะจะไม่ให้ "จุดเริ่มต้น" แก่ผู้ใช้ แต่อย่างน้อยก็ครึ่งทาง


5
+1 สำหรับเคล็ดลับ แต่มันจะไม่เป็นทางออกสำหรับฉันอย่างน่าเสียดาย ฉันยังไม่ต้องการการตรวจสอบใด ๆ ที่ทำได้ส่วนใหญ่เป็นเพราะ UX เพราะมันแย่มาก
nickf

10

ฉันพบวิธีแก้ปัญหาสำหรับ Chrome ด้วย CSS ตัวเลือกต่อไปนี้โดยไม่ต้องข้ามแบบฟอร์มการยืนยันดั้งเดิมซึ่งอาจมีประโยชน์มาก

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

ด้วยวิธีนี้คุณสามารถปรับแต่งข้อความของคุณ ...

ฉันได้คำตอบในหน้านี้: http://trac.webkit.org/wiki/Styling%20Form%20Controls


1
นี้ไม่ได้ทำงานในรุ่นล่าสุดของโครเมี่ยม (29) ฉันสงสัยว่าเป็นเพราะการกระพริบตา
Blowsie

5

เพียงใช้novalidateในแบบฟอร์มของคุณ

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

ไชโย !!!


1
สิ่งที่เกี่ยวกับการปิดใช้งานการตรวจสอบสำหรับแท็กอินพุตเดียว?
Tobias Kolb

0

นี่คือฟังก์ชั่นที่ฉันใช้เพื่อป้องกันไม่ให้โครเมี่ยมและโอเปร่าแสดงกล่องโต้ตอบการป้อนข้อมูลที่ไม่ถูกต้องแม้ว่าจะใช้ 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;
});

0

คุณสามารถเพิ่มจาวาสคริปต์เพื่อบีบอัดฟองการตรวจสอบที่น่ารังเกียจเหล่านั้นและเพิ่มเครื่องมือตรวจสอบของคุณเอง

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

0

หากคุณทำเครื่องหมายองค์ประกอบแบบฟอร์มrequired=""นั้นnovalidate=""ไม่ช่วย

วิธีที่จะหลีกเลี่ยงrequiredการตรวจสอบคือการปิดการใช้งานองค์ประกอบ


-5

คุณสามารถติดตั้งส่วนขยาย chrome อย่างง่ายและเพียงปิดการใช้งานการตรวจสอบได้ทันที https://chrome.google.com/webstore/detail/html5-form-validation-err/dcpagcgkpeflhhampddilklcnjdjlmlb/related

โดยค่าเริ่มต้นทุกอย่างจะทำงานเป็นค่าเริ่มต้น แต่คุณจะสามารถปิดใช้งานการตรวจสอบความถูกต้อง html5 ด้วยการคลิกเพียงครั้งเดียวที่ไอคอนส่วนขยายบนแถบเครื่องมือ


ไม่แน่ใจว่าทำไมผู้คนจำนวนมากไม่ชอบวิธีนี้จึงอนุญาตให้ทดสอบการตรวจสอบเซิร์ฟเวอร์สำหรับรูปแบบ HTML5 โดยไม่ต้องใช้รหัส HTML จริง
Andrew Zhilin

3
ฉันเชื่อว่าไม่ชอบเพราะคำถามมุ่งเน้นไปที่การสร้างแบบฟอร์ม HTML5 และปิดการตรวจสอบอัตโนมัติสำหรับผู้ใช้ทั้งหมด การขอให้ผู้ใช้ทั้งหมดของคุณใช้ A) ใช้ chrome และ B) ติดตั้งส่วนขยายก่อนที่จะใช้ไซต์ของคุณไม่ใช่วิธีแก้ไขปัญหาได้
Kallmanation
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.