Bagaimana cara menggelembungkan acara secara umum bekerja dan apakah ini sama dengan propagasi acara?

11

Saya mencoba untuk membungkus kepala saya di sekitar pekerjaan umum dan prinsip-prinsip pengiriman acara dalam sistem (sub-) yang didorong oleh peristiwa.

Meskipun saya telah menggunakannya pada beberapa kesempatan misalnya Javascript, Flash (Actionscript 2 dan 3) dan bahkan telah membuat sistem pengiriman acara sederhana dalam PHP untuk saya sendiri pada suatu waktu, saya tidak pernah benar-benar mengerti acara yang menggelegak dan / atau propagasi dengan baik.

Pertanyaan pertama:
Apakah sinonim peristiwa menggelembung untuk propagasi acara?

Pertanyaan kedua:
Apakah saya benar dalam pemahaman saya bahwa ketika suatu peristiwa "menggelembung", ini berarti bahwa ia "naik" ke atas hierarki objek?

Pertanyaan ketiga dan paling penting:
Jika pemahaman saya dalam pertanyaan 2 benar; bagaimana "memindahkan" hierarki objek-objek ini secara umum diimplementasikan?
Apakah itu umumnya berarti bahwa orangtua objek "redispatches" acara yang sama untuk yang tua (sampai mencapai obyek root)? Dan jika demikian; apakah semua objek dalam hierarki perlu mendengarkan anak-anak mereka untuk acara ini, atau apakah saya kehilangan sesuatu yang penting dalam pemahaman saya tentang peristiwa yang menggelegak, di mana tidak perlu membiarkan objek orangtua mendaftarkan diri mereka sebagai pendengar peristiwa objek anak?

Jika Anda bisa mengilustrasikan prinsip-prinsip dasar ini dengan menggunakan beberapa kode pseudo sederhana, saya akan sangat berterima kasih.

Dabbler yang Layak
sumber
1
Artikel terkait: Urutan acara
Jonas

Jawaban:

7

Pertanyaan pertama: Apakah sinonim peristiwa menggelembung untuk propagasi acara?

Tidak. Bubbling adalah bentuk propagasi acara, tetapi tidak dapat digunakan sebagai sinonim. Propagasi adalah istilah umum untuk melewati suatu peristiwa. Bubbling adalah strategi spesifik propagasi acara.

Pertanyaan kedua: Apakah saya benar dalam pemahaman saya bahwa ketika suatu peristiwa "menggelembung", ini berarti bahwa ia "naik" ke atas hierarki objek?

Iya. Bubbling berarti naik hierarki, tidak seperti tunneling , yang berarti naik dari elemen atas ke bawah atau routing , yang berarti objek berikutnya untuk menerima acara dapat berupa apa pun yang Anda pilih.

Pertanyaan ketiga dan paling penting: Jika pemahaman saya dalam pertanyaan 2 benar; bagaimana "memindahkan" hierarki objek-objek ini secara umum diimplementasikan?

Sangat mudah. Dalam hierarki visual Anda kontrol memiliki referensi ke orang tua mereka / visual tingkat atas mereka atau bisa mendapatkannya di suatu tempat. Jadi ketika mereka menangkap suatu peristiwa, mereka hanya memberi tahu orang tuanya tentang hal itu, yang memberi tahu orang tuanya tentang hal itu dll.

Kode semu seperti ini untuk kontrol UI apa pun:

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

Seperti yang dikatakan blueberryfields, orang tua tidak langsung yang menerima acara tersebut. Anda dapat menerapkan seperti ini juga:

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}
Elang
sumber
+1 Kode semu sangat masuk akal bagi saya, terima kasih! (Seperti halnya sisa jawaban Anda, omong-omong.)
Decent Dabbler
@fireeyedboy: Sama-sama =)
Falcon
1

Jawaban pertama:

Gelembung peristiwa adalah salah satu algoritma spesifik yang membimbing perambatan acara.

Jawaban kedua:

Tidak, menggelegak tidak selalu terkait dengan hierarki apa pun. Bagaimana objek diwakili secara internal atau di tempat lain tidak masalah bagi algoritma untuk bekerja dengan baik. Idealnya, ketika suatu peristiwa meletup, ia mengembang ke luar dari elemen yang terlihat paling dalam di layar, hingga ke elemen yang terlihat paling luar di layar.

Jawaban ketiga:

Detail implementasi dapat sangat bervariasi tergantung pada bagaimana internal masing-masing (browser) diimplementasikan. The bubblingalgoritma tergantung pada visual di layar. Jika elemen enkapsulasi lebih tinggi pada hierarki warisan daripada elemen dalam, gelembung mungkin diimplementasikan menggunakan mekanisme pewarisan standar dalam bahasa, misalnya. Tapi itu belum tentu benar - Anda mungkin memiliki mekanisme khusus yang dapat menafsirkan struktur internal dan visibilitasnya di layar, dan menyebarkan peristiwa sesuai dengan algoritma sementara mengabaikan organisasi internal.

blueberryfields
sumber
1
Mengapa Anda mengatakan: "gelembung tidak selalu terkait dengan hierarki apa pun". Menurut saya itu. Tanpa hierarki, tidak ada gelembung. Pasti ada semacam pohon. Bisakah Anda menyebutkan contoh penggelembungan tanpa struktur pohon? Contoh Anda "dari elemen paling dalam hingga terluar yang terlihat" hanyalah itu - hierarki visual.
Falcon
1
Tentu, Anda dapat menafsirkannya sebagai hierarki jika Anda benar - benar menginginkannya. Saya lebih suka menganggapnya sebagai grafik yang digabungkan secara longgar, yang mencakup beberapa elemen visual dan non-visual.
blueberryfields
2
Tapi kemudian analogi yang menggelegak itu gagal. Karena dalam sebuah grafik, peristiwa tersebut dapat dialihkan ke mana saja, sementara gelembung bergelembung dengan jelas dari bawah ke atas.
Falcon
Saya pikir Anda tidak bisa menyebutnya menggelegak dalam grafik yang sewenang-wenang lagi. Itu harus disebut "event routing" lalu imho.
Falcon
1
Saya percaya Falcon membuat beberapa poin yang adil. Kedengarannya masuk akal untuk menganggap menggelegak sebagai sesuatu yang bergerak naik (hierarki).
Decent Dabbler