คำตอบของนักวิทยาศาสตร์ html คำอธิบายของออบเจ็กต์การตอบสนอง ศาสตราจารย์มาร์กอัปกล่าวว่า

หากต้องการรับอินสแตนซ์ของคลาสนี้ ให้ใช้การเรียกเมธอด wa()->getResponse() เช่น:

Wa()->getResponse()->getHeader("ประเภทเนื้อหา")

วิธีการ ฟังก์ชั่นสาธารณะ addCss( $url, $app_id = เท็จ)

เพิ่ม URL ในรายการไฟล์ CSS URL ไฟล์ CSS ที่เพิ่มทั้งหมดสามารถเรียกค้นได้ในเทมเพลต Smarty โดยใช้วิธี ($wa->css())

ตัวเลือก
  • $url

    URL สัมพัทธ์ของไฟล์ CSS หากระบุค่าของพารามิเตอร์ $app_id ควรระบุ URL ของไฟล์โดยสัมพันธ์กับ URL ของไดเร็กทอรีที่มีไฟล์ของแอปพลิเคชันที่เกี่ยวข้อง มิฉะนั้น ควรระบุ URL แบบสัมพันธ์โดยสัมพันธ์กับไดเร็กทอรีการติดตั้งเฟรมเวิร์ก

  • $app_id

    รหัสแอปพลิเคชัน

ตัวอย่าง wa()->getResponse()->addCss("css/myapp.css", "myapp"); ฟังก์ชั่นสาธารณะ addGoogleAnalytics ( $str)

เพิ่มข้อมูลโค้ด JavaScript สำหรับ Google Analytics โค้ด Google Analytics (รวมถึงที่เพิ่มโดยวิธีนี้) เชื่อมต่ออยู่ในเทมเพลต HTML ของไซต์โดยใช้วิธี ($wa->headJs())

ตัวเลือก
  • $str

    ส่วนโค้ด JavaScript

ฟังก์ชั่นสาธารณะ addHeader( $name, $value, $replace = true)

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

ตัวเลือก
  • $ชื่อ

    ชื่อหัวเรื่อง.

  • $value

    ค่าชื่อเรื่อง

  • $แทนที่

    ธงที่ระบุว่าจะแทนที่ค่าที่ตั้งไว้ก่อนหน้านี้สำหรับส่วนหัวที่ระบุหรือไม่

ตัวอย่าง wa()->getResponse()->addHeader("Content-type", "application/json"); addJs ฟังก์ชั่นสาธารณะ ( $url, $app_id = เท็จ)

เพิ่ม URL ในรายการไฟล์ JavaScript URL ไฟล์ JavaScript ที่เพิ่มทั้งหมดสามารถเรียกค้นได้ในเทมเพลต Smarty โดยใช้วิธี ($wa->js())

ตัวเลือก
  • $url

    URL ของไฟล์ที่มีโค้ด JavaScript หากระบุค่าของพารามิเตอร์ $app_id ควรระบุ URL ของไฟล์โดยสัมพันธ์กับ URL ของไดเร็กทอรีที่มีไฟล์ของแอปพลิเคชันที่เกี่ยวข้อง มิฉะนั้น ควรระบุ URL แบบสัมพันธ์โดยสัมพันธ์กับไดเร็กทอรีการติดตั้งเฟรมเวิร์ก

  • $app_id

    รหัสแอปพลิเคชัน

ตัวอย่าง wa()->getResponse()->addJs("js/myapp.js", "myapp"); ฟังก์ชั่นสาธารณะ getCss( $html = จริง, $เข้มงวด = เท็จ)

ส่งคืนรายการลิงก์ไฟล์ CSS ที่เพิ่มไว้ก่อนหน้านี้

ตัวเลือก
  • $html

    แฟล็กระบุความจำเป็นในการส่งคืนโค้ด HTML สำหรับการเชื่อมต่อไฟล์ CSS หากระบุเป็นเท็จ วิธีการจะส่งกลับอาร์เรย์ของ URL สำหรับไฟล์ดังกล่าว

  • $เข้มงวด

    ตั้งค่าสถานะเพื่อใช้รูปแบบ XHTML แทน HTML เมื่อ $html ถูกตั้งค่าเป็นจริง

ตัวอย่าง wa()->getResponse()->getCss(); ฟังก์ชั่นสาธารณะ getHeader( $ชื่อ = โมฆะ)

ส่งกลับค่าของส่วนหัวการตอบกลับ

ตัวเลือก
  • $ชื่อ

    ID ของส่วนหัวซึ่งมีค่าที่จะถูกส่งกลับ หากไม่ได้ระบุไว้ วิธีการจะส่งกลับอาร์เรย์ส่วนหัวปัจจุบันทั้งหมด

ตัวอย่าง wa()->getResponse()->addHeader("Content-type", "application/json"); wa()->getResponse()->getHeader("ประเภทเนื้อหา"); ผลลัพธ์ของแอปพลิเคชัน/ฟังก์ชันสาธารณะ json getJs ( $html = จริง)

ส่งคืนรายการลิงก์ไฟล์ตอบกลับ JavaScript

ตัวเลือก
  • $html

    ธงทางเลือกที่บ่งชี้ถึงความจำเป็นในการส่งคืนโค้ด HTML สำหรับการเชื่อมต่อไฟล์ JavaScript มิฉะนั้นเมธอดจะส่งกลับอาร์เรย์ปัจจุบันของ URL ของไฟล์

ตัวอย่าง wa()->getResponse()->getJs(); ฟังก์ชั่นสาธารณะ getMeta ( $ชื่อ = โมฆะ)

ส่งกลับเนื้อหาของข้อมูล META: ชื่อหน้า ("ชื่อ") คำหลักแท็ก META ("คำหลัก") คำอธิบาย ("คำอธิบาย")

ตัวเลือก
  • $ชื่อ

    ตัวระบุองค์ประกอบข้อมูล META ที่มีค่าที่จะถูกส่งกลับ หากไม่ได้ระบุไว้ วิธีการนี้จะส่งคืนอาร์เรย์ข้อมูล META ปัจจุบันทั้งหมด

ตัวอย่าง wa()->getResponse()->getMeta("คำหลัก"); ฟังก์ชั่นสาธารณะ getStatus()

ส่งกลับสถานะการตอบสนองของเซิร์ฟเวอร์ที่ตั้งไว้ก่อนหน้านี้

ตัวอย่าง wa()->getResponse()->setStatus(200); วา()->getResponse()->getStatus(); ผลลัพธ์ 200 ฟังก์ชั่นสาธารณะ getTitle()

ส่งกลับชื่อเรื่อง (TITLE) ของหน้า

ตัวอย่าง wa()->getResponse()->setTitle("ร้านค้าออนไลน์ของฉัน"); วา()->getResponse()->getTitle(); ผลลัพธ์ การเปลี่ยนเส้นทางฟังก์ชั่นสาธารณะของร้านค้าออนไลน์ของฉัน ( $url, $code = null)

เปลี่ยนเส้นทางผู้ใช้ไปยัง URL ที่ระบุ

ตัวเลือก
  • $url

    URL ที่ผู้ใช้ควรถูกเปลี่ยนเส้นทาง

  • $รหัส

    รหัสตอบกลับของเซิร์ฟเวอร์ที่ควรมาพร้อมกับการเปลี่ยนเส้นทาง

ตัวอย่าง wa()->getResponse()->redirect("http://otherdomain.ru/", 301); ฟังก์ชั่นสาธารณะ sendHeaders()

ส่งส่วนหัวที่ตั้งไว้ก่อนหน้านี้

ตัวอย่าง wa()->getResponse()->addHeader("Content-type", "application/json"); วา()->getResponse()->sendHeaders(); ฟังก์ชั่นสาธารณะ setCookie ( $name, $value, $expire = null, $path = null, $domain = "", $secure = false, $http_only = false)

ตั้งค่าของรายการคุกกี้โดยใช้ฟังก์ชัน setcookie PHP

