Kotchasan PHP Framework

คำถามยอดฮิต กด back แล้วเจอ Error อะไรก็ไม่รู้

หนึ่งปัญหาที่ผมเจอแล้วเป็นอะไรที่อธิบายให้กับลูกค้ายากมากๆ คือปัญหาการกด Back บนบราวเซอร์

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

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

ทำความเข้าใจก่อนว่าข้อความนี้เป็น "คำเตือน" ที่มาจากบราวเซอร์ ซึ่งถ้าได้อ่านข้อความที่มันแจ้งจะเข้าใจได้ว่ามันพยายามที่จะ "เตือน" เรา (หมายถึงเตือน User คนที่กด Back นั่นแหละครับ) ซึ่งหน้านี้ไม่ได้อยู่ดีๆมันก็โผล่มา แต่เป็นเพราะ User เองกำลังจะทำบางอย่างที่อาจผิดพลาดได้

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

ด้วยความที่เราจำไม่ได้ว่าหน้าก่อนหน้าเป็นอะไร เราจึงไม่เข้าใจว่ามันพยายามจะทำอะไรหรือเตือนอะไรเรา

กลับไปทบทวนลำดับเหตุการณ์ที่เราทำก่อนหน้าดู และนี่คือ เคสที่เจอบ่อยที่สุด
  1. เข้าเว็บไซต์ระบบแอดมินโดยการพิมพ์ URL ที่ Address Bar (หรือวิธีไหนก็ได้)
  2. กรอกข้อมูลการ Login (ปกติเข้าระบบแอดมินจะเจอหน้า Login ก่อนเสมอ) แล้วกด Submit
  3. จากนั้นคลิกไปหน้ารายชื่อสมาชิก (หรือหน้าไหนก็ได้) หลังจาก Login สำเร็จ
  4. ปรากฏว่าไม่ใช่หน้าที่ต้องการ และ กด Back
ลองพิจารณาจากรายการด้านบนดูสิครับว่า หลังจากกด Back ในขั้นตอนที่ 4 แล้ว User คาดหวังจะเจออะไร (99% ตอบเจอหน้าอะไรสักหน้าก่อนหน้า, 1% จะตอบว่าเจอหน้า Login)

จำได้มั้ยว่าในขั้นตอนที่ 3 เราทำอะไรมา
ในขั้นตอนที่ 3 เรา Login มาไงครับ ซึ่งการ Login จะต้องมีการส่งข้อมูลไปยัง Server (username+password นั่นแหละครับ) เมื่อบราวเซอร์พบว่าจะต้องมีการส่งข้อมูลไป มันจึงเตือนเราด้วยหน้าขาวๆ ข้างต้น ว่าจะมีการส่งข้อมูลซ้ำไปอีกครั้ง (เพื่อ Login)

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

การแก้ปัญหา
บอกก่อนว่าไม่มีทางป้องกันได้ 100% หากยังต้องมีฟอร์มอยู่ ซึ่งการแก้ไขอาจต้องแลกกับอะไรบางอย่าง
  1. วิธีแรก ปิดการแจ้งเตือนบนบราวเซอร์ หลักการก็ตรงไปตรงมาครับ User รำคาญก็ปิดซะไม่ให้มันเตือน (ผมไม่อธิบายวิธีปิดนะครับ เพราะจริงๆแล้วมันเตือนเราแหละถูกแล้ว ใครอยากทำวิธีนี้ก็ไปหาวิธีเอาเอง วิธีนี้แก้ปัญหาได้ 100% แต่ทำยากที่สุดเพราะ User ก็ไม่ได้รู้สึกว่าตัวเองผิด เลยไม่จำเป็นต้องแก้ไขที่ตัวเอง)
  2. วิธีที่สอง รีไดเรคหน้ามันซะ วิธีนี้เป็นวิธีโบราณแต่ก็ใช้ได้ดี โดยหลังจาก Submit แล้วให้มันรีไดเร็คไปยังหน้าอื่นทันที วิธีนี้เมื่อเรากด Back กลับมาหน้านี้ มันจะพยายามรีไดเร็คไปยังหน้าที่เรากำหนดไว้แทนซึ่งจะทำให้เราไม่สามารถกด Back กลับไปจนถึงขั้นตอนการ Submit ได้ (วิธีนี้ไม่ค่อยนิยมกันแล้วในปัจจุบัน เนื่องจากปัญอาจกลายเป็น User กด Back แล้วรู้สึกเหมือนมันไม่ไปไหนก็ได้ อันเนื่องมาจากมันพยายามเด้งกลับมาหน้าเดิม)
  3. วิธีที่สาม Submit ฟอร์มด้วย Ajax แทน จริงๆ ผมใช้วิธีนี้เป็นหลัก ซึ่งวิธีนี้แก้ปัญหาได้ก็จริง แต่อาจไม่สามารถใช้ได้กับทุกฟอร์ม (บางฟอร์มอาจไม่สามารถใช้ Ajax ได้)