ก่อนที่คุณจะอ่านให้ดึงรายการเหตุการณ์นี้ขึ้นมาในอีกหน้าหนึ่ง API นั้นมีประโยชน์อย่างมากและสิ่งที่ฉันกำลังพูดถึงด้านล่างทั้งหมดนั้นเชื่อมโยงโดยตรงจากหน้านี้
อย่างแรก.click(function)
คือทางลัดสำหรับ.bind('click', function)
พวกมันที่เทียบเท่ากัน ใช้พวกมันเมื่อรวมตัวจัดการกับองค์ประกอบโดยตรงเช่นนี้
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
หากองค์ประกอบนี้ถูกแทนที่หรือถูกโยนออกไปตัวจัดการนี้จะไม่อยู่ที่นั่นอีกต่อไป องค์ประกอบที่ไม่ได้อยู่ที่นั่นเมื่อมีการเรียกใช้รหัสนี้เพื่อแนบตัวจัดการ (เช่นตัวเลือกที่พบแล้ว) จะไม่ได้รับตัวจัดการ
.live()
และ.delegate()
มีความเกี่ยวข้องในทำนองเดียวกัน.delegate()
ใช้งานจริง.live()
ภายในพวกเขาทั้งสองฟังเหตุการณ์ที่เกิดฟอง สิ่งนี้ใช้ได้กับองค์ประกอบใหม่และเก่ามันทำให้เหตุการณ์เหมือนกัน คุณใช้สิ่งเหล่านี้เมื่อองค์ประกอบของคุณอาจมีการเปลี่ยนแปลงเช่นการเพิ่มแถวรายการในรายการ ฯลฯ หากคุณไม่มีบรรพบุรุษ / บรรพบุรุษทั่วไปที่จะอยู่ในหน้าและไม่ถูกแทนที่ในทุกจุดใช้.live()
ดังนี้:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
หากคุณมีองค์ประกอบพาเรนต์ที่ไม่ได้ถูกแทนที่ (ดังนั้นตัวจัดการเหตุการณ์จะไม่ลาก่อน) คุณควรจัดการกับองค์ประกอบ.delegate()
ดังนี้:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
สิ่งนี้ใช้งานได้เกือบเหมือนกัน.live()
แต่เหตุการณ์นั้นเกิดฟองสบู่น้อยกว่าครั้งก่อนที่จะถูกจับและตัวจัดการดำเนินการ การใช้งานร่วมกันของทั้งสองอย่างนี้คือการที่คลาสของคุณเปลี่ยนแปลงองค์ประกอบไม่ตรงกับตัวเลือกที่คุณใช้ในตอนแรก ... ด้วยวิธีการเหล่านี้ตัวเลือกจะได้รับการประเมินในเวลาที่เกิดเหตุการณ์หากตรงกับตัวจัดการจะทำงาน .. . ดังนั้นองค์ประกอบไม่ตรงกับตัวเลือกที่สำคัญอีกต่อไปมันจะไม่ทำงานอีกต่อไป .click()
อย่างไรก็ตามด้วยตัวจัดการเหตุการณ์ที่ถูกผูกไว้บนองค์ประกอบ DOM ความจริงที่ว่ามันไม่ตรงกับตัวเลือกใด ๆ ที่ใช้ในการค้นหาว่ามันไม่เกี่ยวข้อง ... เหตุการณ์ถูกผูกไว้และมันจะคงอยู่จนกว่าองค์ประกอบนั้นจะหายไปหรือตัวจัดการ .unbind()
จะถูกลบออกผ่านทาง
อีกหนึ่งการใช้งานทั่วไปสำหรับ.live()
และ.delegate()
เป็นผลการดำเนินงาน หากคุณกำลังจัดการกับองค์ประกอบจำนวนมากการแนบตัวจัดการการคลิกเข้ากับแต่ละองค์ประกอบนั้นมีราคาแพงและใช้เวลานาน ในกรณีเหล่านี้ประหยัดกว่าในการตั้งค่าเครื่องจัดการเครื่องเดียวและปล่อยให้ฟองทำงานดูที่คำถามนี้ซึ่งสร้างความแตกต่างอย่างมากเป็นตัวอย่างที่ดีของแอปพลิเคชัน
การเรียกใช้ - สำหรับคำถามที่อัปเดต
มี 2 ฟังก์ชั่นจัดการเหตุการณ์วิกฤติหลักที่มีอยู่ให้พวกเขาตกอยู่ภายใต้เดียวกัน "สิ่งที่แนบมาจัดการเหตุการณ์" ในหมวดหมู่ของ APIเหล่านี้เป็นและ .trigger()
มีทางลัดในตัวสำหรับเหตุการณ์ทั่วไปตัวอย่างเช่น.triggerHandler()
.trigger('eventName')
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
คุณสามารถดูรายชื่อรวมทั้งทางลัดเหล่านี้ที่นี่
สำหรับความแตกต่าง.trigger()
ทริกเกอร์ตัวจัดการเหตุการณ์ (แต่ไม่ใช่การกระทำเริ่มต้นเกือบตลอดเวลาเช่นวางเคอร์เซอร์ที่จุดที่ถูกต้องในคลิก<textarea>
) มันทำให้ตัวจัดการเหตุการณ์เกิดขึ้นในลำดับที่ถูกผูกไว้ (ตามที่เป็นเหตุการณ์ดั้งเดิม), ไฟการกระทำเหตุการณ์พื้นเมืองและฟองขึ้น DOM
.triggerHandler()
โดยทั่วไปแล้วจะใช้เพื่อจุดประสงค์ที่แตกต่างกันที่นี่คุณเพียงแค่พยายามยิงตัวจัดการที่ถูกผูกไว้มันไม่ทำให้เกิดเหตุการณ์แบบดั้งเดิมที่จะยิงเช่นส่งแบบฟอร์ม มันไม่ทำให้ฟอง DOM และไม่สามารถโยงได้ (จะส่งคืนสิ่งที่ตัวจัดการเหตุการณ์ที่ถูกผูกไว้ล่าสุดสำหรับเหตุการณ์นั้นส่งคืน) ตัวอย่างเช่นถ้าคุณต้องการที่จะทริกเกอร์focus
เหตุการณ์ แต่ไม่ได้มุ่งเน้นวัตถุจริงๆคุณเพียงแค่ต้องการให้รหัสที่คุณผูกไว้กับ.focus(fn)
การทำงานนี้จะทำเช่นนั้นในขณะที่.trigger()
จะทำเช่นนั้นเช่นเดียวกับเน้นองค์ประกอบและฟองขึ้น
นี่คือตัวอย่างโลกแห่งความจริง:
$("form").submit(); //actually calling `.trigger('submit');`
นี้จะทำงานใด ๆ ที่ส่งรถยกตัวอย่างเช่นjQuery ตรวจสอบปลั๊กอิน<form>
แล้วพยายามที่จะส่ง แต่ถ้าคุณเพียงต้องการที่จะตรวจสอบเนื่องจากมันติดยาเสพติดผ่านทางsubmit
จัดการเหตุการณ์ แต่ไม่ได้ส่ง<form>
หลังจากนั้นคุณสามารถใช้.triggerHandler('submit')
เช่นนี้
$("form").triggerHandler('submit');
ปลั๊กอินป้องกันตัวจัดการจากการส่งแบบฟอร์มโดยการระเบิดถ้าการตรวจสอบการตรวจสอบไม่ผ่าน แต่ด้วยวิธีนี้เราไม่สนใจสิ่งที่มันทำ ไม่ว่าจะเป็นการยกเลิกหรือไม่เราไม่ได้พยายามส่งแบบฟอร์มเราเพียงต้องการทริกเกอร์แบบฟอร์มเพื่อตรวจสอบความถูกต้องอีกครั้งและไม่ทำอะไรเลย ( ข้อจำกัดความรับผิดชอบ:นี่เป็นตัวอย่างที่ไม่จำเป็นเนื่องจากมี.validate()
วิธีการในปลั๊กอิน แต่เป็นตัวอย่างที่ดีของเจตนา)