ตัวเลือก
  • $ชื่อ

    รหัสบันทึก

  • $value

    บันทึกมูลค่า

  • $หมดอายุ

    เวลาหมดอายุ

  • $เส้นทาง

    เส้นทางไปยัง URI "ไดเรกทอรีย่อย" ซึ่งค่าของรายการนั้นถูกต้อง

  • $โดเมน

    ชื่อโดเมนที่ค่าเข้าถูกต้อง

  • $ปลอดภัย

    แฟล็กที่ระบุว่ารายการจะพร้อมใช้งานก็ต่อเมื่อมีการโอนค่าผ่านโปรโตคอล HTTPS

  • $http_เท่านั้น

    แฟล็กที่ระบุว่าค่าบันทึกสามารถเข้าถึงได้ผ่านโปรโตคอล HTTP เท่านั้น และไม่สามารถเข้าถึงได้ผ่านสคริปต์ไคลเอนต์ (JavaScript)

ตัวอย่าง wa()->getResponse()->setCookie("code", $code, time() + 30 * 86400, null, "", false, true); ฟังก์ชั่นสาธารณะ setMeta ( $ชื่อ, $value = null)

ตั้งค่าข้อมูล META ค่านี้มีอยู่ในเทมเพลต Smarty โดยใช้วิธี ($wa->meta())

ตัวเลือก
  • $ชื่อ

    ตัวระบุองค์ประกอบข้อมูล META: ชื่อหน้า ("ชื่อ") คำสำคัญแท็ก META ("คำหลัก") และคำอธิบาย ("คำอธิบาย")

  • $value

    ค่าองค์ประกอบ

ตัวอย่าง wa()->getResponse()->setMeta("keywords", $keywords); ฟังก์ชั่นสาธารณะ setStatus( $รหัส)

ตั้งค่าสถานะการตอบสนองของเซิร์ฟเวอร์

ตัวเลือก
  • $รหัส

    รหัสสถานะ

ตัวอย่าง wa()->getResponse()->setStatus(404); ฟังก์ชั่นสาธารณะ setTitle( $ชื่อเรื่อง)

ตั้งชื่อเรื่อง (TITLE) ของเพจ เนื้อหาชื่อเรื่องมีอยู่ในเทมเพลต Smarty โดยใช้วิธี ($wa->title())

การแปล: วลาด เมอร์เซวิช

ใครๆ ก็รู้จักเว็บฟอร์มใช่ไหม? เราใส่แท็ก บางส่วน หรืออาจจะทำให้ทั้งหมดเสร็จสิ้นด้วยปุ่มเดียว เท่านี้ก็เสร็จเรียบร้อย

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

ข้อความแจ้ง รองรับข้อความแจ้ง
เช่น. ไฟร์ฟอกซ์ ซาฟารี โครเมียม โอเปร่า ไอโฟน หุ่นยนต์
- 4.0+ 4.0+ 4.0+ 11.0+ 4.0+ -

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

คุณอาจเคยเห็นข้อความแจ้งมาก่อน ตัวอย่างเช่น Mozilla Firefox มีข้อความที่มีการชี้นำทางเพศในแถบที่อยู่ที่ระบุว่า "ค้นหาบุ๊กมาร์กและประวัติ"

เมื่อคุณคลิกที่แถบที่อยู่ ข้อความคำใบ้จะหายไป

ต่อไปนี้คือวิธีที่คุณสามารถใส่ข้อความที่มีการชี้นำทางเพศในแบบฟอร์มของคุณ




เบราว์เซอร์ที่ไม่สนับสนุนแอตทริบิวต์ตัวยึดตำแหน่งจะเพิกเฉยต่อแอตทริบิวต์ดังกล่าว ไม่มีอันตรายหรือการละเมิด

ถามศาสตราจารย์มาร์กอัป

☞ ถาม ฉันสามารถใช้มาร์กอัป HTML สำหรับแอตทริบิวต์ตัวยึดตำแหน่งได้หรือไม่ ฉันต้องการแทรกรูปภาพหรืออาจจะเปลี่ยนสี

A. คุณลักษณะ placeholder สามารถมีได้เฉพาะข้อความเท่านั้น ไม่มีโค้ด HTML อย่างไรก็ตาม มีส่วนขยาย CSS พิเศษที่ให้คุณตั้งค่ารูปแบบข้อความในเบราว์เซอร์บางตัวได้

ฟิลด์โฟกัสอัตโนมัติ รองรับออโต้โฟกัส
เช่น. ไฟร์ฟอกซ์ ซาฟารี โครเมียม โอเปร่า ไอโฟน หุ่นยนต์
- - 4.0+ 3.0+ 10.0+ - -

เว็บไซต์สามารถใช้ JavaScript เพื่อเน้นที่ฟิลด์แบบฟอร์มแรกโดยอัตโนมัติ ตัวอย่างเช่นในหน้าหลัก Google.comช่องสำหรับป้อนคำค้นหาจะมีโฟกัสอัตโนมัติ แม้ว่าจะสะดวกสำหรับคนส่วนใหญ่ แต่ก็อาจสร้างความรำคาญให้กับผู้ใช้ขั้นสูงและผู้ที่มีความต้องการพิเศษได้ หากคุณกดเว้นวรรคระหว่างรอหน้าเลื่อน จะไม่มีการเลื่อนเนื่องจากโฟกัสอยู่ที่ช่องป้อนข้อมูลของแบบฟอร์ม (จะพิมพ์ช่องว่างลงในช่องแทนการเลื่อน) หากคุณย้ายโฟกัสไปยังช่องป้อนข้อมูลอื่นในขณะที่เพจกำลังโหลด สคริปต์โฟกัสอัตโนมัติของไซต์อาจ "ช่วย" ย้ายโฟกัสกลับไปยังช่องป้อนข้อมูลเดิม ซึ่งรบกวนการพิมพ์ของคุณและทำให้คุณพิมพ์ผิดที่

เนื่องจากโฟกัสอัตโนมัติทำงานผ่าน JavaScript จึงอาจมีปัญหาในการจัดการกับกรณีสุดโต่งเหล่านี้และตัวเลือกเล็กๆ น้อยๆ สำหรับผู้ที่ไม่ต้องการให้หน้าเว็บ "ขโมย" โฟกัสของพวกเขา

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

ต่อไปนี้คือวิธีที่คุณสามารถตั้งค่าฟิลด์แบบฟอร์มให้เป็นโฟกัสอัตโนมัติได้




เบราว์เซอร์ที่ไม่สนับสนุนคุณลักษณะโฟกัสอัตโนมัติจะเพิกเฉยต่อสิ่งนี้

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

  • เพิ่มแอตทริบิวต์ออโต้โฟกัสให้กับโค้ด HTML
  • ตรวจสอบว่าเบราว์เซอร์รองรับคุณลักษณะโฟกัสอัตโนมัติหรือไม่ และหากไม่รองรับ ให้เรียกใช้สคริปต์ของคุณเอง

ออโต้โฟกัสพร้อมทางเลือกอื่น




if (!("ออโต้โฟกัส" ใน document.createElement("input")) ) (
document.getElementById("q").โฟกัส();
}


ตั้งโฟกัสตั้งแต่เนิ่นๆ

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

ตัวอย่างเช่น ในส่วนก่อนหน้า สคริปต์โฟกัสอัตโนมัติจะถูกวางต่อจากฟิลด์แบบฟอร์มที่อ้างอิง นี่เป็นวิธีแก้ปัญหาที่ดีที่สุด แต่อาจขัดต่อความรู้สึกอ่อนไหวของคุณด้วยการใส่บล็อกโค้ด JavaScript ไว้ตรงกลางหน้า (หรือถ้าจะพูดง่ายๆ ก็คือ ระบบของคุณอาจไม่ยืดหยุ่นเท่าที่ควร) หากคุณไม่สามารถแทรกสคริปต์ไว้ตรงกลางหน้าได้ คุณควรกำหนดโฟกัสผ่านเหตุการณ์ที่กำหนดเอง เช่น $(document).ready() ใน jQuery แทน window.onload

