0Pricing
jQuery Academy · บทเรียน

การหยุดการส่งต่อเหตุการณ์

ทำความเข้าใจ .stopPropagation() และ .preventDefault() เพื่อควบคุมการไหลของเหตุการณ์ ป้องกันการทำงานเริ่มต้นของเบราว์เซอร์ และจัดการการโต้ตอบของเหตุการณ์ที่ซับซ้อนได้อย่างมีประสิทธิภาพ

การหยุดการส่งต่อเหตุการณ์ เป็นบทเรียน jQuery Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน jQuery Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส jQuery Academy มีบทเรียนทั้งหมด 3 บทเรียน

ควบคุมเหตุการณ์ของคุณ!

เหตุการณ์ต่าง ๆ เช่น การคลิกหรือการส่งแบบฟอร์มไม่ได้เกิดขึ้นบนองค์ประกอบเพียงตัวเดียวเท่านั้น เหตุการณ์เหล่านี้มักเดินทางผ่าน Document Object Model (DOM)

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

การป้องกันการทำงานเริ่มต้น

เบราว์เซอร์มี การทำงานเริ่มต้น สำหรับองค์ประกอบ HTML หลายประเภท ตัวอย่างเช่น:

  • การคลิกแท็ก <a> จะนำทางไปยังหน้าใหม่
  • การส่ง <form> จะโหลดหน้าเว็บใหม่

เราใช้ event.preventDefault() เพื่อหยุดพฤติกรรมในตัวของเบราว์เซอร์เหล่านี้

การใช้งาน `preventDefault()`

ลองคลิกลิงก์ด้านล่าง โดยปกติลิงก์จะพาคุณไปยัง example.com แต่ .preventDefault() จะหยุดการนำทางนั้น!

<!DOCTYPE html>
<html>
<head>
<title>Prevent Default</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
  <h1>Prevent Default Example</h1>
  <a href="https://example.com" id="myLink">Click Me! (Should not navigate)</a>
  <div id="output"></div>

  <script>
  $(document).ready(function() {
    $('#myLink').on('click', function(event) {
      event.preventDefault(); // Stop the link from navigating
      $('#output').append('<p>Link click prevented! You\'re still here.</p>');
    });
  });
  </script>
</body>
</html>

ทำความเข้าใจการลอยขึ้นของเหตุการณ์

เมื่อเหตุการณ์เกิดขึ้นบนองค์ประกอบหนึ่ง เช่น การคลิก เหตุการณ์นั้นไม่ได้เรียกใช้ตัวจัดการเฉพาะบนองค์ประกอบนั้นเท่านั้น แต่จะ “ลอยขึ้น” ไปตามโครงสร้าง DOM

  • เหตุการณ์จะเรียกใช้ตัวจัดการบนองค์ประกอบแม่
  • จากนั้นจึงไปยังองค์ประกอบปู่
  • และดำเนินต่อไปเรื่อย ๆ จนถึง <body> และ <html>

การเดินทางขึ้นด้านบนนี้เรียกว่า การลอยขึ้นของเหตุการณ์

หยุดการลอยขึ้น: `stopPropagation()`

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

ในกรณีนี้ event.stopPropagation() จะเข้ามาช่วย โดยจะหยุดไม่ให้เหตุการณ์ลอยขึ้นต่อไปตามโครงสร้าง DOM

ตัวอย่าง `stopPropagation()`

คลิกกล่องด้านใน หากไม่มี stopPropagation() ข้อความทั้งสองรายการจะแสดงขึ้น แต่เมื่อใช้คำสั่งนี้ จะมีเพียงข้อความของกล่องด้านในเท่านั้นที่แสดง เพราะการลอยขึ้นถูกหยุดไว้

<!DOCTYPE html>
<html>
<head>
<title>Stop Propagation</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<style>
  #outer {
    padding: 20px;
    background-color: lightblue;
    border: 1px solid blue;
    margin: 10px;
  }
  #inner {
    padding: 20px;
    background-color: lightcoral;
    border: 1px solid red;
    margin-top: 10px;
  }
