jQuery clone () ไม่โคลนการเชื่อมโยงเหตุการณ์แม้จะเปิด ()


100

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

ฉันใช้.clone()กับองค์ประกอบบางอย่างภายใน DOM ซึ่งมีปุ่ม ปุ่มนี้มีเหตุการณ์ที่กำหนดเองบางส่วนผูกไว้ (เหตุการณ์ถูกผูกไว้โดยใช้.on()) แต่ น่าเสียดายที่เมื่อฉันใช้ jQuery .clone()การเชื่อมโยงจะไม่ถูกเก็บรักษาไว้และฉันต้องเพิ่มอีกครั้ง

มีใครเคยเจอสิ่งนี้มาก่อนมีใครรู้บ้างไหมว่ามีวิธีแก้ปัญหา ฉันคิดว่าการใช้.on()ควรจะรักษาการเชื่อมโยงสำหรับองค์ประกอบที่มีอยู่ในตอนนี้หรือในอนาคต?


"ฉันคิดว่าการใช้. on () ควรจะรักษาการเชื่อมโยงสำหรับองค์ประกอบที่มีอยู่ในตอนนี้หรือในอนาคต" - นี่มีน้อยจะทำอย่างไรกับ.clone; มันเป็นตรรกะคณะผู้แทนเหตุการณ์ของ jQuery .onและผลงานถ้าคุณผ่านตัวเลือกเพิ่มเติมในการ
pimvdb

คำตอบ:


214

ฉันคิดว่าคุณควรใช้เมธอด. clone () ที่มากเกินไป:

$element.clone(true, true);

โคลน ([withDataAndEvents] [, deepWithDataAndEvents])

withDataAndEvents : บูลีนที่ระบุว่าควรคัดลอกตัวจัดการเหตุการณ์และข้อมูลพร้อมกับองค์ประกอบหรือไม่ ค่าเริ่มต้นเป็นเท็จ

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


ระวัง.on()ว่าไม่ได้ผูกเหตุการณ์กับเป้าหมาย แต่เป็นองค์ประกอบที่คุณกำลังมอบหมายให้ ดังนั้นหากคุณมี:

$('#container').on('click', '.button', ...);

เหตุการณ์ที่เกิดขึ้นจะ binded #containerจริง เมื่อเกิดการคลิกที่.buttonองค์ประกอบองค์ประกอบนั้นจะปรากฏขึ้นตาม#containerองค์ประกอบองค์ประกอบที่เรียกเหตุการณ์จะได้รับการประเมินตามพารามิเตอร์ตัวเลือก.on()และหากตรงกันตัวจัดการเหตุการณ์จะดำเนินการ นี่คือวิธีการทำงานของการมอบหมายงาน

หากคุณโคลนองค์ประกอบ #container คุณต้องโคลนลึกด้วยเหตุการณ์และข้อมูลสำหรับการเชื่อมโยงที่สร้างขึ้นด้วย.on()เพื่อรักษาไว้

สิ่งนี้ไม่จำเป็นหากคุณใช้.on()กับผู้ปกครองของ#container.


21
ไม่เคยรู้.clone()ข้อโต้แย้งที่ยอมรับ FML. ขอบคุณสำหรับความช่วยเหลือของคุณ.
BenM

1
@DidierGhys ขอบคุณฉันดิ้นรนกับการ.clone()ไม่โคลน.data()(ทั้งสองอย่างdata-xxxx="somedata"และข้อมูลใน DOM) .. นี่ก็แก้ไขได้เช่นกัน!
Richard de Wit

ฉันถามคำถามนี้แต่ไม่มีใครตอบฉัน คุณสามารถช่วยฉันได้ไหม?
Ali Soltani

ยอดเยี่ยมฉันต้องสร้าง clickเหตุการณ์เพื่อต่อท้าย div ที่โคลนใหม่ readyไม่ทำงาน
csandreas1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.