ออโต้โฟกัสผ่าน jQuery




$(เอกสาร).ready(ฟังก์ชั่น() (

$("#q").โฟกัส();
}
});






เหตุการณ์ที่กำหนดเองของ jQuery จะเริ่มทำงานทันทีที่ DOM สามารถเข้าถึงได้ นั่นคือ รอให้โหลดข้อความของหน้า แต่ไม่รอให้โหลดรูปภาพทั้งหมด นี่ไม่ใช่แนวทางที่เหมาะสม - หากเพจมีขนาดใหญ่ผิดปกติหรือการเชื่อมต่อเครือข่ายช้า ผู้ใช้อาจยังคงโต้ตอบกับเพจก่อนที่จะเรียกใช้สคริปต์โฟกัส แต่ก็ยังดีกว่าการรอให้เหตุการณ์ window.onload เกิดขึ้นมาก

หากคุณตกลงและเต็มใจที่จะแทรกสคริปต์คำสั่งเดียวลงในโค้ดของเพจของคุณ นี่เป็นการประนีประนอมที่น่ารังเกียจน้อยกว่าตัวเลือกแรกและดีกว่าตัวเลือกที่สอง คุณสามารถใช้เหตุการณ์ที่กำหนดเองของ jQuery เพื่อตั้งค่าเหตุการณ์ของคุณเอง เช่น autofocus_ready จากนั้นคุณสามารถทริกเกอร์เหตุการณ์นี้ได้ด้วยตนเองทันทีที่ช่องโฟกัสอัตโนมัติพร้อมใช้งาน ขอขอบคุณ E.M. Shtenberg ที่สอนเทคนิคนี้ให้ฉัน

โฟกัสอัตโนมัติพร้อมเหตุการณ์แบบกำหนดเองสำรอง




$(document).bind("autofocus_ready", function() (
ถ้า (!("ออโต้โฟกัส" ใน document.createElement("input"))) (
$("#q").โฟกัส();
}
});





$(เอกสาร).trigger("ออโต้โฟกัส_พร้อม");

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

มาสรุปกัน

  • การตั้งโฟกัสให้ถูกต้องเป็นสิ่งสำคัญ
  • หากเป็นไปได้ ให้เบราว์เซอร์ใช้แอตทริบิวต์โฟกัสอัตโนมัติบนฟิลด์ที่คุณต้องการโฟกัส
  • หากคุณใช้โค้ดสำรองสำหรับเบราว์เซอร์รุ่นเก่า ให้กำหนดการสนับสนุนสำหรับแอตทริบิวต์โฟกัสอัตโนมัติเพื่อให้สคริปต์ทำงานในเบราว์เซอร์รุ่นเก่าเท่านั้น
  • ตั้งโฟกัสให้เร็วที่สุด แทรกสคริปต์โฟกัสลงในโค้ดทันทีหลังฟิลด์แบบฟอร์ม หากวิธีนี้ไม่รบกวนคุณ ให้ฝังไลบรารี JavaScript ที่รองรับเหตุการณ์แบบกำหนดเอง และเพิ่มเหตุการณ์ในโค้ดทันทีหลังจากช่องแบบฟอร์ม หากเป็นไปไม่ได้ ให้ใช้เหตุการณ์เช่น $(document).ready() จาก jQuery
  • ไม่ว่าในกรณีใดคุณไม่ควรรอให้ window.onload ได้รับการโฟกัส
ที่อยู่อีเมล

เป็นเวลากว่าทศวรรษแล้วที่แบบฟอร์มมีฟิลด์เพียงไม่กี่ประเภทเท่านั้น ที่พบบ่อยที่สุดมีดังต่อไปนี้

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

อย่างไรก็ตาม HTML5 กำหนดประเภทฟิลด์ใหม่ 13 ประเภท และไม่มีเหตุผลที่จะไม่เริ่มใช้งาน

ที่อยู่อีเมลประเภทแรกเหล่านี้ มันมีลักษณะเช่นนี้





ฉันจะเขียนประโยคที่เริ่มต้น "บนเบราว์เซอร์ที่ไม่รองรับ type="email" ..." แต่หยุดแล้ว ทำไม เพราะฉันไม่แน่ใจว่าเบราว์เซอร์ไม่รองรับ type="email" หรือไม่ เบราว์เซอร์ทั้งหมด "support" type="email" พวกเขาอาจไม่ทำอะไรเป็นพิเศษ แต่เบราว์เซอร์ที่ไม่รู้จัก type="email" จะถือว่าเป็น type="text" และแสดงผลเป็นช่องข้อความปกติ

ฉันจะเน้นย้ำว่าสิ่งนี้สำคัญแค่ไหน มีแบบฟอร์มหลายล้านรูปแบบบนอินเทอร์เน็ตที่ขอให้คุณป้อนที่อยู่อีเมลของคุณ และแบบฟอร์มทั้งหมดใช้ . คุณเห็นกล่องข้อความ ป้อนที่อยู่อีเมลของคุณลงไป เท่านี้ก็เรียบร้อย แล้วก็มาถึง HTML5 ซึ่งกำหนด type="email" เบราว์เซอร์กำลังคลั่งไคล้หรือไม่? เลขที่ ทุกเบราว์เซอร์บนโลกถือว่าแอตทริบิวต์ประเภทที่ไม่รู้จักเป็น type="text" - แม้แต่ IE6 ดังนั้นคุณจึงสามารถ "รีเฟรช" แบบฟอร์มของคุณโดยใช้ type="email" ได้ทันที

จะเกิดอะไรขึ้นถ้าเราบอกว่าเบราว์เซอร์รองรับ type="email" ? มันอาจจะหมายถึงอะไรก็ได้ ข้อกำหนด HTML5 ไม่จำเป็นต้องมีอินเทอร์เฟซผู้ใช้เฉพาะสำหรับประเภทฟิลด์ใหม่ Opera เพิ่มไอคอนขนาดเล็กลงในช่องแบบฟอร์ม เบราว์เซอร์ HTML5 อื่นๆ เช่น Safari และ Chrome แสดงผลเป็นช่องข้อความ เช่นเดียวกับ type="text" ดังนั้นผู้ใช้ของคุณจะไม่สังเกตเห็นความแตกต่าง (จนกว่าพวกเขาจะดูซอร์สโค้ด)

แล้วก็มีไอโฟน

iPhone ไม่มีแป้นพิมพ์จริง “การพิมพ์” ทั้งหมดทำได้โดยการคลิกบนแป้นพิมพ์บนหน้าจอที่ปรากฏขึ้นในเวลาที่เหมาะสม เช่น เมื่อคุณไปที่ช่องแบบฟอร์มบนหน้าเว็บ Apple ทำสิ่งที่ชาญฉลาดด้วยเบราว์เซอร์ของ iPhone โดยจะจดจำช่อง HTML5 ใหม่บางช่องและเปลี่ยนแป้นพิมพ์บนหน้าจอแบบไดนามิกเพื่อเพิ่มประสิทธิภาพการป้อนข้อมูล

เช่น ที่อยู่อีเมลเป็นข้อความใช่ไหม? แน่นอน แต่นี่เป็นข้อความประเภทพิเศษ ดังนั้น ที่อยู่อีเมลเกือบทั้งหมดจึงมีสัญลักษณ์ @ และอย่างน้อยหนึ่งจุด (.) แต่ไม่น่าจะมีการเว้นวรรค ดังนั้นเมื่อคุณใช้ iPhone และไปที่ คุณจะได้รับแป้นพิมพ์บนหน้าจอที่มีสเปซบาร์ขนาดเล็กกว่าและปุ่มเฉพาะสำหรับสัญลักษณ์ และ @.

ให้ฉันสรุปมันขึ้นมา ไม่มีข้อเสียในการแปลงฟิลด์อีเมลทั้งหมดของคุณเป็น type="email" ทันที แทบจะไม่มีใครสังเกตเห็นสิ่งนี้ยกเว้นผู้ใช้ iPhone ซึ่งอาจจะไม่สังเกตเห็นเช่นกัน แต่คนที่สังเกตก็จะยิ้มเงียบๆ และขอบคุณที่ทำให้งานง่ายขึ้นนิดหน่อย

