โดยทั่วไปการทำ bubbling ของเหตุการณ์ทำงานอย่างไรและมีความหมายเหมือนกันกับการเผยแพร่เหตุการณ์


11

ฉันพยายามล้อมรอบงานทั่วไปและหลักการของการจัดกิจกรรมในระบบที่ขับเคลื่อนด้วยเหตุการณ์ (ย่อย)

แม้ว่าฉันจะใช้มันในบางครั้งเช่น Javascript, Flash (Actionscript 2 และ 3) และได้สร้างระบบการส่งเหตุการณ์อย่างง่ายใน PHP สำหรับตัวเองในครั้งเดียวฉันไม่เคยเข้าใจการทำ bubbling และ / หรือ การขยายพันธุ์ที่ดี

คำถามแรก: การ
พ้องเหตุการณ์หมายถึงการเผยแพร่เหตุการณ์หรือไม่

คำถามที่สอง:
ฉันถูกต้องในการทำความเข้าใจของฉันว่าเมื่อเหตุการณ์ "ฟองสบู่" นี้หมายความว่ามันได้รับ "ย้าย" ขึ้นลำดับชั้นของวัตถุ?

คำถามที่สามและสำคัญที่สุด:
หากความเข้าใจในคำถาม 2 ถูกต้อง; สิ่งนี้คือ "การเคลื่อนย้าย" ถึงลำดับชั้นของวัตถุที่นำมาใช้โดยทั่วไป?
โดยทั่วไปแล้วมันหมายความว่าวัตถุแม่ "redispatches" เหตุการณ์เดียวกันกับผู้ปกครองของมัน (จนกว่าจะถึงวัตถุราก)? และถ้าเป็นเช่นนั้น วัตถุเหล่านี้ทั้งหมดในลำดับชั้นจำเป็นต้องฟังลูก ๆ ของพวกเขาสำหรับเหตุการณ์เหล่านี้หรือฉันขาดสิ่งสำคัญในการทำความเข้าใจเกี่ยวกับเหตุการณ์เดือดร้อนซึ่งไม่มีความจำเป็นที่จะต้องให้วัตถุแม่ลงทะเบียนด้วยตนเองในฐานะผู้ฟังเหตุการณ์วัตถุเด็ก

หากคุณสามารถแสดงให้เห็นถึงหลักการพื้นฐานเหล่านี้โดยใช้รหัสหลอกๆบางอย่างฉันจะขอบคุณมาก ๆ


1
บทความที่เกี่ยวข้อง: ลำดับเหตุการณ์
Jonas

คำตอบ:


7

คำถามแรก: การพ้องเหตุการณ์หมายถึงการเผยแพร่เหตุการณ์หรือไม่

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

คำถามที่สอง: ฉันถูกต้องในการทำความเข้าใจของฉันว่าเมื่อเหตุการณ์ "ฟองสบู่" นี้หมายความว่ามันได้รับ "ย้าย" ขึ้นลำดับชั้นของวัตถุ?

ใช่. Bubblingหมายถึงมันขึ้นไปตามลำดับชั้นเมื่อเทียบกับการขุดอุโมงค์ซึ่งหมายความว่ามันมาจากองค์ประกอบด้านบนลงหรือการกำหนดเส้นทางซึ่งหมายความว่าวัตถุถัดไปที่จะได้รับเหตุการณ์สามารถเป็นอะไรก็ได้ที่คุณเลือก

คำถามที่สามและสำคัญที่สุด: หากความเข้าใจในคำถาม 2 ถูกต้อง; สิ่งนี้คือ "การเคลื่อนย้าย" ถึงลำดับชั้นของวัตถุที่นำมาใช้โดยทั่วไป?

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

Pseudo Code เป็นเช่นนี้สำหรับการควบคุม UI:

OnEvent(SomeEvent event)
{
   CallHandlersForEvent(event);
   if(HasParent && event.ContinueBubbling == true)
   {
       Parent.OnEvent(event);
   }
}

เช่นเดียวกับ blueberryfields กล่าวว่ามันไม่จำเป็นต้องเป็นผู้ปกครองโดยตรงที่ได้รับเหตุการณ์ต่อไป คุณสามารถใช้สิ่งนี้เช่นกัน:

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}

+1 รหัสหลอกทำให้ฉันรู้สึกขอบคุณมาก! (เช่นเดียวกับส่วนที่เหลือของคำตอบของคุณตามวิธี.)
Dabbler ที่มีคุณค่า

@fireeyedboy: ไม่เป็นไร =)
Falcon

1

คำตอบแรก:

เหตุการณ์เดือดเป็นอัลกอริทึมเฉพาะหนึ่งแนวทางการเผยแพร่เหตุการณ์

คำตอบที่สอง:

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

คำตอบที่สาม:

รายละเอียดการใช้งานอาจแตกต่างกันมากขึ้นอยู่กับการใช้งาน internals ของแต่ละเบราว์เซอร์ bubblingขั้นตอนวิธีการขึ้นอยู่กับภาพบนหน้าจอ หากองค์ประกอบที่ห่อหุ้มอยู่ในลำดับชั้นการสืบทอดสูงกว่าองค์ประกอบภายในการทำให้เดือดปุดนั้นอาจนำมาใช้โดยใช้กลไกการสืบทอดมาตรฐานในภาษาเช่น แต่นั่นไม่ใช่ความจริง - คุณอาจมีกลไกพิเศษที่สามารถตีความทั้งโครงสร้างภายในและการมองเห็นของพวกเขาบนหน้าจอและเผยแพร่เหตุการณ์ตามอัลกอริทึมขณะที่ไม่สนใจองค์กรภายใน


1
ทำไมคุณพูดว่า: "bubbling ไม่จำเป็นต้องเกี่ยวข้องกับลำดับชั้นใด ๆ " ในความคิดของฉันมันเป็น หากไม่มีลำดับชั้นก็จะไม่มีการเดือดปุด ๆ จะต้องมีต้นไม้บางชนิด คุณสามารถตั้งชื่อตัวอย่างของการเดือดโดยไม่มีโครงสร้างต้นไม้ได้หรือไม่? ตัวอย่างของคุณ "จากองค์ประกอบภายในสุดถึงสุดสุด" เป็นเพียงลำดับชั้นที่มองเห็นได้
Falcon

1
แน่นอนว่าคุณสามารถตีความได้ว่าเป็นลำดับชั้นหากคุณต้องการจริงๆ ฉันชอบคิดว่ามันเป็นกราฟคู่ที่หลวมซึ่งรวมถึงองค์ประกอบที่มองเห็นและองค์ประกอบที่ไม่ได้มองเห็น
blueberryfields

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

ฉันคิดว่าคุณไม่สามารถเรียกมันว่าเดือดในกราฟโดยพลการอีกต่อไป มันจะต้องมีการเรียกว่า "การกำหนดเส้นทางเหตุการณ์" จากนั้น imho
Falcon

1
ฉันเชื่อว่าฟอลคอนทำคะแนนพอใช้ ฟังดูสมเหตุสมผลที่จะคิดว่าเดือดปุด ๆ เป็นสิ่งที่เลื่อนขึ้น (ลำดับชั้น)
Dabbler ที่มีค่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.