</style>
</head>
<body>
  <h1>Stop Propagation Example</h1>
  <div id="outer">
    Outer Div (Click me!)
    <div id="inner">
      Inner Div (Click me!)
    </div>
  </div>
  <div id="log"></div>

  <script>
  $(document).ready(function() {
    $('#outer').on('click', function() {
      $('#log').append('<p>Outer Div clicked!</p>');
    });

    $('#inner').on('click', function(event) {
      event.stopPropagation(); // Stop bubbling here
      $('#log').append('<p>Inner Div clicked!</p>');
    });
  });
  </script>
</body>
</html>

การใช้งานจริงของการหยุดการลอยขึ้น

stopPropagation() มีประโยชน์ในสถานการณ์ต่าง ๆ เช่น:

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

ออบเจ็กต์เหตุการณ์

ทั้ง .preventDefault() และ .stopPropagation() เป็นเมธอดของ ออบเจ็กต์เหตุการณ์ ออบเจ็กต์นี้จะถูกส่งเป็นอาร์กิวเมนต์ให้ฟังก์ชันตัวจัดการเหตุการณ์ของคุณ

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

<!DOCTYPE html>
<html>
<head>
<title>Event Object</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
  <h1>Event Object Properties</h1>
  <button id="myButton">Click Me</button>
  <div id="output"></div>

  <script>
  $(document).ready(function() {
    $('#myButton').on('click', function(event) {
      $('#output').empty(); // Clear previous output
      $('#output').append('<p>Event Type: <code>' + event.type + '</code></p>');
      $('#output').append('<p>Target Element ID: <code>' + event.target.id + '</code></p>');
      $('#output').append('<p>Mouse X Position: <code>' + event.pageX + '</code></p>');
      $('#output').append('<p>Mouse Y Position: <code>' + event.pageY + '</code></p>');
    });
  });
  </script>
</body>
</html>

การใช้ทั้งสองเมธอดร่วมกัน

บางครั้งคุณจำเป็นต้องใช้ทั้ง .preventDefault() และ .stopPropagation() เมธอดทั้งสองแก้ปัญหาที่แตกต่างกัน:

  • .preventDefault(): หยุดการทำงานเริ่มต้นของเบราว์เซอร์
  • .stopPropagation(): หยุดไม่ให้เหตุการณ์เดินทางขึ้นไปตาม DOM

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

ทำความเข้าใจการควบคุมเหตุการณ์

คุณมีลิงก์ <a href="#" id="link"> อยู่ภายใน div <div id="container"> คุณต้องการป้องกันไม่ให้ลิงก์นำทาง และป้องกันไม่ให้เหตุการณ์การคลิกเรียกใช้ตัวจัดการใด ๆ บน #container ด้วย

ทบทวน: การควบคุมเหตุการณ์

ทำได้ดีมากครับ/ค่ะ! คุณได้เรียนรู้การควบคุมการไหลของเหตุการณ์แล้ว:

  • .preventDefault(): หยุดการทำงานเริ่มต้นของเบราว์เซอร์สำหรับเหตุการณ์หนึ่ง ๆ เช่น การนำทางของลิงก์หรือการส่งแบบฟอร์ม
  • .stopPropagation(): ป้องกันไม่ให้เหตุการณ์ลอยขึ้นตามโครงสร้าง DOM ไปยังองค์ประกอบแม่

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

คำถามที่พบบ่อย

บทเรียน “การหยุดการส่งต่อเหตุการณ์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การหยุดการส่งต่อเหตุการณ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส jQuery Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส jQuery Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การหยุดการส่งต่อเหตุการณ์”

ทำความเข้าใจ .stopPropagation() และ .preventDefault() เพื่อควบคุมการไหลของเหตุการณ์ ป้องกันการทำงานเริ่มต้นของเบราว์เซอร์ และจัดการการโต้ตอบของเหตุการณ์ที่ซับซ้อนได้อย่างมีประสิทธิภาพ คุณปฏิบัติ jQuery Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน jQuery Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน jQuery Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน

บทเรียน “การหยุดการส่งต่อเหตุการณ์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน jQuery Academy นี้ได้ไหม

ได้ บทเรียน jQuery Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การมอบหมายเหตุการณ์อย่างแข็งแกร่ง
  2. การหยุดการส่งต่อเหตุการณ์
  3. การสร้างและเรียกใช้เหตุการณ์แบบกำหนดเอง
← กลับไปที่ jQuery Academy