ที่อยู่เว็บ

ที่อยู่เว็บ ซึ่งเป็นมาตรฐานที่เรียกว่า URL ยกเว้นคนอวดรู้บางคนที่เรียกว่า URI เป็นข้อความพิเศษอีกประเภทหนึ่ง ไวยากรณ์ของที่อยู่เว็บนั้นจำกัดอยู่ที่มาตรฐานอินเทอร์เน็ตที่เกี่ยวข้อง หากมีคนขอให้คุณป้อนที่อยู่เว็บลงในแบบฟอร์ม พวกเขาคาดหวังอะไรเช่น “http://www.google.com/” ไม่ใช่ “125 Farwood Road” เครื่องหมายทับเป็นเรื่องปกติ แม้แต่หน้าแรกของ Google ก็ยังมีเครื่องหมายทับสามอันด้วย จุดก็เป็นเรื่องปกติ แต่ห้ามเว้นวรรค และที่อยู่เว็บทุกแห่งจะมีส่วนต่อท้ายโดเมน เช่น ".com" หรือ ".org"

แล้วก็... (ขอกลองม้วนหน่อย)... . บน iPhone มีลักษณะเช่นนี้

iPhone ได้ออกแบบแป้นพิมพ์เสมือนใหม่เช่นเดียวกับที่ทำกับอีเมล แต่ตอนนี้ปรับให้เหมาะสมสำหรับการพิมพ์ที่อยู่เว็บแล้ว Space Bar ถูกแทนที่ด้วยคีย์เสมือนสามคีย์: เครื่องหมายทับ จุด และ ".com" (คุณสามารถกดปุ่ม ".com" ค้างไว้เพื่อเลือกส่วนต่อท้ายอื่น เช่น ".org" หรือ ".net")

เบราว์เซอร์ที่ไม่รองรับ HTML5 จะถือว่า type="url" เป็น type="text" ดังนั้นจึงไม่มีข้อเสียในการใช้ประเภทนี้กับทุกฟิลด์ที่คุณต้องป้อนที่อยู่เว็บ

ตัวเลขเป็นตัวนับ

ขั้นตอนต่อไป: ตัวเลข การขอหมายเลขมีความซับซ้อนมากกว่าการขออีเมลหรือที่อยู่เว็บ ก่อนอื่น ตัวเลขมีความซับซ้อนมากกว่าที่คุณคิด เลือกหมายเลขอย่างรวดเร็ว -1? ไม่ ฉันหมายถึงตัวเลขระหว่าง 1 ถึง 10.7 ½? ไม่ ไม่ อย่าเป็นเศษส่วนเลย ไอ้โง่ พาย? ตอนนี้คุณเพิ่งเลือกจำนวนอตรรกยะ

ฉันอยากจะทราบว่ามักไม่ค่อยมีคนถามคุณว่า "แค่ตัวเลข" มีแนวโน้มว่าพวกเขาจะขอตัวเลขในช่วงที่กำหนด คุณอาจต้องการเฉพาะตัวเลขบางประเภทในช่วงนั้น - อาจเป็นจำนวนเต็ม แต่ไม่ใช่เศษส่วนหรือทศนิยมหรืออะไรแปลกใหม่กว่าเช่นทวีคูณของ 10 HTML5 ครอบคลุมทั้งหมดนี้

เลือกเบอร์ได้เกือบทุกเบอร์

ลองดูที่คุณลักษณะครั้งละหนึ่งรายการ

  • type="number" หมายความว่านี่คือช่องตัวเลข
  • min="0" ระบุค่าต่ำสุดที่อนุญาตสำหรับฟิลด์นี้
  • max="10" คือค่าสูงสุดที่อนุญาต
  • step="2" ร่วมกับค่าต่ำสุดจะกำหนดตัวเลขที่ถูกต้องในช่วง: 0, 2, 4 และอื่นๆ จนถึงค่าสูงสุด
  • ค่า = "6" ค่าเริ่มต้น ควรดูคุ้นเคย นี่เป็นแอตทริบิวต์เดียวกับที่ใช้กำหนดค่าฟิลด์แบบฟอร์มเสมอ ฉันพูดถึงสิ่งนี้ที่นี่เป็นจุดเริ่มต้นที่ HTML5 สร้างจาก HTML เวอร์ชันก่อนหน้า คุณไม่จำเป็นต้องเรียนรู้ซ้ำเพื่อทำสิ่งที่คุณได้ทำไปแล้ว

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

แต่ HTML5 ไม่ได้หยุดอยู่แค่นั้น ด้วยราคาอิสระที่ต่ำและต่ำเช่นเดียวกัน คุณจะได้รับเทคนิค JavaScript ที่มีประโยชน์เหล่านี้

  • input.stepUp(n) เพิ่มค่าของฟิลด์ด้วย n
  • input.stepDown(n) ลดค่าของฟิลด์ลง n
  • input.valueAsNumber ส่งคืนค่าปัจจุบันเป็นตัวเลขทศนิยม (คุณสมบัติ input.value จะเป็นสตริงเสมอ)

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

ใน Opera เวอร์ชันเดสก์ท็อป ช่อง type="number" จะปรากฏเป็นตัวนับพร้อมลูกศรขึ้นและลงเล็กๆ ซึ่งคุณคลิกเพื่อเปลี่ยนค่าได้

Opera เคารพแอตทริบิวต์ min , max และ step ดังนั้นคุณจะได้ค่าตัวเลขที่ยอมรับได้เสมอ หากคุณเพิ่มค่าเป็นค่าสูงสุด ลูกศรขึ้นในตัวนับจะเปลี่ยนเป็นสีเทา

เช่นเดียวกับช่องป้อนข้อมูลอื่นๆ ทั้งหมดที่ฉันได้กล่าวถึงในบทนี้ เบราว์เซอร์ที่ไม่สนับสนุน type="number" จะถือว่าเป็น type="text" ค่าเริ่มต้นจะแสดงในช่อง (ตามที่จัดเก็บไว้ในแอตทริบิวต์ value) แต่แอตทริบิวต์อื่นๆ เช่น min และ max จะถูกละเว้น คุณมีอิสระที่จะนำไปใช้ด้วยตนเองหรือใช้เฟรมเวิร์ก JavaScript ที่ใช้การจัดการเคาน์เตอร์อยู่แล้ว ตรวจสอบที่นี่ก่อน

ถ้า (! .inputtypes.number) (
// ไม่มีการสนับสนุนดั้งเดิมสำหรับประเภทฟิลด์ = หมายเลข
// อาจลองใช้ Dojo หรือเฟรมเวิร์ก JavaScript อื่น
}

ตัวเลขเป็นตัวเลื่อน

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

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


คุณลักษณะที่มีอยู่ทั้งหมดเหมือนกับสำหรับ type="number" - min , max , step , value - และหมายถึงสิ่งเดียวกัน ข้อแตกต่างเพียงอย่างเดียวคืออินเทอร์เฟซผู้ใช้ แทนที่จะเป็นช่องป้อนข้อมูล เบราว์เซอร์ควรแสดง type="range" เป็นตัวเลื่อน ในขณะที่เขียนนี้ Safari, Chrome และ Opera เวอร์ชันล่าสุดใช้งานได้ น่าเสียดายที่ iPhone แสดงเป็นช่องข้อความธรรมดา มันไม่ได้ปรับแป้นพิมพ์บนหน้าจอให้เหมาะสมสำหรับการป้อนตัวเลขด้วยซ้ำ เบราว์เซอร์อื่นๆ ทั้งหมดจะถือว่าฟิลด์นี้เป็น type="text" ดังนั้นจึงไม่มีเหตุผลที่จะเริ่มใช้ประเภทนี้ทันที

