ค้นหาเว็บไซต์

javascript - จะป้องกันไม่ให้ฟอร์มถูกส่งได้อย่างไร?


ฉันมีแบบฟอร์มที่มีปุ่มส่งอยู่ที่ไหนสักแห่ง

อย่างไรก็ตาม ฉันต้องการบางวิธีในการ 'จับ' เหตุการณ์การส่งและป้องกันไม่ให้มันเกิดขึ้น

มีวิธีที่ฉันสามารถทำสิ่งนี้ได้หรือไม่?

ฉันไม่สามารถแก้ไขปุ่มส่งได้ เพราะมันเป็นส่วนหนึ่งของคอนโทรลแบบกำหนดเอง

คำตอบ #1

ไม่เหมือนกับคำตอบอื่น ๆ การคืนค่า false เป็นเพียง ส่วนหนึ่ง ของคำตอบ พิจารณาสถานการณ์ที่เกิดข้อผิดพลาดของ JS ก่อนประโยค return...

เอชทีเอ็มแอล

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>

สคริปต์

function mySubmitFunction()
{
  someBug()
  return false;
}

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

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}

ในกรณีนี้ แม้ว่าจะมีบั๊ก แบบฟอร์มก็จะไม่ส่ง!

อีกทางเลือกหนึ่ง สามารถใช้บล็อก try...catch ได้

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}

คำตอบ #2

คุณสามารถใช้เหตุการณ์แบบอินไลน์ onsubmit แบบนี้ได้

<form onsubmit="alert('stop submit'); return false;" >

หรือ

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

ตัวอย่าง

ตอนนี้ อาจจะไม่ใช่ความคิดที่ดีเมื่อทำโครงการใหญ่ คุณอาจจำเป็นต้องใช้ตัวฟังเหตุการณ์ (Event Listeners)

โปรดอ่านเพิ่มเติมเกี่ยวกับ เหตุการณ์แบบ Inline กับ ตัวฟังเหตุการณ์ (addEventListener และ attachEvent ของ IE) ที่นี่ เพราะฉันไม่สามารถอธิบายได้มากไปกว่าที่ Chris Baker อธิบายไว้

ทั้งคู่ถูกต้อง แต่ไม่มีข้อใดที่ถือว่าเป็น "ดีที่สุด" โดยตัวของมันเอง และอาจมีเหตุผลที่นักพัฒนาตัดสินใจใช้ทั้งสองวิธี

คำตอบ #3

แนบ event listener ไปยังฟอร์มโดยใช้ .addEventListener() จากนั้นเรียกใช้เมธอด .preventDefault() บน event:

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่ดีกว่าการกำหนดตัวจัดการเหตุการณ์ submit แบบ inline กับแอตทริบิวต์ onsubmit เพราะมันแยกตรรกะของเว็บเพจออกจากโครงสร้าง มันง่ายต่อการบำรุงรักษามากขึ้นเมื่อแยกตรรกะออกจาก HTML ดูเพิ่มเติม: JavaScript แบบไม่รุกราน (Unobtrusive JavaScript)

การใช้คุณสมบัติ .onsubmit ของวัตถุ DOM form ไม่ใช่ความคิดที่ดีเพราะมันป้องกันไม่ให้คุณแนบคอลล์แบ็กการส่งหลายรายการกับองค์ประกอบเดียว ดูที่ addEventListener เทียบกับ onclick

คำตอบ #4

งานต่อไปนี้ใช้ได้ในปัจจุบัน (ทดสอบใน Chrome และ Firefox):

<form onsubmit="event.preventDefault(); return validateMyForm();">

ที่ validateMyForm() เป็นฟังก์ชันที่คืนค่า false หากการตรวจสอบล้มเหลว ประเด็นสำคัญคือต้องใช้ชื่อ event เราไม่สามารถใช้เช่น e.preventDefault()

คำตอบ #5

ลองอันนี้ดู...

โค้ด HTML

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

โค้ด jQuery

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

หรือ

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});

คำตอบ #6

เพื่อป้องกันไม่ให้ฟอร์มส่ง คุณเพียงแค่ทำสิ่งนี้

<form onsubmit="event.preventDefault()">
    .....
</form>

โดยการใช้โค้ดด้านบนนี้ จะช่วยป้องกันการส่งฟอร์มของคุณ

บทความที่เกี่ยวข้อง