HTML 4 ไม่รวมการเลือกวันที่ผ่านปฏิทิน เฟรมเวิร์ก JavaScript ช่วยให้คุณหลีกเลี่ยงสิ่งนี้ได้ (Dojo, jQuery UI, YUI, ไลบรารีการปิด) แต่แน่นอนว่า แต่ละโซลูชันเหล่านี้จำเป็นต้องมี "การนำไปใช้" เฟรมเวิร์กสำหรับปฏิทินในตัว

ในที่สุด HTML5 ก็กำหนดวิธีการเปิดใช้งานตัวเลือกวันที่ดั้งเดิมโดยไม่ต้องใช้สคริปต์ใด ๆ จริงๆ แล้วมีทั้งหมด 6 รายการ ได้แก่ วันที่ เดือน สัปดาห์ เวลา วันที่ + เวลา และวันที่ + เวลาพร้อมเขตเวลา

จนถึงตอนนี้ การสนับสนุนยัง... ไม่เพียงพอ

การสนับสนุนตัวเลือกวันที่ พิมพ์ Opera เบราว์เซอร์อื่น ๆ
ประเภท = "วันที่" 9.0+ -
ประเภท = "เดือน" 9.0+ -
ประเภท = "สัปดาห์" 9.0+ -
ประเภท = "เวลา" 9.0+ -
ประเภท = "วันที่และเวลา" 9.0+ -
type="datetime-local" 9.0+ -

นี่คือวิธีที่ Opera แสดง:

หากคุณต้องการเวลาพร้อมกับวันที่ Opera ยังรองรับ:

หากคุณต้องการเวลาหนึ่งเดือนบวกหนึ่งปี (เช่น วันหมดอายุของบัตรเครดิต) Opera สามารถแสดง:

สิ่งที่พบไม่บ่อยแต่มีให้เลือกคือการเลือกสัปดาห์ของปีผ่าน:

สุดท้ายแต่ไม่ท้ายสุดคือจังหวะเวลาด้วย:

เครื่องมือเลือกวันที่พร้อมทางเลือก




...

var i = document.createElement("อินพุต");
i.setAttribute("ประเภท", "วันที่");
ถ้า (i.type == "ข้อความ") (
// ไม่มีการสนับสนุนตัวเลือกวันที่ดั้งเดิม :(
// ใช้ Dojo/jQueryUI/YUI/Closere เพื่อสร้างมันขึ้นมา
// จากนั้นแทนที่องค์ประกอบแบบไดนามิก
}

เป็นไปได้ว่าเบราว์เซอร์อื่นๆ จะรองรับประเภทนี้ในที่สุด เช่นเดียวกับ type="email" และประเภทอื่นๆ ฟิลด์แบบฟอร์มเหล่านี้จะปรากฏเป็นข้อความธรรมดาในเบราว์เซอร์ที่ไม่รู้จัก type="date" และรูปแบบต่างๆ หากคุณต้องการ คุณสามารถใช้ ทำให้ผู้ใช้ Opera มีความสุข และรอให้เบราว์เซอร์อื่นตามทัน การใช้สิ่งนี้สมจริงกว่า แต่ตรวจสอบว่าเบราว์เซอร์รองรับตัวเลือกวันที่ดั้งเดิมหรือไม่ และรวมโซลูชันอื่นในรูปแบบของสคริปต์ที่คุณเลือก (Dojo, jQuery UI, YUI, ไลบรารีการปิด หรือตัวเลือกอื่น ๆ )

หน้าต่างค้นหา

ดังนั้นค้นหา ไม่ใช่แค่การค้นหาจาก Google หรือ Yahoo (เช่นกัน) ลองนึกถึงช่องค้นหา ในหน้าใดก็ได้ บนเว็บไซต์ใดก็ได้ Amazon มีช่องค้นหา Yandex มีช่องค้นหา บล็อกส่วนใหญ่ก็มีเช่นกัน พวกเขาทำอย่างไร? เช่นเดียวกับช่องข้อความอื่นๆ บนเว็บ มาแก้ไขปัญหานี้กัน

ค้นหาคนรุ่นใหม่




ในเบราว์เซอร์บางตัว คุณจะไม่สังเกตเห็นความแตกต่างจากช่องข้อความปกติ แต่ถ้าคุณใช้ Safari บน Mac OS X ก็จะเป็นแบบนี้

คุณพบความแตกต่างหรือไม่? ช่องป้อนข้อมูลมีมุมโค้งมน! ฉันรู้ ฉันรู้ คุณแทบจะควบคุมความรู้สึกของตัวเองไม่ได้ แต่เดี๋ยวก่อนยังมีอีกมาก! เมื่อคุณเริ่มพิมพ์ type="search" ลงในช่อง Safari จะแทรกปุ่ม "x" เล็กๆ ทางด้านขวาของหน้าต่าง การคลิกที่ "x" จะล้างเนื้อหาของฟิลด์ Google Chrome ซึ่งมีเทคโนโลยีเดียวกันภายใต้ประทุนก็ทำงานในลักษณะเดียวกัน เทคนิคเล็กๆ น้อยๆ ทั้งสองนี้มีลักษณะและทำงานคล้ายกับการค้นหาแบบเนทีฟใน iTunes และแอปพลิเคชันไคลเอ็นต์ Mac OS X อื่นๆ

Apple.com ใช้การค้นหาไซต์เพื่อช่วยให้ไซต์ถ่ายทอดความรู้สึก "รักนกมาคอว์" แต่ไม่มีอะไรเฉพาะเจาะจงสำหรับ Mac ที่นี่ มันเป็นเพียงโค้ด ดังนั้นทุกเบราว์เซอร์ในทุกแพลตฟอร์มสามารถเลือกวิธีแสดงผลตามแบบแผนของแพลตฟอร์มได้ เช่นเดียวกับประเภทใหม่อื่นๆ เบราว์เซอร์ที่ไม่รู้จัก type="search" จะถือว่าเป็น type="text" ดังนั้นจึงไม่มีเหตุผลใดที่จะไม่เริ่มใช้ type="search" สำหรับช่องค้นหาทั้งหมดของคุณตั้งแต่วันนี้

ศาสตราจารย์มาร์กอัปกล่าวว่า

ตามค่าเริ่มต้น Safari จะไม่ปรับใช้สไตล์ส่วนใหญ่ หากคุณต้องการบังคับให้ Safari ถือว่าช่องค้นหาเป็นช่องข้อความปกติ (เพื่อให้คุณสามารถใช้สไตล์ของคุณเองได้) ให้เพิ่มกฎนี้ลงในสไตล์ชีตของคุณ

ป้อนข้อมูล(
-webkit-ลักษณะที่ปรากฏ:ฟิลด์ข้อความ;
}

ขอบคุณ John Lane ที่สอนเคล็ดลับนี้ให้ฉัน

การเลือกสี

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

บันทึก นักแปล Opera 11 รองรับคุณสมบัตินี้

การตรวจสอบแบบฟอร์ม

ในบทนี้ ฉันได้พูดคุยเกี่ยวกับองค์ประกอบของฟอร์มใหม่และคุณลักษณะใหม่ เช่น โฟกัสอัตโนมัติ แต่ฉันไม่ได้พูดถึงส่วนที่น่าตื่นเต้นที่สุดของฟอร์ม HTML5 นั่นก็คือ การตรวจสอบอินพุตอัตโนมัติ มาดูปัญหาทั่วไปในการป้อนที่อยู่อีเมลในแบบฟอร์มกัน คุณอาจมีการตรวจสอบฝั่งไคลเอ็นต์ผ่าน JavaScript ตามด้วยการตรวจสอบฝั่งเซิร์ฟเวอร์ผ่าน PHP, Python หรือภาษาฝั่งเซิร์ฟเวอร์อื่น HTML5 จะไม่แทนที่การตรวจสอบฝั่งเซิร์ฟเวอร์ แต่อาจเข้ามาแทนที่การตรวจสอบฝั่งไคลเอ็นต์สักวันหนึ่ง

มีปัญหาใหญ่สองประการในการตรวจสอบที่อยู่อีเมลใน JavaScript:

  • ผู้เยี่ยมชมจำนวนเล็กน้อยของคุณ (อาจประมาณ 10%) ไม่ได้เปิดใช้งาน JavaScript
  • คุณจะได้รับที่อยู่ไม่ถูกต้อง
  • อย่างจริงจังคุณจะได้รับที่อยู่ผิด การพิจารณาว่าชุดอักขระแบบสุ่มเป็นที่อยู่อีเมลที่ถูกต้องนั้นเป็นเรื่องยากอย่างไม่น่าเชื่อ ยิ่งมองยากก็ยิ่งยากขึ้น ฉันเคยบอกไปแล้วหรือเปล่าว่านี่เป็นเรื่องยากมาก? มันไม่ง่ายกว่าเหรอที่จะปวดหัวกับเบราว์เซอร์ของคุณ?

    Opera ตรวจสอบประเภท = "อีเมล"

    นี่คือภาพหน้าจอจาก Opera 11 แม้ว่าฟังก์ชันการทำงานจะมีมาตั้งแต่ Opera 9 ก็ตาม รหัสนี้เกี่ยวข้องกับการตั้งค่าอีเมลสำหรับแอตทริบิวต์ type เมื่อผู้ใช้ Opera พยายามส่งแบบฟอร์มด้วย เบราว์เซอร์จะตรวจสอบที่อยู่อีเมลโดยอัตโนมัติ แม้ว่าสคริปต์จะถูกปิดใช้งานก็ตาม

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

    ไม่มีโค้ดที่เปิดใช้งานการตรวจสอบความถูกต้องของแบบฟอร์มใน HTML5 ซึ่งจะดำเนินการตามค่าเริ่มต้น หากต้องการปิดใช้งานการตรวจสอบ ให้ใช้แอตทริบิวต์ novalidate

    อย่าทดสอบฉัน




    เบราว์เซอร์ช้าในการรวมการรองรับการตรวจสอบแบบฟอร์มใน HTML5 Firefox 4 จะได้รับการสนับสนุนอย่างเต็มที่ ขออภัย Safari และ Chrome มีการใช้งานเพียงบางส่วนเท่านั้น โดยจะตรวจสอบองค์ประกอบของแบบฟอร์ม แต่ไม่แสดงข้อความที่มองเห็นได้เมื่อช่องแบบฟอร์มไม่ผ่านการตรวจสอบ กล่าวอีกนัยหนึ่ง หากคุณป้อนวันที่ไม่ถูกต้อง (หรือสะกดผิด) ใน type="date" Safari และ Chrome จะไม่ส่งแบบฟอร์ม แต่จะไม่บอกคุณว่าทำไมจึงไม่ส่งแบบฟอร์ม พวกเขาจะกำหนดโฟกัสไปที่ฟิลด์ที่มีค่าที่ไม่ถูกต้อง แต่จะไม่แสดงข้อความแสดงข้อผิดพลาดเช่น Opera หรือ Firefox 4

    ช่องที่ต้องเติม สนับสนุน
    เช่น. ไฟร์ฟอกซ์ ซาฟารี โครเมียม โอเปร่า ไอโฟน หุ่นยนต์
    - 4.0+ - - 9.0+ - -

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

    รหัสสำหรับช่องที่ต้องกรอกนั้นเรียบง่ายที่สุด




    เบราว์เซอร์อาจเปลี่ยนรูปลักษณ์ดั้งเดิมของฟิลด์บังคับ นี่คือตัวอย่างลักษณะที่ปรากฏของ Mozilla Firefox 4.0

    นอกจากนี้ หากคุณพยายามส่งแบบฟอร์มโดยไม่กรอกค่าที่ต้องการ Firefox จะแสดงแถบข้อมูลที่แจ้งว่าจำเป็นต้องกรอกช่องและไม่สามารถเว้นว่างได้

    การสร้างการตอบสนองจากผู้ควบคุม

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

    ตัวอย่างเช่น หากต้องการส่งการตอบกลับ HTML คุณจะต้องสร้างและเขียนข้อมูล HTML จากนั้นส่งไปยังไคลเอนต์โดยใช้เมธอด Response.Write() ในทำนองเดียวกัน หากต้องการเปลี่ยนเส้นทางเบราว์เซอร์ของผู้ใช้ไปยัง URL อื่น คุณจะต้องเรียกใช้เมธอด Response.Redirect() และส่งผ่าน URL ที่ต้องการ ทั้งสองวิธีแสดงให้เห็นในโค้ดด้านล่าง ซึ่งแสดงส่วนขยายของคลาส BasicController ที่เราสร้างขึ้นในบทความก่อนหน้านี้โดยการใช้อินเทอร์เฟซ IController:

    ใช้ System.Web.Mvc; โดยใช้ System.Web.Routing; Namespace ControllersAndActions.Controllers (คลาสสาธารณะ BasicController: IController ( public void Execute(RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller) : (0), วิธีการดำเนินการ: (1)", ตัวควบคุม, การกระทำ)); ) ) ) )

    วิธีการเดียวกันนี้สามารถนำไปใช้ในกรณีที่สืบทอดคอนโทรลเลอร์จากคลาสคอนโทรลเลอร์ คลาส HttpResponseBase ซึ่งส่งคืนเมื่อคุณสมบัติ requestContext.HttpContext.Response ถูกอ่านในเมธอด Execute() สามารถเข้าถึงได้ผ่านคุณสมบัติ Controller.Response ดังที่แสดงในตัวอย่างด้านล่าง ซึ่งขยายคลาส DerivedController ที่สร้างขึ้นก่อนหน้านี้ด้วย สืบทอดมาจากคลาสคอนโทรลเลอร์:

    การใช้ระบบ; ใช้ System.Web; ใช้ System.Web.Mvc; namespace ControllersAndActions.Controllers ( คลาสสาธารณะ DerivedController: คอนโทรลเลอร์ ( สาธารณะ ActionResult Index() ( // ... ) โมฆะสาธารณะ ProduceOutput() ( ถ้า (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write ("ตัวควบคุม: ได้มา, วิธีการดำเนินการ: ProduceOutput"); ) ) )

    เมธอด ProduceOutput() ใช้ค่าของคุณสมบัติ Server.MachineName เพื่อตัดสินใจว่าจะส่งการตอบสนองใดไปยังไคลเอนต์ ("ProfessorWeb" คือชื่อของเครื่องที่กำลังพัฒนาของฉัน)

    แม้ว่าวิธีการสร้างการตอบสนองต่อผู้ใช้นี้จะได้ผล แต่ก็มีปัญหาหลายประการ:

      คลาสคอนโทรลเลอร์ต้องมีข้อมูลโครงสร้าง HTML หรือ URL ซึ่งทำให้คลาสอ่านและบำรุงรักษาได้ยาก

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

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

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

    ผลลัพธ์ของการกระทำ

    ผลลัพธ์การดำเนินการในกรอบงาน MVC ใช้เพื่อแยกข้อความแสดงเจตจำนงออกจากการดำเนินการตามเจตนา (ขออภัยที่ซ้ำซาก) แนวคิดนี้จะดูเรียบง่ายเมื่อคุณเข้าใจแล้ว แต่อาจต้องใช้เวลาพอสมควรในการทำความเข้าใจเนื่องจากมีบางอย่างทางอ้อม

    แทนที่จะจัดการกับออบเจ็กต์การตอบสนองโดยตรง วิธีการกระทำจะส่งคืนออบเจ็กต์คลาสที่ได้รับจาก ActionResult ซึ่งอธิบายว่าการตอบสนองจากตัวควบคุมควรเป็นอย่างไร ตัวอย่างเช่น แสดงผลมุมมองหรือเปลี่ยนเส้นทางไปยัง URL หรือวิธีดำเนินการอื่น อย่างไรก็ตาม (นี่คือความอ้อมมาก) คำตอบไม่ได้ถูกสร้างขึ้นโดยตรง แต่วัตถุ ActionResult จะถูกสร้างขึ้นแทน ซึ่ง MVC Framework ประมวลผลเพื่อสร้างผลลัพธ์หลังจากเรียกใช้วิธีการดำเนินการแล้ว

    ระบบผลลัพธ์การดำเนินการเป็นตัวอย่างของรูปแบบการออกแบบคำสั่ง รูปแบบนี้แสดงถึงสถานการณ์ที่คุณจัดเก็บและส่งวัตถุที่อธิบายการดำเนินการที่กำลังดำเนินการ

    เมื่อ MVC Framework ได้รับวัตถุ ActionResult จากวิธีการดำเนินการ มันจะเรียก วิธีการ ExecuteResult()กำหนดไว้ในคลาสของวัตถุนี้ จากนั้นการนำผลลัพธ์ของการดำเนินการไปใช้จะดำเนินการบนออบเจ็กต์ Response โดยสร้างผลลัพธ์ที่ตรงกับเจตนาของคุณ เพื่อสาธิตการใช้งานจริง เรามาสร้างโฟลเดอร์ Infrastructure และเพิ่มไฟล์คลาสใหม่ที่เรียกว่า CustomRedirectResult.cs พร้อมการใช้งาน ActionResult แบบกำหนดเองที่แสดงในตัวอย่างด้านล่าง:

    ใช้ System.Web.Mvc; Namespace ControllersAndActions.Infrastructure (คลาสสาธารณะ CustomRedirectResult: ActionResult ( Url สตริงสาธารณะ ( get; set; ) การแทนที่สาธารณะเป็นโมฆะ ExecuteResult (บริบทของ ControllerContext) ( string fullUrl = UrlHelper.GenerateContentUrl (Url, context.HttpContext); context.HttpContext.Response.Redirect (URL เต็ม); ) ) )

    คลาสนี้ขึ้นอยู่กับวิธีการทำงานของคลาส System.Web.Mvc.RedirectResult ข้อดีประการหนึ่งของ MVC Framework แบบโอเพ่นซอร์สคือความสามารถในการสำรวจการทำงานภายในของทุกสิ่ง คลาส CustomRedirectResult นั้นง่ายกว่า MVC ที่เทียบเท่ากันมาก แต่ก็เพียงพอสำหรับวัตถุประสงค์ของบทความนี้

    เมื่อสร้างอินสแตนซ์คลาส RedirectResult เราจะส่ง URL ที่ควรเปลี่ยนเส้นทางผู้ใช้ไป เมธอด ExecuteResult() ซึ่งจะถูกดำเนินการโดย MVC Framework เมื่อวิธีการดำเนินการเสร็จสมบูรณ์ ได้รับอ็อบเจ็กต์ Response สำหรับการร้องขอผ่านอ็อบเจ็กต์ ControllerContext ที่ให้มาของ Framework และเรียกเมธอด RedirectPermanent() หรือเมธอด Redirect() (นี่คือ สิ่งที่ทำไปแล้วในการใช้งาน IController ระดับต่ำในตัวอย่างก่อนหน้าในบทความ)

    การใช้คลาส CustomRedirectResult แสดงในตัวอย่างด้านล่าง ซึ่งแสดงการเปลี่ยนแปลงที่เกิดขึ้นกับ Derived controller:

    // ... ใช้ ControllersAndActions.Infrastructure; namespace ControllersAndActions.Controllers ( คลาสสาธารณะ DerivedController: คอนโทรลเลอร์ ( สาธารณะ ActionResult Index() ( // ... ) สาธารณะ ActionResult ProduceOutput() ( ถ้า (Server.MachineName == "MyMachineName") ส่งคืน CustomRedirectResult ใหม่ ( Url = "/Basic/ ดัชนี" ); else ( Response.Write("Controller: Derived, Action Method: ProduceOutput"); return null; ) ) ) )

    โปรดทราบว่าเราถูกบังคับให้เปลี่ยนผลลัพธ์ของวิธีการดำเนินการเพื่อส่งคืน ActionResult เราจะคืนค่า null หากเราไม่ต้องการให้ MVC Framework ดำเนินการใดๆ เมื่อดำเนินการตามวิธีดำเนินการ ซึ่งเป็นสิ่งที่เราทำหากอินสแตนซ์ CustomRedirectResult ไม่ถูกส่งคืน

    ตัวควบคุมการทดสอบหน่วยและการดำเนินการ

    MVC Framework หลายส่วนได้รับการออกแบบมาเพื่อให้การทดสอบหน่วยง่ายขึ้น โดยเฉพาะอย่างยิ่งกับการดำเนินการและตัวควบคุม มีสาเหตุหลายประการสำหรับการสนับสนุนนี้:

    คุณสามารถทดสอบการดำเนินการและตัวควบคุมภายนอกเว็บเซิร์ฟเวอร์ได้ ออบเจ็กต์บริบทเข้าถึงได้ผ่านคลาสพื้นฐาน (เช่น HttpRequestBase) ซึ่งจำลองได้ง่าย

    หากต้องการทดสอบผลลัพธ์ของวิธีดำเนินการ คุณไม่จำเป็นต้องแยกวิเคราะห์มาร์กอัป HTML เพื่อให้แน่ใจว่าคุณได้รับผลลัพธ์ตามที่คาดหวัง คุณสามารถตรวจสอบออบเจ็กต์ ActionResult ที่ส่งคืนได้

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

    บทความในอนาคตเกี่ยวกับการสร้างข้อมูลจากตัวควบคุมจะแสดงวิธีสร้างการทดสอบหน่วยสำหรับผลลัพธ์การดำเนินการประเภทต่างๆ

    อย่าลืมว่าการทดสอบหน่วยเป็นเพียงส่วนหนึ่งของภาพเท่านั้น ลักษณะการทำงานที่ซับซ้อนในแอปพลิเคชันเกิดขึ้นเมื่อเรียกใช้วิธีดำเนินการตามลำดับ การทดสอบหน่วยจะทำงานได้ดีที่สุดเมื่อรวมกับวิธีการทดสอบอื่นๆ

    ตอนนี้คุณรู้แล้วว่าผลลัพธ์พิเศษของการดำเนินการเปลี่ยนเส้นทางทำงานอย่างไร คุณสามารถเปลี่ยนไปใช้สิ่งที่เทียบเท่ากับกรอบงาน MVC ซึ่งมีประสิทธิภาพมากกว่าและได้รับการทดสอบอย่างละเอียดโดย Microsoft การเปลี่ยนแปลงที่จำเป็นใน Derived controller มีดังต่อไปนี้:

    // ... สาธารณะ ActionResult ProduceOutput() ( ส่งคืน RedirectResult ใหม่ ("/Basic/Index"); ) // ...

    คำสั่งแบบมีเงื่อนไขถูกลบออกจากวิธีดำเนินการแล้ว ซึ่งหมายความว่าหลังจากเปิดแอปพลิเคชันและนำทางไปยัง URL เช่น /Derived/ProduceOutput เบราว์เซอร์จะถูกเปลี่ยนเส้นทางไปยัง URL เช่น /Basic/Index เพื่อลดความซับซ้อนของโค้ดวิธีดำเนินการ คลาส Controller มีวิธีอำนวยความสะดวกสำหรับการสร้างออบเจ็กต์ ActionResult ประเภทต่างๆ ตัวอย่างเช่น เราสามารถบรรลุผลแบบเดียวกับในตัวอย่างข้างต้นได้โดยการส่งคืนผลลัพธ์ของเมธอด Redirect():

    // ... สาธารณะ ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...

    ไม่มีอะไรซับซ้อนเป็นพิเศษเกี่ยวกับระบบผลลัพธ์ของการดำเนินการ แต่ท้ายที่สุดแล้วจะช่วยสร้างโค้ดที่เรียบง่ายขึ้น สะอาดกว่า และสอดคล้องกันมากขึ้น ซึ่งอ่านง่ายและทดสอบหน่วยได้ ตัวอย่างเช่น ในกรณีของการเปลี่ยนเส้นทาง คุณสามารถตรวจสอบว่าวิธีดำเนินการส่งคืนอินสแตนซ์ RedirectResult ซึ่งมีคุณสมบัติ Url มีเป้าหมายที่คาดหวังไว้หรือไม่

    กรอบงาน MVC กำหนดประเภทผลลัพธ์การดำเนินการในตัวหลายประเภท ซึ่งอธิบายไว้ในตารางด้านล่าง:

    ประเภท ActionResult ในตัว พิมพ์เมธอด Description Helper ของคลาส Controller
    ดูผลลัพธ์

    แสดงผลเทมเพลตมุมมองที่ระบุหรือมาตรฐาน

    ดู()
    ผลลัพธ์มุมมองบางส่วน

    แสดงผลเทมเพลตมุมมองบางส่วนที่ระบุหรือมาตรฐาน

    มุมมองบางส่วน()
    เปลี่ยนเส้นทางไปยังRouteResult

    ออก HTTP 301 หรือ 302 เปลี่ยนเส้นทางไปยังวิธีดำเนินการหรือรายการเส้นทางที่ระบุ สร้าง URL ตามการกำหนดค่าเส้นทาง

    เปลี่ยนเส้นทางไปยังการดำเนินการ()
    เปลี่ยนเส้นทางไปยังการดำเนินการถาวร ()
    เปลี่ยนเส้นทางไปยังเส้นทาง()
    เปลี่ยนเส้นทางไปยังเส้นทางถาวร()
    ผลลัพธ์การเปลี่ยนเส้นทาง

    ออก HTTP 301 หรือ 302 เปลี่ยนเส้นทางไปยัง URL ที่กำหนด

    เปลี่ยนเส้นทาง()
    เปลี่ยนเส้นทางถาวร()
    ผลลัพธ์ของเนื้อหา

    ส่งคืนข้อมูลข้อความที่ไม่ได้จัดรูปแบบไปยังเบราว์เซอร์ โดยตั้งค่าส่วนหัวของประเภทเนื้อหาเพิ่มเติม

    เนื้อหา()
    ไฟล์ผลลัพธ์

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

    ไฟล์()
    JsonResult

    ทำให้ออบเจ็กต์ .NET เป็นอนุกรมลงใน JSON และส่งเป็นการตอบกลับ การตอบสนองประเภทนี้มักถูกสร้างขึ้นเมื่อใช้เครื่องมือ Web API และ AJAX

    เจสัน()
    JavaScriptResult

    ส่งซอร์สโค้ด JavaScript บางส่วนเพื่อให้เบราว์เซอร์ดำเนินการ

    จาวาสคริปต์()
    ผลลัพธ์ที่ไม่ได้รับอนุญาต Http

    ตั้งค่ารหัสสถานะการตอบสนอง HTTP เป็น 401 (หมายถึง "ไม่ได้รับอนุญาต") ซึ่งทำให้กลไกการรับรองความถูกต้องเกิดขึ้น (การรับรองความถูกต้องของแบบฟอร์มหรือการรับรองความถูกต้องของ Windows) เพื่อแจ้งให้ผู้เยี่ยมชมลงชื่อเข้าใช้

    เลขที่
    HttpNotFoundResult

    ส่งกลับรหัสข้อผิดพลาด HTTP 404 - ไม่พบ

    HttpNotFound()
    ผลลัพธ์ HttpStatusCode

    ส่งคืนรหัส HTTP ที่ระบุ

    เลขที่
    ผลว่างเปล่า

    ไม่ได้ทำอะไร

    เลขที่

    ประเภทเหล่านี้ทั้งหมดได้มาจากคลาส ActionResult และหลายประเภทมีวิธีการช่วยเหลือที่สะดวกในคลาส Controller เราจะสาธิตการใช้ผลลัพธ์ประเภทเหล่านี้ในบทความต่อๆ ไป

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

    ขอห้องสมุด

    ไลบรารี Python สำหรับส่งคำขอไปยังเซิร์ฟเวอร์และประมวลผลการตอบสนอง รากฐานของสคริปต์แยกวิเคราะห์และอาวุธหลักของเรา เมื่อใช้ไลบรารีนี้ เราได้รับเนื้อหาของหน้าในรูปแบบ html เพื่อแยกวิเคราะห์เพิ่มเติม

    การตอบสนองคำขอนำเข้า = คำขอ get ("https://ya.ru" ) # get-request พิมพ์ (ตอบกลับ . text ) # เนื้อหาของหน้าเอาต์พุต payload = ( "key1" : "value1" , "key2" : "value2" ) response =ร้องขอ get ("http://httpbin.org/get" , params = payload ) # คำขอพร้อมพารามิเตอร์ headers = ( "user-agent" : "my-app/0.0.1" ) response =ร้องขอ รับ (url, headers = headers) # คำขอพร้อมส่วนหัว html เฉพาะ

    เอพีไอ

    อินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน - อินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชันจัดทำโดยเจ้าของแอปพลิเคชันเว็บสำหรับนักพัฒนารายอื่น การไม่มี API ที่สามารถตอบสนองความต้องการของเราได้คือสิ่งแรกที่เราควรตรวจสอบให้แน่ใจก่อนที่จะรีบวิเคราะห์ซอร์สโค้ดของเพจและเขียน parser สำหรับมัน ไซต์ยอดนิยมหลายแห่งมี API และเอกสารประกอบของตัวเองที่อธิบายวิธีใช้งาน เราสามารถใช้ API ในลักษณะนี้ - เราสร้างคำขอ http ตามเอกสารประกอบ และรับการตอบกลับโดยใช้คำขอ

    บีเอส4

    Beautifulsoup4 เป็นไลบรารีสำหรับแยกวิเคราะห์เอกสาร html และ xml ช่วยให้คุณเข้าถึงเนื้อหาของแท็กใดๆ ใน html ได้โดยตรง

    จาก bs4 import BeautifulSoup Soup = BeautifulSoup (raw_html, "html.parser" ) print (soup . find ( "p" , class_ = "some-class" ) . text ) # ส่งออกเนื้อหาของแท็ก "p" ด้วยคลาส "บางชนชั้น"

    ไดร์เวอร์เว็บซีลีเนียม

    ข้อมูลบนไซต์สามารถสร้างได้แบบไดนามิกโดยใช้จาวาสคริปต์ ในกรณีนี้ จะไม่สามารถแยกวิเคราะห์ข้อมูลนี้โดยใช้ request+bs4 ได้ ความจริงก็คือ bs4 แยกวิเคราะห์ซอร์สโค้ดของเพจโดยไม่ต้องรัน js ในการรันโค้ด js และรับหน้าที่เหมือนกับที่เราเห็นในเบราว์เซอร์ คุณสามารถใช้ซีลีเนียมเว็บไดรเวอร์ - นี่คือชุดไดรเวอร์สำหรับเบราว์เซอร์ต่าง ๆ ที่มาพร้อมกับไลบรารีสำหรับการทำงานกับไดรเวอร์เหล่านี้

    จะทำอย่างไรถ้าได้รับอนุญาต?

    session = request.Session() data = ("login_username":login", "login_password": "รหัสผ่าน") url = "http://site.com/login.php" การตอบสนอง = session.post (url, data =ข้อมูล)

    จะเกิดอะไรขึ้นหากไซต์แบนคุณสำหรับการร้องขอมากเกินไป?
    • ตั้งค่าความล่าช้าระหว่างคำขอ:

    การตอบสนอง = request.get (url, หมดเวลา = (10, 0.01)) # หมดเวลาการเชื่อมต่อ, หมดเวลาการอ่าน (เป็นวินาที)

    • แกล้งทำเป็นเบราว์เซอร์โดยใช้ไดรเวอร์เว็บซีลีเนียมหรือส่งเนื้อหาของส่วนหัวของตัวแทนผู้ใช้เมื่อทำการร้องขอ:

    user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") คำขอ =ร้องขอ.get(url, headers=("User-Agent":user_agent))

    • ใช้พร็อกซี: